为什么要避免this.setState(this.state)?

时间:2018-06-04 04:25:24

标签: reactjs

在React中,我尝试了两种方法:

  • 更改状态,然后更改this.setState(this.state)
  • 克隆状态,更改状态克隆,然后更改this.setState(stateClone)

他们都工作,都产生相同的结果。为什么(在文档中)建议设置为状态克隆(使用Object.assign)而不是设置为状态本身?在React(没有Redux)中,状态的对象标识是否重要?看起来只要你调用setState,无论状态对象的身份如何,render()都会被触发。

2 个答案:

答案 0 :(得分:4)

当我们说

时,Javascript对象和数组通过引用而不是值传递

stateClone = this.state

我们没有制作状态对象的副本,我们只是创建对同一对象(this.state)的新引用。现在,如果我们对stateClone进行任何更改,如

stateClone.someProp = someValue

我们实际上直接改变了原始状态,这是禁止的,因为这种方式的突变可能会在下一次setState调用时被覆盖。

这就是为什么,Object.assignspread operator (...)用于创建状态对象的副本,并对该副本进行更改。

更多信息:https://medium.com/pro-react/a-brief-talk-about-immutability-and-react-s-helpers-70919ab8ae7c

答案 1 :(得分:0)

如果您设置的对象与当前状态具有相同的引用,则setState不关心。将以任一方式调用render()。

不可变性仅适用于使用shouldComponentUpdate生命周期方法进行优化的上下文中的浅层检查(使用===比较之前和之后),默认情况下返回true。