Redux 中的状态突变
State mutation in Redux
我知道 Reducers 只是纯函数,它采用以前的状态和一个动作,return 一个新的状态对象,而不是改变以前的状态。
但是尽管直接突变不是 Redux 的哲学,它仍然是可能的(或者我错过了一些东西):
const reducer = (oldState = initialState, action) => {
switch (action.type) {
case "ACT": {
// mutate state directly instead of create a new one
oldState.subobj.ssub.key = "hi hi";
return oldState;
} default: {
return oldState;
}
}
};
为什么 redux 不执行验证来防止这种行为?
我们如何确保开发人员永远不会这样做?
Redux 无法进行这样的验证,因为它不知道某个动作的新数据是否真的应该更新状态。 Redux 使用 reducers,因为它不知道如何更新你的状态。这是您的业务逻辑,因此您必须提供此类状态转换。
Redux 正在比较对象引用,速度很快。如果它会执行某种复制状态树并递归地比较对象,则会引入性能损失。
为了确保你的开发人员没有这样做,我想你最好的办法是建立良好的开发纪律,对你的减速器进行单元测试,在这些测试中使用 deep-freeze
库,并强制执行 deep-freeze
在代码审查中的使用。
我知道 Reducers 只是纯函数,它采用以前的状态和一个动作,return 一个新的状态对象,而不是改变以前的状态。
但是尽管直接突变不是 Redux 的哲学,它仍然是可能的(或者我错过了一些东西):
const reducer = (oldState = initialState, action) => {
switch (action.type) {
case "ACT": {
// mutate state directly instead of create a new one
oldState.subobj.ssub.key = "hi hi";
return oldState;
} default: {
return oldState;
}
}
};
为什么 redux 不执行验证来防止这种行为?
我们如何确保开发人员永远不会这样做?
Redux 无法进行这样的验证,因为它不知道某个动作的新数据是否真的应该更新状态。 Redux 使用 reducers,因为它不知道如何更新你的状态。这是您的业务逻辑,因此您必须提供此类状态转换。
Redux 正在比较对象引用,速度很快。如果它会执行某种复制状态树并递归地比较对象,则会引入性能损失。
为了确保你的开发人员没有这样做,我想你最好的办法是建立良好的开发纪律,对你的减速器进行单元测试,在这些测试中使用 deep-freeze
库,并强制执行 deep-freeze
在代码审查中的使用。