Une façon de le faire serait d'écrire un réducteur de racine dans votre application.
Le réducteur racine déléguerait normalement la gestion de l'action au réducteur généré par combineReducers()
. Cependant, chaque fois qu'il reçoit une USER_LOGOUT
action, il renvoie à nouveau l'état initial.
Par exemple, si votre réducteur de racine ressemblait à ceci:
const rootReducer = combineReducers({
/* your app’s top-level reducers */
})
Vous pouvez le renommer appReducer
et lui écrire une nouvelle rootReducer
délégation:
const appReducer = combineReducers({
/* your app’s top-level reducers */
})
const rootReducer = (state, action) => {
return appReducer(state, action)
}
Maintenant, nous avons juste besoin d'apprendre au nouveau rootReducer
à retourner l'état initial après l' USER_LOGOUT
action. Comme nous le savons, les réducteurs sont censés retourner l'état initial lorsqu'ils sont appelés avec undefined
comme premier argument, quelle que soit l'action. Utilisons ce fait pour dépouiller conditionnellement l'accumulé state
lorsque nous le transmettons à appReducer
:
const rootReducer = (state, action) => {
if (action.type === 'USER_LOGOUT') {
state = undefined
}
return appReducer(state, action)
}
Désormais, chaque fois qu'un USER_LOGOUT
incendie se déclenche, tous les réducteurs sont réinitialisés. Ils peuvent également retourner quelque chose de différent de ce qu'ils ont fait initialement s'ils le souhaitent, car ils peuvent également vérifier action.type
.
Pour réitérer, le nouveau code complet ressemble à ceci:
const appReducer = combineReducers({
/* your app’s top-level reducers */
})
const rootReducer = (state, action) => {
if (action.type === 'USER_LOGOUT') {
state = undefined
}
return appReducer(state, action)
}
Notez que je ne mute pas l'état ici, je réaffecte simplement la référence d'une variable locale appelée state
avant de la passer à une autre fonction. La mutation d'un objet d'état constituerait une violation des principes de Redux.
Dans le cas où vous utilisez redux-persist , vous devrez peut-être également nettoyer votre stockage. Redux-persist conserve une copie de votre état dans un moteur de stockage et la copie d'état sera chargée à partir de là lors de l'actualisation.
Vous devez d'abord importer le moteur de stockage approprié , puis analyser l'état avant de le définir undefined
et de nettoyer chaque clé d'état de stockage.
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);
};