Una forma de hacerlo sería escribir un reductor de raíz en su aplicación.
El reductor raíz normalmente delegaría el manejo de la acción al reductor generado por combineReducers()
. Sin embargo, cada vez que recibe una USER_LOGOUT
acción, devuelve el estado inicial nuevamente.
Por ejemplo, si su reductor de raíz se ve así:
const rootReducer = combineReducers({
/* your app’s top-level reducers */
})
Puede cambiarle el nombre appReducer
y escribirle una nueva rootReducer
delegación:
const appReducer = combineReducers({
/* your app’s top-level reducers */
})
const rootReducer = (state, action) => {
return appReducer(state, action)
}
Ahora solo tenemos que enseñarle a lo nuevo rootReducer
a devolver el estado inicial después de la USER_LOGOUT
acción. Como sabemos, se supone que los reductores devuelven el estado inicial cuando se los llama undefined
como primer argumento, sin importar la acción. Usemos este hecho para despojar condicionalmente lo acumulado a state
medida que lo pasamos a appReducer
:
const rootReducer = (state, action) => {
if (action.type === 'USER_LOGOUT') {
state = undefined
}
return appReducer(state, action)
}
Ahora, cuando se USER_LOGOUT
dispare, todos los reductores se inicializarán de nuevo. También pueden devolver algo diferente de lo que hicieron inicialmente si lo desean porque también pueden verificar action.type
.
Para reiterar, el nuevo código completo se ve así:
const appReducer = combineReducers({
/* your app’s top-level reducers */
})
const rootReducer = (state, action) => {
if (action.type === 'USER_LOGOUT') {
state = undefined
}
return appReducer(state, action)
}
Tenga en cuenta que no estoy mutando el estado aquí, simplemente estoy reasignando la referencia de una variable local llamada state
antes de pasarla a otra función. La mutación de un objeto de estado sería una violación de los principios de Redux.
En caso de que esté usando redux-persist , es posible que también necesite limpiar su almacenamiento. Redux-persist mantiene una copia de su estado en un motor de almacenamiento, y la copia de estado se cargará desde allí en la actualización.
Primero, debe importar el motor de almacenamiento apropiado y luego, analizar el estado antes de configurarlo undefined
y limpiar cada clave de estado de almacenamiento.
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);
};