反应状态真的是一成不变的吗?

时间:2019-03-29 12:43:18

标签: reactjs state immutability

我正在开发一个React App,偶然发现了React状态的这种行为,我不确定它是否正确!?

我这样启动我的国家:

componentDidMount() {
someRequest()
   .then(...) //do stuff to get the Payload of the Response
   .then(response => {
      this.setState({
         obj1: response,
         obj2: response.someArr
      })
    })
}

我有一个可以更改obj2状态的formHandler

formHandler = event => {
   ...
   this.setState({obj2: newArrState})
}

我一直认为React状态是不可变的,因此obj2在setState()调用之后拥有对新对象/数组的新引用。

但是,如果我看看this.state.obj1,我也会看到更改传播到this.state.obj1.someArr,因此this.state.obj1.someArr === this.state.obj2

这是正确的行为吗?

2 个答案:

答案 0 :(得分:2)

React不会对您的州强制实施不变性。实际上,您可以(但是您absolutely should not)直接对其进行修改。
由开发人员来决定是通过使用无法修改的数据结构(例如imuutable.js)或其他方式对数据实施不可变性。

答案 1 :(得分:1)

是的,这是正确的行为。应该将React状态保持不变,因为任何更改的值都将被下一个setState调用覆盖。

从React文档中:

  

请不要直接更改this.state,因为之后调用setState()可能会替换您所做的更改。将此this.state视为不可变。

https://reactjs.org/docs/react-component.html#state