我正在尝试更新存储在数组中的对象的属性。
我的州看起来像这样:
state = {
todos: [
{
id: '1',
title: 'first item,
completed: false
},
{
id: '2',
title: 'second item,
completed: false
}
],
}
我要做的是访问'todos'数组中的第二个元素,并将completed属性更新为false - >是真还是真 - >假的。
我有一个带有更新处理程序的按钮,我的更新类方法如下所示:
onUpdate = (id) => {
const { todos } = this.state;
let i = todos.findIndex(todo => todo.id === id);
let status = todos[i].completed
let updatedTodo = {
...todos[i],
completed: !status
}
this.setState({
todos: [
...todos.slice(0, i),
updatedTodo,
...todos.slice(i + 1)
]
});
}
虽然这确实有效,但我想知道是否有更简洁的方法来实现相同的结果;我试图使用Object.assign(),但这没有用,因为我的'todos'是一个数组,而不是一个对象。请用更好的代码来启发我!
答案 0 :(得分:1)
您只需从todos
复制state
,然后进行修改,然后将其重新发送回state
onUpdate = (id) => {
var todos = [...this.state.todos]
var target = todos.find(todo => todo.id == id)
if (target) {
target.completed = !target.completed
this.setState({ todos })
}
}
答案 1 :(得分:1)
最好使用update function来确保您不会处理过时的数据:
onUpdate = (id) => {
this.setState(prevState => {
const copy = [...prevState.todos];
const index = copy.findIndex(t => t.id === id);
copy[index].completed = !copy[index].completed;
return { todos: copy }
})
}