据我所知,redux 使用 Object.assign
或扩展运算符来制作数据的浅拷贝,但这有什么意义呢?我认为它的全部意义在于对发送的数据进行深度复制,这样如果数据在商店外发生更改,它也不会更改商店中的内容。如果它是一个浅拷贝,那么数据将被链接,这会导致数据在没有调度的情况下改变商店中的内容,对吗?
在下面的示例中,如果 action.data 仅被浅层复制,那么如果该数据从它来自的任何地方被更改,它会更改存储中的内容,即使没有正确的调度?
const activePokemon = (state = {}, action) => {
switch (action.type) {
case 'ADD_ACTIVE_POKEMON':
return {
...state,
...action.data
}
default:
return state
}
}
最佳答案
如果您正在关注 Three Principles的 redux
,那么您就不用担心店外的变化了。
The only way to change the state is to emit an action, an object describing what happened.
如果store外的改动是为了修改状态,dispatch
应该改用。除了更新状态,dispatch
还会将更改通知商店的每个订阅者。
一旦您将一些数据“链接”到状态,数据就不应更改,因为它是状态的一部分,并且..
State is read-only
编辑:关于复制
在 reducers 的文档中(再读一遍了解详情!),redux
只需要我们的 reducer 保持pure 强>。如果新的状态不同,reducer 必须创建新的对象,复制是描述未改变部分的一种方式。
我们并不总是制作副本来描述新状态。 return {}
可用于清除所有状态属性,当只有少数属性需要保留时,我们可以指定不变的属性而不是复制:
return {
unchangedProp0: state.unchangedProp0,
unchangedProp1: state.unchangedProp1,
...newData
}
关于javascript - 为什么 redux 每次更改时都需要复制数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39521868/