首页 文章

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

提问于
浏览
0

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

  • 更改状态然后this.setState(this.state)

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

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

2 回答

  • 3

    我们说,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

  • 0

    setState不关心您设置的对象是否与当前状态具有相同的引用 . render()将以任一方式调用 .

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

相关问题