Хм, так что вы используете одно состояние для всех компонентов, каждый раз, когда вы устанавливаете состояние, к которому оно будет адресовано, clicked
, которое используется в this.state.clicked ?
Чтобы исправить это, вы должны поддерживать отдельные состояния для каждогокнопка.
Чтобы это исправить, нужно сделать что-то вроде этого
class Projects extends Component{
constructor(props){
super(props);
this.state={
projects:[
{
id:1,
title:'Calculator',
description:'A Simple Javascript Calculator application'
},
{
id:2,
title:'ColorGuess',
description:'A Javascript application'
},
{
id:3,
title:'GamesDB',
description:'A React application',
},
],
clicked:false
}
this.toggle = this.toggle.bind(this)
}
toggle = (index) => {
const { projects } = this.state;
const update = projects.map((item, key) => {
return index === key ? {
...item,
clicked: !item.clicked
} : {
...item,
};
});
this.setState({
projects: update
});
}
render(){
const { projects } = this.state;
const renderButtons = projects.map( (project, i) => {
return(
<div key={i} style={{width:'40%'}}>
<div className="card">
{project.title}
<hr/>
Description : {project.description} <br/>
<button onClick={(i) => this.toggle(i)}>
{project.clicked ? <i class="fas fa-chevron-down"></i> : <i class="fas fa-chevron-up"></i>}
</button>
</div>
</div>
);
})
return(
<div>
<h2>My Projects</h2>
<div className="d-flex flex-wrap justify-content-center">
{renderButtons}
</div>
</div>
);
}
}