Redux:克隆状态不起作用

时间:2017-10-17 16:37:24

标签: javascript react-native react-redux

我有一个非常简单的问题,但是......

reducer的代码(在redux / react-native应用程序中):

...
case SAMPLES_DELETE_REQUEST_SUCCESS: {        
    var newState = Object.assign({}, state);
    const indexToDelete = newState.samples.findIndex( sample => {
      return sample.id == action.sample.id
    })
    newState.samples.splice(indexToDelete, 1)
    debugger;
    return newState
  }
...

好的,我复制状态并将其存储到newState中。但是当我执行newState.samples.splice(indexToDelete, 1)时,newState被正确修改,但state!为什么??我一定累了......

2 个答案:

答案 0 :(得分:2)

splice函数修改原始数组。 Object.assign没有做深度克隆。因此,您仍在修改原始状态!

您必须手动复制要克隆的嵌套对象(或数组):

// Deep Clone
obj1 = { a: 0 , b: { c: 0}};
let obj2 = JSON.parse(JSON.stringify(obj1));

答案 1 :(得分:2)

如前所述,您可以使用JSON.parse(JSON.stringify(obj))创建整个对象的新副本(嵌套对象)。如果您不想这样做,可以查看Inmutable JS等库

此外,如果您想使用扩展符号,更好的方法是:

return {
  ...state,
  samples: state.samples.filter(sample => sample.id !== action.sample.id)
}