反应状态真的不可变吗?



我正在开发一个 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

最新更新