【发布时间】:2020-09-19 17:43:34
【问题描述】:
例如,我们有一个像这样定义的状态,它有一些待办事项,如果这些待办事项已完成,我们想更改该待办事项的完成
this.state = {
// store an array of todo objects
todos: [
{ task: 'do the dishes', done: false, id: 1 },
{ task: 'vacuum the floor', done: true, id: 2 }
]
};
为此,我们可以做到这一点。
const theTodo = this.state.todos.find(t => t.id === id);
theTodo.done = true; // NOOOOO
this.setState({
todos: this.state.todos
});
}
但我有点困惑,数组上的 find 方法将返回与其中条件匹配的元素,我们将其存储在不同的变量中,然后访问完成以将其更改为 true。 但是,我们仍然没有更改原始状态值,因为这是一个副本。
那我们怎么可以用这个来保存呢?
this.setState({
todos: this.state.todos // bad
});
【问题讨论】:
-
仅仅因为你“将它存储在不同的变量中”,并不意味着它是一个不同的对象,它仍然引用同一个对象。此外,没有什么可以阻止您执行
this.setState({ this.state.todos }),但是,这是一种不好的做法,您不应该更改您的state属性(您的todos数组,而不是存储在该数组中的objects)。您正在做的事情现在可能有效,但将来可能会中断,因为React无法正确处理此类用例。
标签: javascript arrays reactjs react-state-management