Сначала, пожалуйста, посмотрите на картинку, чтобы понять, что происходит.
Проблема заключается в том, что при отмеченном флажке затем стирание текста, но я хочу обновить поле состояния из массива состояний, а функции приведены ниже.
state = {
items: [
{ id: 1, text: 'Buy milk', done: true },
{ id: 2, text: 'Deed cat', done: false },
{ id: 3, text: 'Wash floor', done: false }
]
};
markItemDone = (i) => {
this.setState(state => {
const items = state.items.map((item) => {
if (item.id === i){
return item.done = true;
} else {
return item;
}
});
return {
items,
};
});
}
JSX:
<input
type = "checkbox"
onClick = {() => this.markItemDone(item.id)}
defaultChecked = {item.done ? true : null}
/>
Я не нахожу реального решения.
Спасибо



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


В вашем коде вы говорите return item.done = true;. Это возвращает логическое значение вместо объекта элемента, и поэтому вы видите 1: true на своем снимке экрана. Вместо этого вы хотите что-то вроде этого:
if (item.id === i){
return {
...item,
done: true,
};
} else {
return item;
}
Это создаст копию исходного объекта элемента, установит для его поля done значение true и вернет новый элемент.
Эта строка в обратном вызове map:
return item.done = true;
сопоставит item с undefined для item, где id === i. Попробуйте изменить обратный вызов map, как показано ниже:
const items = state.items.map((item) => {
/* Return copy of item. If id === item.id, add done : true to
mapped result. For all other cases, ensure done is undefined */
return { ...item, done : id === item.id ? true : undefined };
});
@JKillian согласился
Вероятно, было бы целесообразно не мутировать
itemнапрямую здесь.