根据我的阅读,redux使用Object.assign
或扩展运算符来制作数据的浅表副本,但这有什么用呢?我认为它的重点在于对发送的数据进行深度复制,这样如果在商店外更改数据,它也不会改变商店中的内容。如果它是浅层副本,那么数据将被链接,这会导致数据发生问题,即使没有发送也会改变商店中的内容,这是正确的吗?
在下面的示例中,如果action.data只是被浅层复制,那么如果该数据从它来自何处更改,它会改变商店中的内容,即使没有调度权限?
const activePokemon = (state = {}, action) => {
switch (action.type) {
case 'ADD_ACTIVE_POKEMON':
return {
...state,
...action.data
}
default:
return state
}
}
答案 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;" />