Eine Möglichkeit, dies zu tun, besteht darin, einen Root-Reduzierer in Ihre Anwendung zu schreiben.
Der Root-Reduzierer delegiert normalerweise die Verarbeitung der Aktion an den Reduzierer, der von generiert wird combineReducers()
. Wenn jedoch eine USER_LOGOUT
Aktion empfangen wird , wird der Ausgangszustand erneut zurückgegeben.
Wenn Ihr Root-Reducer beispielsweise so aussah:
const rootReducer = combineReducers({
/* your app’s top-level reducers */
})
Sie können es umbenennen appReducer
und eine neue rootReducer
Delegierung darauf schreiben :
const appReducer = combineReducers({
/* your app’s top-level reducers */
})
const rootReducer = (state, action) => {
return appReducer(state, action)
}
Jetzt müssen wir nur noch das Neue lehren rootReducer
, um nach der USER_LOGOUT
Aktion den Ausgangszustand wiederherzustellen. Wie wir wissen, sollen Reduzierer den Ausgangszustand zurückgeben, wenn sie undefined
als erstes Argument aufgerufen werden , unabhängig von der Aktion. Verwenden state
wir diese Tatsache, um das Akkumulierte unter bestimmten Bedingungen zu entfernen appReducer
:
const rootReducer = (state, action) => {
if (action.type === 'USER_LOGOUT') {
state = undefined
}
return appReducer(state, action)
}
Jetzt werden bei jedem USER_LOGOUT
Brand alle Reduzierungen neu initialisiert. Sie können auch etwas anderes zurückgeben als ursprünglich, wenn sie möchten, da sie dies auch überprüfen können action.type
.
Um es noch einmal zu wiederholen: Der vollständige neue Code sieht folgendermaßen aus:
const appReducer = combineReducers({
/* your app’s top-level reducers */
})
const rootReducer = (state, action) => {
if (action.type === 'USER_LOGOUT') {
state = undefined
}
return appReducer(state, action)
}
Beachten Sie, dass ich den Status hier nicht mutiere, sondern lediglich die Referenz einer aufgerufenen lokalen Variablen neu zuweise, state
bevor ich sie an eine andere Funktion übergebe. Das Mutieren eines Zustandsobjekts wäre ein Verstoß gegen die Redux-Prinzipien.
Wenn Sie Redux-Persist verwenden , müssen Sie möglicherweise auch Ihren Speicher reinigen. Redux-persist speichert eine Kopie Ihres Status in einer Speicher-Engine, und die Statuskopie wird bei der Aktualisierung von dort geladen.
Zuerst müssen Sie die entsprechende Speicher-Engine importieren und dann den Status analysieren, bevor Sie ihn festlegen undefined
und jeden Speicherstatus-Schlüssel bereinigen.
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);
};