Один із способів зробити це - написати кореневий редуктор у вашій заявці.
Кореневий редуктор, як правило, делегує обробку дії редуктору, породженому 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-персист зберігає копію вашого стану в двигуні зберігання, і державна копія буде завантажена звідти на оновлення.
Спочатку вам потрібно імпортувати відповідний механізм зберігання даних, а потім проаналізувати стан перед його встановленням 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);
};