为什么redux每次更改都需要复制数据?

时间:2016-09-15 23:40:24

标签: javascript reactjs copy redux react-redux

根据我的阅读,redux使用Object.assign或扩展运算符来制作数据的浅表副本,但这有什么用呢?我认为它的重点在于对发送的数据进行深度复制,这样如果在商店外更改数据,它也不会改变商店中的内容。如果它是浅层副本,那么数据将被链接,这会导致数据发生问题,即使没有发送也会改变商店中的内容,这是正确的吗?

在下面的示例中,如果action.data只是被浅层复制,那么如果该数据从它来自何处更改,它会改变商店中的内容,即使没有调度权限?

const activePokemon = (state = {}, action) => {
  switch (action.type) {
    case 'ADD_ACTIVE_POKEMON':
      return {
        ...state,
        ...action.data
      }
    default:
      return state
  }
}

1 个答案:

答案 0 :(得分:1)

如果您关注redux dispatch,那么您不必担心商店外的变化。

  

更改状态的唯一方法是发出一个Three Principles,一个描述所发生事件的对象。

如果商店外的更改旨在修改状态,则应使用dispatch。除了更新状态之外,redux还会通知商店的每个订户有关更改的信息。

一旦你联系了'一些数据到状态,数据不应该改变,因为它是状态的一部分,而且..

  

州是只读的

编辑:关于制作副本

action的文档中(详情请再次阅读!),return {}只需要我们的缩减器保持reducers 。如果新状态不同,则reducer必须创建新对象,并且复制是一种描述未更改部分的方法。

我们并不总是制作副本来描述新的州。 return { unchangedProp0: state.unchangedProp0, unchangedProp1: state.unchangedProp1, ...newData } 可用于清除所有状态属性,当只有少数属性需要保留时,我们可以指定未更改的属性而不是复制:

<textarea id="QBody" style="font-size: 30px;" />