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