gpt4 book ai didi

javascript - 注销时重置 redux 状态

转载 作者:行者123 更新时间:2023-12-03 13:28:40 26 4
gpt4 key购买 nike

我正在尝试解决这个问题,一般在较早的线程中解决 - How to reset the state of a Redux store? - 需要在用户注销时重新初始化/使整个 redux 存储失效。

然而,就我而言,仍然缺少一些东西。我正在将 Redux 与 ConnectedRouter 结合使用,并尝试执行以下操作。

将 rootReducer 定义为:

export default history => 
combineReducers({
router: connectRouter(history),
user,
manager,
vendor
// rest of your reducers
});

然后我执行configureStore,将上面的内容导入为createRootReducer:

const configureStore = (initialState = {}, history) => {
let composeEnhancers = compose;
const composeWithDevToolsExtension =
window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__;
const enhancers = [];
const middleware = [sagaMiddleware, thunk, routerMiddleware(history)];
if (typeof composeWithDevToolsExtension === 'function') {
composeEnhancers = composeWithDevToolsExtension;
}
const store = createStore(
createRootReducer(history), // root reducer with router state
initialState,
composeEnhancers(applyMiddleware(...middleware), ...enhancers)
);
store.runSaga = sagaMiddleware.run;
store.subscribe(() => {
const state = store.getState();
const { session } = state['user'];
if (!session) {
console.log('no valid session');
initialState = undefined;
} else {
const { token } = session;
const decodedToken = jwt_decode(token);
const { exp } = decodedToken;
const now = new Date();
if (exp > now.getTime()) {
console.warn('token expired');
initialState = undefined;
} else {
console.log('token valid');
}
}
});
return store;
};
export default configureStore({}, history);

这个想法是 initialState = undefined; 应该重置我的状态。但它对我不起作用。

考虑到我正在使用 ConnectedRouter 并将 history 对象传递给它,执行此操作的正确位置在哪里?

最佳答案

在给您提供解决方案之前,我想指出一些非常重要的事情:

  1. 使用 redux 时,永远不要尝试直接更改存储的状态。作为对 Action 的 react ,状态应该始终通过 reducer 改变。因此,在 subscribe 回调中重新分配参数 initialState 是不正确且毫无意义的。

  2. 我认为您不想“重置”router 属性的状态,对吗?

解决这个问题的一种方法是使用 reducer 增强器,如下所示:

const resetEnhancer = rootReducer => (state, action) => {
if (action.type !== 'RESET') return rootReducer(state, action);

const newState = rootReducer(undefined, {});
newState.router = state.router;
return newState;
};

然后,当您创建商店时,请执行以下操作:

  const store = createStore(
resetEnhancer(createRootReducer(history)),
initialState,
composeEnhancers(applyMiddleware(...middleware), ...enhancers)
);

并在 subscribe 回调中执行以下操作:

if (!session) {
store.dispatch({type: 'RESET'});
}

最后一个额外提示:由于您正在使用 redux-saga,我强烈建议您将 subscribe 回调中正在执行的操作移至 saga 中。

关于javascript - 注销时重置 redux 状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54199540/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com