为什么redux需要在每次数据更改时生成一份数据副本?



据我所知,redux使用Object.assign或扩展操作符来对数据进行浅拷贝,但这有什么意义呢?我认为它的全部意义在于对分派的数据进行深度复制,这样即使数据在存储之外被更改,也不会改变存储中的数据。如果它是一个浅拷贝,那么数据将被链接,这将导致数据改变存储中的内容的问题,即使没有分派,对吗?

在下面的例子中,if动作。数据只是浅层复制,如果数据从它的来源改变了,它就会改变存储中的内容,即使没有调度,对吧?

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

如果你遵循redux的三个原则,那么你就不会担心商店外的变化。

改变状态的唯一方法是发出一个动作,一个描述发生了什么的对象。

如果store外的更改旨在修改状态,则应使用dispatch。除了更新状态之外,dispatch还将更改通知商店的每个订阅者。

一旦你将一些数据"链接"到状态,数据就不应该被改变,因为它是状态的一部分,并且…

状态为只读

编辑:关于制作副本

在reducer的文档中(详细信息请再次阅读!),redux只要求我们的reducer 保持纯的。如果新的状态不同,reducer必须创建新的对象,而复制是描述未改变部分的一种方式。

我们并不总是创建一个副本来描述新的状态。return {}可以用来清除所有的状态属性,当只有少数属性需要保留时,我们可以指定不变的属性,而不是复制:

return {
  unchangedProp0: state.unchangedProp0,
  unchangedProp1: state.unchangedProp1,
  ...newData
}

相关内容

  • 没有找到相关文章

最新更新