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

标签 javascript reactjs ecmascript-6

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

结果如下: enter image description here

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

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

结果: enter image description here

最佳答案

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

它将变异 steps

它在以下线程中讨论:

How do I correctly clone a JavaScript object?

关于javascript - 对象分配和传播运算符会改变 React 状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48294048/

相关文章:

javascript - 将类属性的引用传递给 addEventListener

javascript - 在我的特定 PHP 代码中处理 slider 标签

javascript - 是否可以找到元素的父元素然后导航 DOM?

javascript - 当我使用 setTimeout 设置状态时,如何重新渲染 react 组件?

javascript - 我们如何在 readline.on 函数下使用 promise on (Node.js 8. Currently)

javascript - 导入对象未定义

javascript - CKEditor div 元素被替换而不是填充

javascript - ReactJS:将index.js转换为index.tsx - 找不到模块:错误:无法解析 './App'

css - 在 ReactJs 组件中使用 AnimateCSS

javascript - 如何在 React setState 中使用方括号?