【问题标题】:Using {...state} instead of state in persistReducer in redux在 redux 中使用 {...state} 而不是 persistReducer 中的状态
【发布时间】:2021-05-29 04:08:07
【问题描述】:

所以我在我的 react-native 应用程序中使用 redux-persist 来保持状态并且一切正常。

对于 reducer,我使用 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,
};

【问题讨论】:

  • 我还没有研究持久化 redux,但据我了解,传播状态对象会创建一个新对象,redux 会比较两个对象并发现一些变化,所以它会保留新对象。
  • 因此,在保留新数据后,为什么数据会被删除,因为新数据将包括旧状态的所有内容,因为我只是在复制它。如果我错了,请纠正我。
  • 也许,您的持久性配置有问题(lib 的自述文件中的 persistConfig 对象)。可以分享一下吗?
  • 编辑了我的问题
  • 状态变成了什么?未定义?

标签: javascript react-native parsing redux-persist redux-reducers


【解决方案1】:

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

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

【讨论】:

  • 我认为这是正确的答案。当我传播状态时,我理解了多少,因为它创建了一个新对象,在应用程序重新加载时,redux 检查默认值,因为这是一个新对象,它更新了状态,但我们传播的状态不是持久状态,但初始状态。但是当我们不传播状态并简单地返回状态时,它不会改变状态并简单地返回它,这实际上是持久化的状态。还是有点难以理解。
猜你喜欢
  • 1970-01-01
  • 2020-08-06
  • 1970-01-01
  • 1970-01-01
  • 2017-10-04
  • 2018-10-25
  • 2017-12-08
  • 2019-12-29
  • 2019-12-04
相关资源
最近更新 更多