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_LOGOUTakcję, 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 appReduceri napisać nowego rootReducerdelegata:
const appReducer = combineReducers({
/* your app’s top-level reducers */
})
const rootReducer = (state, action) => {
return appReducer(state, action)
}
Teraz musimy tylko nauczyć nowego rootReducerpowrotu do stanu początkowego po USER_LOGOUTakcji. Jak wiemy, reduktory powinny zwracać stan początkowy, gdy są wywoływane undefinedjako pierwszy argument, bez względu na akcję. Wykorzystajmy ten fakt do warunkowego usunięcia nagromadzonego materiału, stategdy przekazujemy go do appReducer:
const rootReducer = (state, action) => {
if (action.type === 'USER_LOGOUT') {
state = undefined
}
return appReducer(state, action)
}
Teraz przy każdym USER_LOGOUTuruchomieniu 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 stateprzed 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 undefinedi 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);
};