Один из способов сделать это - написать корневой редуктор в вашем приложении.
Корневой редуктор обычно делегирует обработку действия редуктору, сгенерированному с помощью 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)
}
Обратите внимание, что я не изменяю здесь состояние, я просто переназначаю ссылку на локальную переменную, вызываемую state
перед передачей ее другой функции. Мутирование состояния объекта было бы нарушением принципов Redux.
В случае, если вы используете redux-persist , вам также может понадобиться очистить хранилище. Redux-persist хранит копию вашего состояния в хранилище, и копия состояния будет загружена оттуда при обновлении.
Сначала необходимо импортировать соответствующий механизм хранения, а затем проанализировать состояние, прежде чем устанавливать его, 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);
};