仅对象分配不会在React中触发状态更改

时间:2018-10-05 01:10:47

标签: javascript reactjs redux

我想知道在React / Redux世界之间有什么区别

C

还有这个

let newState = Object.assign({}, state);
newState[action.componentDescriptor.name][action.id].Value = action.value;
return newState;

似乎前者不会触发渲染(似乎没有被识别为状态变化)。但是后者被认为是状态变化并触发渲染。两者都返回新对象(状态)?

1 个答案:

答案 0 :(得分:1)

在前一个版本中,您只使用一次Object.assign,这只会创建一个浅表副本。这意味着您的对象仅被复制一个级别,并且所有嵌套属性都指向相同的引用。因此,当您直接更改它时,Redux无法理解它们之间的区别。

在下一个版本(我想您做对了)中,您正在更改状态而没有适当地更改原始版本。您正在使用Object.assign创建嵌套属性的副本。这就是与众不同的原因。

对于更干净的版本,您可以使用spread syntax

return {
  ...state,
  [action.componentDescriptor.name]: {
    ...state[action.componentDescriptor.name],
    [action.id]: {
      ...state[action.componentDescriptor.name][action.id],
      Value: action.value,
    }
  }
}

或者您可以normalize your state避免太多嵌套的突变。