Jednym ze sposobów na to byłoby napisanie reduktora root w aplikacji.
Reduktor katalogu głównego zwykle przekazuje obsługę działania do generatora reduktora wygenerowanego przez combineReducers()
. Jednak za każdym razem, gdy odbiera USER_LOGOUT
akcję, przywraca stan początkowy od nowa.
Na przykład, jeśli Twój reduktor root wyglądał tak:
const rootReducer = combineReducers({
/* your app’s top-level reducers */
})
Możesz zmienić nazwę na appReducer
i napisać nowego rootReducer
delegata:
const appReducer = combineReducers({
/* your app’s top-level reducers */
})
const rootReducer = (state, action) => {
return appReducer(state, action)
}
Teraz musimy tylko nauczyć nowego rootReducer
powrotu do stanu początkowego po USER_LOGOUT
akcji. Jak wiemy, reduktory powinny zwracać stan początkowy, gdy są wywoływane undefined
jako pierwszy argument, bez względu na akcję. Wykorzystajmy ten fakt do warunkowego usunięcia nagromadzonego materiału, state
gdy przekazujemy go do appReducer
:
const rootReducer = (state, action) => {
if (action.type === 'USER_LOGOUT') {
state = undefined
}
return appReducer(state, action)
}
Teraz przy każdym USER_LOGOUT
uruchomieniu wszystkie reduktory zostaną ponownie zainicjowane. Mogą również zwrócić coś innego niż początkowo, jeśli chcą, ponieważ mogą również sprawdzić action.type
.
Aby powtórzyć, pełny nowy kod wygląda następująco:
const appReducer = combineReducers({
/* your app’s top-level reducers */
})
const rootReducer = (state, action) => {
if (action.type === 'USER_LOGOUT') {
state = undefined
}
return appReducer(state, action)
}
Zauważ, że nie mutuję tutaj stanu, po prostu ponownie przypisuję odwołanie do zmiennej lokalnej wywołanej state
przed przekazaniem jej do innej funkcji. Mutowanie obiektu stanu stanowiłoby naruszenie zasad Redux.
W przypadku korzystania z funkcji redux-keep może być konieczne wyczyszczenie pamięci. Redux-persist przechowuje kopię twojego stanu w silniku pamięci, a kopia stanu zostanie załadowana stamtąd podczas odświeżania.
Najpierw musisz zaimportować odpowiedni silnik pamięci masowej, a następnie przeanalizować stan przed ustawieniem go undefined
i wyczyścić każdy klucz stanu pamięci masowej.
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);
};