在React中,我尝试了两种方法:
他们都工作,都产生相同的结果。为什么(在文档中)建议设置为状态克隆(使用Object.assign)而不是设置为状态本身?在React(没有Redux)中,状态的对象标识是否重要?看起来只要你调用setState,无论状态对象的身份如何,render()都会被触发。
答案 0 :(得分:4)
当我们说
时,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
答案 1 :(得分:0)
如果您设置的对象与当前状态具有相同的引用,则setState不关心。将以任一方式调用render()。
不可变性仅适用于使用shouldComponentUpdate生命周期方法进行优化的上下文中的浅层检查(使用===比较之前和之后),默认情况下返回true。