ES6:具有和不具有扩展的React破坏不可变状态

时间:2018-08-18 06:04:48

标签: javascript reactjs react-native ecmascript-6

之间是否有区别/优势
const { foo } = this.state

并传播

const { foo } = { ...this.state }

我要通过在最后一行调用this.setState({foo})来更新状态。

我所说的“差异/优势”是:push上是否有任何突变(如foo)只能通过破坏扩展状态(后者)来正确完成? >

3 个答案:

答案 0 :(得分:1)

如果某些东西在需要CPU减少工作的版本中起作用,那么

第二个版本:

  • 您正在破坏原始对象
  • 创建一个新对象
  • 然后复制值

第一个版本是您使用原始对象复制的对象,因此您只是从第二个版本开始执行第三步

答案 1 :(得分:1)

除了价差创建了一个新对象之外,实际上还有一个细微的差别。 Spread还仅复制对象自己的可枚举属性。

考虑:

let proto_state = {foo: "mark"}
let state = Object.create(proto_state)
console.log(state.foo) // inherits it from the proto_state

let {foo} = {...state} // undefined not own prop
console.log(foo);

({foo} = state)  // gets the inherited foo
console.log(foo);

我不知道这是否真的与您的代码有关,但它们并不相同。

答案 2 :(得分:0)

在第二种情况下,您首先要克隆状态,然后对其进行解构。它增加了一个不必要的步骤,因为您应该在写入状态下将其克隆/更改为不变。