我正在使用 Redux 进行状态管理。
如何将商店重置为其初始状态?
例如,假设我有两个用户帐户( u1
和 u2
)。
想象以下事件序列:
用户
u1
登录到应用程序并做了一些事情,所以我们在存储中缓存了一些数据。用户
u1
注销。用户
u2
无需刷新浏览器即可登录应用。
此时,缓存的数据将与 u1
关联,我想清理它。
当第一个用户注销时,如何将 Redux 存储重置为其初始状态?
原文由 xyz 发布,翻译遵循 CC BY-SA 4.0 许可协议
我正在使用 Redux 进行状态管理。
如何将商店重置为其初始状态?
例如,假设我有两个用户帐户( u1
和 u2
)。
想象以下事件序列:
用户 u1
登录到应用程序并做了一些事情,所以我们在存储中缓存了一些数据。
用户 u1
注销。
用户 u2
无需刷新浏览器即可登录应用。
此时,缓存的数据将与 u1
关联,我想清理它。
当第一个用户注销时,如何将 Redux 存储重置为其初始状态?
原文由 xyz 发布,翻译遵循 CC BY-SA 4.0 许可协议
Dan Abramov 的 回答 是正确的,除了我们在使用 react-router-redux 包和这种方法时遇到了一个奇怪的问题。
我们的修复是不将状态设置为 undefined
而是仍然使用当前的路由减速器。因此,如果您使用此软件包,我建议实施以下解决方案
const rootReducer = (state, action) => {
if (action.type === 'USER_LOGOUT') {
const { routing } = state
state = { routing }
}
return appReducer(state, action)
}
原文由 Ryan Irilli 发布,翻译遵循 CC BY-SA 4.0 许可协议
10 回答11.1k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
一种方法是在您的应用程序中编写一个根减速器。
根减速器通常会将处理操作委托给
combineReducers()
生成的减速器。但是,每当它接收USER_LOGOUT
操作时,它都会重新返回初始状态。例如,如果您的根减速器看起来像这样:
您可以将其重命名为
appReducer
并编写一个新的rootReducer
委托给它:现在我们只需要教新的
rootReducer
返回初始状态以响应USER_LOGOUT
操作。正如我们所知,reducers 应该在以undefined
作为第一个参数调用它们时返回初始状态,无论动作如何。让我们在将累积状态传递给appReducer
时,利用这个事实有条件地去除累积state
:现在,每当
USER_LOGOUT
触发时,所有 reducer 都会重新初始化。如果他们愿意,他们也可以返回与最初不同的东西,因为他们也可以检查action.type
。重申一下,完整的新代码如下所示:
如果你使用 redux-persist ,你可能还需要清理你的存储。 Redux-persist 将您的状态副本保存在存储引擎中,并且状态副本将在刷新时从那里加载。
首先,您需要导入适当的 存储引擎,然后在将状态设置为
undefined
之前解析状态并清理每个存储状态键。