在 redux 的 persistReducer 中使用 {...state} 而不是 state
Using {...state} instead of state in persistReducer in redux
所以我在我的 react-native 应用程序中使用 redux-persist 来保持状态并且一切正常。
对于减速器,我使用 switch-case
检查不同的动作类型,对于默认情况,我返回状态。
initialState = {
first: null,
second: null,
};
export default myReducer = (state = initialState, action) => {
switch (action.type) {
case ...:
... // Handling some cases which work fine
default:
return state;
}
};
这个东西工作正常,但如果我在默认块中用 {...state}
替换 state
,它不会保持状态。
现在我已经了解了多少 state = {...state}
那么为什么这不起作用。
这是 persistConfig;
import AsyncStorage from "@react-native-async-storage/async-storage";
const persistConfig = {
key: "root",
storage: AsyncStorage,
};
我不确定这个答案是否可以接受,但也许它会提供足够的信息以供使用。我做了一些挖掘,这就是我发现的。
- 不仅仅是 {..state} 改变了变量,任何克隆都会改变变量,例如 Object.assign({}, state) 也会破坏持久状态。
- Redux persist 在关闭和打开时多次调用 reducer,这些调用中的大多数状态是未定义的,因此默认为初始状态
(您可以通过在默认值
中添加 console.log(state) console.log(action) 来查看
- 我的猜测是 redux persist 会寻找在给定状态到 reducer 和 reducer 的输出状态之间的重新分配之间的任何变化,如果有重新分配,它会保留该值。如果这是正确的,那么当状态在应用程序关闭时设置为初始状态时,它不会被持久化记录,因为没有重新分配(如果你 return 状态)但是当你克隆状态时它会被记录在您的默认{...状态}
所以我在我的 react-native 应用程序中使用 redux-persist 来保持状态并且一切正常。
对于减速器,我使用 switch-case
检查不同的动作类型,对于默认情况,我返回状态。
initialState = {
first: null,
second: null,
};
export default myReducer = (state = initialState, action) => {
switch (action.type) {
case ...:
... // Handling some cases which work fine
default:
return state;
}
};
这个东西工作正常,但如果我在默认块中用 {...state}
替换 state
,它不会保持状态。
现在我已经了解了多少 state = {...state}
那么为什么这不起作用。
这是 persistConfig;
import AsyncStorage from "@react-native-async-storage/async-storage";
const persistConfig = {
key: "root",
storage: AsyncStorage,
};
我不确定这个答案是否可以接受,但也许它会提供足够的信息以供使用。我做了一些挖掘,这就是我发现的。
- 不仅仅是 {..state} 改变了变量,任何克隆都会改变变量,例如 Object.assign({}, state) 也会破坏持久状态。
- Redux persist 在关闭和打开时多次调用 reducer,这些调用中的大多数状态是未定义的,因此默认为初始状态 (您可以通过在默认值 中添加 console.log(state) console.log(action) 来查看
- 我的猜测是 redux persist 会寻找在给定状态到 reducer 和 reducer 的输出状态之间的重新分配之间的任何变化,如果有重新分配,它会保留该值。如果这是正确的,那么当状态在应用程序关闭时设置为初始状态时,它不会被持久化记录,因为没有重新分配(如果你 return 状态)但是当你克隆状态时它会被记录在您的默认{...状态}