Один из способов сделать это - написать корневой редуктор в своем приложении.
Корневой редуктор обычно делегирует обработку воздействия на редуктор, генерируемый 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)
}
Теперь мы просто должны научить новый rootReducer
, чтобы вернуть начальное состояние после USER_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)
}
Обратите внимание, что я не мутирует состояние здесь, я просто reassigning the reference локальной переменной называется state
перед передачей его в другую функцию. Мутирование государственного объекта будет нарушением принципов Redux.
В случае использования redux-persist, вам также может потребоваться очистить хранилище.Redux-perist хранит копию вашего состояния в системе хранения, и они будут загружены оттуда при обновлении.
Сначала необходимо импортировать соответствующий storage engine, а затем, чтобы проанализировать состояние, прежде чем устанавливать его на undefined
и очистить каждый ключ состояния хранилища.
const rootReducer = (state, action) => {
if (action.type === SIGNOUT_REQUEST) {
Object.keys(state).forEach(key => {
storage.removeItem(`persist:${key}`);
});
state = undefined;
}
return AppReducers(state, action);
};
Возможно, лучше очистить состояние при выходе из системы (с точки зрения безопасности) – Clarkie
Не редактируйте свой вопрос, чтобы включить решение. Принять ответ достаточно. Вы также можете самостоятельно ответить на свое конкретное решение, если почувствуете, что добавили много материала к существующим ответам. Тем временем я удалил часть вопросов, не относящуюся к теме. – ryanyuyu