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_LOGOUTaction, 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 appReduceret lui écrire une nouvelle rootReducerdé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_LOGOUTaction. Comme nous le savons, les réducteurs sont censés retourner l'état initial lorsqu'ils sont appelés avec undefinedcomme premier argument, quelle que soit l'action. Utilisons ce fait pour dépouiller conditionnellement l'accumulé statelorsque 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_LOGOUTincendie 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 stateavant 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 undefinedet 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);
};