在 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,
};

我不确定这个答案是否可以接受,但也许它会提供足够的信息以供使用。我做了一些挖掘,这就是我发现的。

  1. 不仅仅是 {..state} 改变了变量,任何克隆都会改变变量,例如 Object.assign({}, state) 也会破坏持久状态。
  2. Redux persist 在关闭和打开时多次调用 reducer,这些调用中的大多数状态是未定义的,因此默认为初始状态 (您可以通过在默认值
  3. 中添加 console.log(state) console.log(action) 来查看
  4. 我的猜测是 redux persist 会寻找在给定状态到 reducer 和 reducer 的输出状态之间的重新分配之间的任何变化,如果有重新分配,它会保留该值。如果这是正确的,那么当状态在应用程序关闭时设置为初始状态时,它不会被持久化记录,因为没有重新分配(如果你 return 状态)但是当你克隆状态时它会被记录在您的默认{...状态}