【问题标题】:Object assign and spread operator mutate React state?对象分配和传播运算符改变 React 状态?
【发布时间】:2018-01-17 05:18:04
【问题描述】:

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

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

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));

结果:

【问题讨论】:

    标签: javascript reactjs ecmascript-6


    【解决方案1】:

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

    它会变异 steps

    在下面的帖子中讨论:

    How do I correctly clone a JavaScript object?

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 2021-11-07
          • 1970-01-01
          • 2023-01-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-09-25
          • 2019-09-01
          相关资源
          最近更新 更多