状态的浅表副本是否会产生错误?

时间:2019-02-18 13:21:11

标签: reactjs deep-copy shallow-copy

更新状态属性而不复制它并使用string str = "75,75,83,84"; string[] strarray = str.Split(','); string newValue = ""; foreach (var item in strarray) { if (!newValue.Contains(item)) { newValue = (newValue == "") ? item : newValue + ", " + item; } } 可能导致错误,如this article所述。我想知道的是,如果我有这样的状态的对象列表:

setState()

如果我仅用像这样的浅表副本进行更新,就会引起错误:

this.state = {
  myList: [
    {name: "Nestor"},
    {name: "Rufus"}
  ]
};

还是我必须做一个深层复制才能绝对确定不会有错误?

let list = [...this.state.myList];
//I modify the list here
this.setState({myList: list});

谢谢您的帮助。

1 个答案:

答案 0 :(得分:1)

这取决于您的用例。

大多数时候,您可以摆脱浅表副本。

但是如果由于某种原因,您传递的道具(或状态)需要进行深度比较,那么您将不得不求助于react-fast-compare之类的库。

使用浅表复制不会引入任何错误,最糟糕的是,某些组件将无法正确重新呈现。

您可能想阅读以下内容:

https://daveceddia.com/react-redux-immutability-guide/

https://github.com/FormidableLabs/react-fast-compare