Redux深层复制阵列即使它们保持不变?

时间:2017-01-30 23:37:45

标签: javascript arrays json redux javascript-objects

如果我的州看起来像这样:

const initialState = {
  color: 'blue',
  sizes: ['S', 'M', 'L'],
}

我想要改变颜色,我的减速器应该正确地返回:

return { ...state, color: newColor };

但状态是否仍会引用旧数组?即使我没有修改数组,这被认为是一个变异吗?这会更好吗?

return {
  ...state,
  color: newColor,
  sizes: state.map.sizes(size => size)
}

如果数组包含对象怎么办?

const initialState = {
  color: 'blue',
  sizes: [
    { color: 'red', size: 'S' },
    { color: 'green', size: 'M' },
    { color: 'blue', size: 'L' }
  ],
}

这是否意味着我必须这样做以避免改变状态?

return {
  ...state,
  color: newColor,
  sizes: state.map.sizes(item => { ...item })
}



另外,有没有理由比使用JSON.stringify和JSON.parse更喜欢Object.assign和spread运算符?

1 个答案:

答案 0 :(得分:1)

不,它不是突变。你正在做的事情非常好。

看看:

const obj1 = {
  a: 1,
  b: 2,
  c: 3
};

const obj2 = {
  ...obj1,
  c: 4
};

在创建第二个对象时,第一个对象的任何成员都不会被更改。

在Redux情况下(或实际上,在FP代码库中的任何时间,使用纯函数),只要引用是只读,共享引用就没有坏处。

这意味着当你构造一个新对象时,它的属性可以很好地直接引用其他对象的属性,只要你不改变任何子属性(因为那些子属性会是共享对象)。