为什么 redux 每次更改时都需要复制数据?
why does redux need to make a copy of the data each time it changes?
据我所知,redux 使用 Object.assign
或扩展运算符来制作数据的浅表副本,但这有什么意义呢?我认为它的全部意义在于对发送的数据进行深度复制,这样如果数据在商店外发生更改,它也不会更改商店中的内容。如果它是一个浅拷贝,那么数据将被链接,这会导致数据改变存储中的内容的问题,即使没有调度,对吗?
在下面的示例中,如果 action.data 仅被浅层复制,那么如果该数据从其来源发生更改,即使没有调度,它也会更改商店中的内容吗?
const activePokemon = (state = {}, action) => {
switch (action.type) {
case 'ADD_ACTIVE_POKEMON':
return {
...state,
...action.data
}
default:
return state
}
}
如果您正在关注 redux
的 Three Principles,那么您就不会担心商店外的变化。
The only way to change the state is to emit an action, an object describing what happened.
如果store外的更改是为了修改state,应该改用dispatch
。除了更新状态之外,dispatch
还会将更改通知商店的每个订阅者。
并且一旦你 'linked' 一些数据到状态,数据不应该被改变,因为它是状态的一部分,并且..
State is read-only
编辑:关于复制
在 reducers(read it again for details!), redux
only requires our reducers to stay pure 的文档中。如果新状态不同,reducer必须创建新对象,复制是描述未改变部分的一种方式。
我们并不总是复制来描述新状态。 return {}
可用于清除所有状态属性,当只保留少数属性时,我们可以指定不变的属性而不是复制:
return {
unchangedProp0: state.unchangedProp0,
unchangedProp1: state.unchangedProp1,
...newData
}
据我所知,redux 使用 Object.assign
或扩展运算符来制作数据的浅表副本,但这有什么意义呢?我认为它的全部意义在于对发送的数据进行深度复制,这样如果数据在商店外发生更改,它也不会更改商店中的内容。如果它是一个浅拷贝,那么数据将被链接,这会导致数据改变存储中的内容的问题,即使没有调度,对吗?
在下面的示例中,如果 action.data 仅被浅层复制,那么如果该数据从其来源发生更改,即使没有调度,它也会更改商店中的内容吗?
const activePokemon = (state = {}, action) => {
switch (action.type) {
case 'ADD_ACTIVE_POKEMON':
return {
...state,
...action.data
}
default:
return state
}
}
如果您正在关注 redux
的 Three Principles,那么您就不会担心商店外的变化。
The only way to change the state is to emit an action, an object describing what happened.
如果store外的更改是为了修改state,应该改用dispatch
。除了更新状态之外,dispatch
还会将更改通知商店的每个订阅者。
并且一旦你 'linked' 一些数据到状态,数据不应该被改变,因为它是状态的一部分,并且..
State is read-only
编辑:关于复制
在 reducers(read it again for details!), redux
only requires our reducers to stay pure 的文档中。如果新状态不同,reducer必须创建新对象,复制是描述未改变部分的一种方式。
我们并不总是复制来描述新状态。 return {}
可用于清除所有状态属性,当只保留少数属性时,我们可以指定不变的属性而不是复制:
return {
unchangedProp0: state.unchangedProp0,
unchangedProp1: state.unchangedProp1,
...newData
}