据我所知,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
}