Я создаю простое приложение TODO в React. У меня есть массив todos
в состоянии, и каждый todo
имеет флаг completed
. При нажатии на элемент я хочу установить флаг completed
для этого todo
. Вот что я сделал до сих пор:
Todos.js
class Todos extends React.Component {
constructor() {
super();
this.state = {
todos: [
{ id:0, title:"Title 0", completed:false },
{ id:1, title:"Title 1", completed:true }
]
};
this.onTodoClicked = this.onTodoClicked.bind(this);
}
onTodoClicked(id) {
console.log(id + " clicked");
this.setState(prevState => {
todos: prevState.todos.map((item, index) => {
return index !== id ? item : { ...item, completed: !item.completed };
});
});
}
render() {
return (
<div>
{this.state.todos.map((todoItem, key) => (
<Todo id={key} key={key} todo={todoItem}
todoClicked={this.onTodoClicked} />
))}
</div>
);
}
}
Todo.js - это простой компонент (да,она также может быть функциональной)
class Todo extends React.Component {
render() {
return (
<div onClick={() => this.props.todoClicked(this.props.id)}>
{this.props.todo.title}
</div>
);
}
}
В Todos.js вызывается функция onTodoClicked
, которая выводит правильный идентификатор, но в состоянии больше ничего не меняется (Iпроверял выбранный объект как с помощью инструментов React dev, так и console.log. Выбранный элемент не меняет свой флаг completed
. Что я делаю не так?