我正在开发一个 React 应用程序,偶然发现了 React 状态的这种行为,我不确定它是否正确!?
我这样启动我的状态:
componentDidMount() {
someRequest()
.then(...) //do stuff to get the Payload of the Response
.then(response => {
this.setState({
obj1: response,
obj2: response.someArr
})
})
}
我有一个表单处理程序可以更改 obj2 的状态
formHandler = event => {
...
this.setState({obj2: newArrState})
}
我一直假设 React 状态是不可变的,因此 obj2 在 setState()
调用后保留对新对象/数组的新引用。
但是,如果我看一下this.state.obj1
我还会看到传播到this.state.obj1.someArr
的变化,以便this.state.obj1.someArr === this.state.obj2
这是正确的行为吗?
React
不会对你的状态强制实施不可变性。事实上,你可以(但你绝对不应该(直接修改它。
由您(开发人员(来强制对数据实施不可变性,要么使用根本无法修改的数据结构(例如imuutable.js(,要么使用其他方式。
是的,这是一个正确的行为。应该保持 React 状态,就好像它是不可变的一样,因为任何更改的值都将被下一个 setState 调用覆盖。
来自 React 文档:
切勿直接更改 this.state,因为之后调用 setState(( 可能会替换您所做的更改。将 this.state 视为不可变的。
https://reactjs.org/docs/react-component.html#state