Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在React中克隆整个state对象会导致副作用吗?_Javascript_Reactjs - Fatal编程技术网

Javascript 在React中克隆整个state对象会导致副作用吗?

Javascript 在React中克隆整个state对象会导致副作用吗?,javascript,reactjs,Javascript,Reactjs,我经常在我工作的React代码库中看到这样的代码,感觉它会导致bug,但我只是在猜测 代码示例: const newState=Object.assign({},{},this.state); newState.x='123'; newState.collection.push('abc'); this.setState(newState); 与以下代码相比,该代码是否会导致副作用、性能更差,或者只是很好 this.setState(prevState=>({ const collection

我经常在我工作的React代码库中看到这样的代码,感觉它会导致bug,但我只是在猜测

代码示例:

const newState=Object.assign({},{},this.state);
newState.x='123';
newState.collection.push('abc');
this.setState(newState);
与以下代码相比,该代码是否会导致副作用、性能更差,或者只是很好

this.setState(prevState=>({
const collection=prevState.collection.slice();
集合。推送(“abc”);
返回{
x:'123',
收藏:收藏
}));

是,如果存在嵌套对象或数组,这将改变状态,因为
Object.assign()
生成浅拷贝。因此,行:

newState.collection.push('abc');

实际上是在状态下对集合数组进行变异,如果你的应用程序增长,可能会导致一些讨厌的和意外的错误。哦,伙计。刚刚在控制台中进行了测试,很明显这是真的。我仍然很好奇,是否有其他原因不设置你没有更改的属性,因为我可以看到参数变为“哦,谢谢,我们将使用此深度克隆方法”这不是关于克隆或复制,而是关于我们对数据/状态所做的更改的明确说明,以便了解所做的更改以及UI的哪些部分需要重新渲染。明确说明确实在性能和优化方面对我们有好处。with
state.collections.push()
collections数组的引用与更改前相同,因此React现在不知道状态是否有任何更改,也不会反映在我们的UI中。因此,无论状态发生任何更改,我们都会返回新状态并应用更改,无论是对象还是数组。始终创建一个新状态。在React中找到另一个原因文档。更新是合并的。因此,如果复制整个状态并将其传递回setState,合并将无法工作。它将替换整个状态是的,这里有一篇关于它的好文章: