Uma maneira de fazer isso seria escrever um redutor de raiz no seu aplicativo.
O redutor raiz normalmente delegaria a manipulação da ação no redutor gerado por combineReducers()
. No entanto, sempre que recebe USER_LOGOUT
ação, ele retorna o estado inicial novamente.
Por exemplo, se o seu redutor de raiz estiver assim:
const rootReducer = combineReducers({
/* your app’s top-level reducers */
})
Você pode renomeá-lo appReducer
e escrever uma nova rootReducer
delegação para ele:
const appReducer = combineReducers({
/* your app’s top-level reducers */
})
const rootReducer = (state, action) => {
return appReducer(state, action)
}
Agora, apenas precisamos ensinar o novo rootReducer
a retornar o estado inicial após a USER_LOGOUT
ação. Como sabemos, os redutores devem retornar o estado inicial quando são chamados undefined
como o primeiro argumento, independentemente da ação. Vamos usar esse fato para remover condicionalmente o acumulado à state
medida que o passamos para appReducer
:
const rootReducer = (state, action) => {
if (action.type === 'USER_LOGOUT') {
state = undefined
}
return appReducer(state, action)
}
Agora, sempre que USER_LOGOUT
disparar, todos os redutores serão inicializados novamente. Eles também podem retornar algo diferente do que fizeram inicialmente, se quiserem, porque também podem verificar action.type
.
Para reiterar, o novo código completo se parece com o seguinte:
const appReducer = combineReducers({
/* your app’s top-level reducers */
})
const rootReducer = (state, action) => {
if (action.type === 'USER_LOGOUT') {
state = undefined
}
return appReducer(state, action)
}
Observe que não estou mudando o estado aqui, estou apenas reatribuindo a referência de uma variável local chamada state
antes de passá-la para outra função. Mutar um objeto de estado seria uma violação dos princípios do Redux.
Caso você esteja usando redux-persist , talvez também seja necessário limpar seu armazenamento. Redux-persist mantém uma cópia do seu estado em um mecanismo de armazenamento, e a cópia do estado será carregada a partir daí na atualização.
Primeiro, você precisa importar o mecanismo de armazenamento apropriado e, em seguida, analisar o estado antes de configurá-lo undefined
e limpar cada chave de estado de armazenamento.
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);
};