繁体   English   中英

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

[英]Object assign and spread operator mutate React state?

我想知道我是否做错了什么,因为据我所知: 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
  }
}

后来,我添加了一个 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);
}

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

如您所见, this.state.article.steps已发生变异。 Object.assign 也是如此。 最后我决定使用,这解决了我的问题。

let article = JSON.parse(JSON.stringify(this.state.article));

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

Object.assign{}和 object spread 不会深度克隆对象。

它会改变steps

它在以下线程中讨论:

如何正确克隆 JavaScript 对象?

let article = { ...this.state.article }; 只是制作对象的浅拷贝。 您可以使用以下内容手动制作新的子键:

let article = {
  ...this.state.article,
  steps: [...this.state.article.steps]
};

有很多方法可以处理试图克隆深度嵌套对象的问题。 这只是其中之一。

您可以传播原始状态this.state.article并用另一个传播覆盖嵌套值(如steps )。

let article = {
  ...this.state.article,
  steps: [...this.state.article.steps]
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM