对象分配和传播运算符会改变React状态吗?

Lê *_*Bảo 4 javascript ecmascript-6 reactjs mutate

我想知道是否做错了什么,因为据我所知:Object.assign和spread运算符将创建新对象,因此我们可以避免使用内部状态进行突变是一种不好的做法。但是在我的项目中,这两个似乎不起作用。

首先,在我的构造函数中,将状态设置如下:

this.state = {
  article: {
    title: "",
    alias: "",
    category: "JAVA",
    steps: [
      {
        stepId: 1,
        title: "Dummy title",
        description: "The quick brown fox jump over the lazy dog",
        length: 30
      }
    ]
  },
  description: "",
  newStep: {
    title: "",
    length: 0
  }
}
Run Code Online (Sandbox Code Playgroud)

稍后,我添加一个addStep()函数:

addStep() {

  console.log(this.state.article.steps);

  let article = { ...this.state.article };

  article.steps.push({
    stepId: _.last(this.state.article.steps).stepId + 1,
    title: this.state.newStep.title,
    length: this.state.newStep.length,
    description: "",
  });

  console.log(this.state.article.steps);
}
Run Code Online (Sandbox Code Playgroud)

结果如下: 在此处输入图片说明

如您所见,this.state.article.steps已被更改。Object.assign也是如此。最终我决定使用,这解决了我的问题。

let article = JSON.parse(JSON.stringify(this.state.article));
Run Code Online (Sandbox Code Playgroud)

结果: 在此处输入图片说明

小智 5

Object.assign{} 并且对象传播不会深度克隆对象。

它将变异 steps

在以下线程中讨论:

如何正确克隆JavaScript对象?