问题

我正在使用Redux进行状态管理.
2001年12月31日终了的两年期收入和支出及准备金和基金结余变动报表 如何将商店重置为初始状态?

例如,假设我有两个用户帐户(u1u2).
2001年12月31日终了的两年期收入和支出及准备金和基金结余变动报表 想象以下事件的顺序:

  1. 用户u1登录应用程序并做一些事情,所以我们在存储中缓存一些数据.

  2. 用户u1注销.

  3. 用户u2在不刷新浏览器的情况下登录应用程序.

此时,缓存的数据将与u1关联,我想清理它.

当第一个用户注销时,如何将Redux存储重置为初始状态?

  最佳答案

这样做的一种方法是在应用程序中编写根减速器。

根减速器通常会将处理操作委托给由combineReducers()生成的减速器.但是,每当它接收USER_LOGOUT操作时,它会再次返回初始状态.

例如,如果您的根减速器看起来像这样:

 const rootReducer = combineReducers({
  /* your app’s top-level reducers */
})
 

您可以将其重命名为appReducer并编写一个新的rootReducer委托给它:

 const appReducer = combineReducers({
  /* your app’s top-level reducers */
})

const rootReducer = (state, action) => {
  return appReducer(state, action)
}
 

现在我们只需要教授新的rootReducerUSER_LOGOUT操作后返回初始状态.正如我们所知,当它们以undefined作为第一个参数调用时,还原器应该返回初始状态,无论操作如何.让我们使用这个事实有条件地剥离累积的state,因为我们将其传递给appReducer:

  const rootReducer = (state, action) => {
  if (action.type === 'USER_LOGOUT') {
    state = undefined
  }

  return appReducer(state, action)
}
 

现在,每当USER_LOGOUT火灾时,所有的还原器都将重新初始化.如果他们想要检查action.type,他们也可以返回不同的东西.

要重申,完整的新代码看起来像这样:

 const appReducer = combineReducers({
  /* your app’s top-level reducers */
})

const rootReducer = (state, action) => {
  if (action.type === 'USER_LOGOUT') {
    state = undefined
  }

  return appReducer(state, action)
}
 

请注意,我没有在这里突变状态,我只是在将其传递给另一个函数之前重新签署名为state的本地变量的引用.突变状态对象将违反Redux原则.

如果您使用 redux-persisted ,您也可能需要清理您的存储. Redux-persistent在存储引擎中保存您的状态副本,并且状态副本将从那里加载刷新.

首先,您需要导入适当的 存储引擎 ,然后在将其设置为 undefined 之前解析状态并清理每个存储状态键。

 const rootReducer = (state, action) => {
    if (action.type === SIGNOUT_REQUEST) {
        // for all keys defined in your persistConfig(s)
        storage.removeItem('persist:root')
        // storage.removeItem('persist:otherKey')

        state = undefined;
    }
    return appReducer(state, action);
};
 

  相同标签的其他问题

javascriptreduxstoreredux-store