在React中,我尝试了两种方法:
更改状态然后this.setState(this.state)
克隆状态,更改状态克隆,然后是this.setState(stateClone)
他们都工作,都产生相同的结果 . 为什么(在文档中)建议设置为状态克隆(使用Object.assign)而不是设置为状态本身?在React(没有Redux)中,状态的对象标识是否重要?看起来只要你调用setState,无论状态对象标识如何,render()都会被触发 .
我们说,Javascript对象和数组是通过引用而不是值传递的
stateClone = this.state
我们没有复制状态对象,我们只是创建一个对同一对象的新引用(this.state) . 现在,如果我们对stateClone进行任何更改,就像
stateClone.someProp = someValue
我们实际上是直接改变了原始状态,这是禁止的,因为这种方式的突变可能会在下一个 setState 调用时被覆盖 .
setState
这就是为什么, Object.assign 或 spread operator (...) 用于创建状态对象的副本,并对该副本进行更改 .
Object.assign
spread operator (...)
更多信息:https://medium.com/pro-react/a-brief-talk-about-immutability-and-react-s-helpers-70919ab8ae7c
setState不关心您设置的对象是否与当前状态具有相同的引用 . render()将以任一方式调用 .
不变性仅适用于使用shouldComponentUpdate生命周期方法进行优化的上下文中的浅层检查(使用===比较之前和之后),默认情况下返回true .
2 回答
我们说,Javascript对象和数组是通过引用而不是值传递的
stateClone = this.state
我们没有复制状态对象,我们只是创建一个对同一对象的新引用(this.state) . 现在,如果我们对stateClone进行任何更改,就像
stateClone.someProp = someValue
我们实际上是直接改变了原始状态,这是禁止的,因为这种方式的突变可能会在下一个
setState
调用时被覆盖 .这就是为什么,
Object.assign
或spread operator (...)
用于创建状态对象的副本,并对该副本进行更改 .更多信息:https://medium.com/pro-react/a-brief-talk-about-immutability-and-react-s-helpers-70919ab8ae7c
setState不关心您设置的对象是否与当前状态具有相同的引用 . render()将以任一方式调用 .
不变性仅适用于使用shouldComponentUpdate生命周期方法进行优化的上下文中的浅层检查(使用===比较之前和之后),默认情况下返回true .