React的setState(),嵌套结构的数据变异,为什么不直接修改state呢?

jhe*_*dus 5 reactjs

下面的反应代码是错误的吗?

state={ foo: { bar: true } }  // line 1
setState(state)               // line 2   
state.foo.bar = false         // line 3
setState(state)               // line 4
Run Code Online (Sandbox Code Playgroud)

如果是,为什么?

表明它是错误的,但没有解释为什么?

我认为这并没有错,原因如下:

  • line 2 vdom1创建
  • line 4 vdom2创建
  • vdom1vdom2进行比较
  • 差异被传播到实际的 DOM

如果是这种情况,那么 处state的突变line3不应对 处发生的情况产生任何影响line4

换句话说:

这应该是等效的代码:

state={ foo: { bar: true } }  // line 1
setState(state)               // line 2   
state={ foo: { bar: false } } // line 3
setState(state)               // line 4
Run Code Online (Sandbox Code Playgroud)

这段代码与上面的代码等效吗?

如果没有,为什么不呢?

Dav*_*yon 4

创建状态的不可变克隆是一个好主意,因为为了优化渲染而比较状态更改的方式。

在生命周期方法中,如shouldComponentUpdate,nextProps被传入并可以与 进行比较this.props

如果您直接改变状态,则nextProps.prop1this.props.prop1将始终相同,因此您可能无法获得预期的行为。

我确信还有其他原因,但这一个似乎是最直接的原因。

  • 还有其他生命周期方法也可用于比较 props(例如“componentWillReceiveProps”、“componentWillUpdate”和“componentDidUpdate”)。应该注意的是,您*现在*可能不会使用这些,但当事情变得缓慢时想要*稍后*使用。 (2认同)