Bunu yapmanın bir yolu, uygulamanıza bir kök düşürücü yazmak olacaktır.
Kök azaltıcı normalde eylemin işleme tarafından oluşturulan azaltıcıya devreder combineReducers(). Ancak, ne zamanUSER_LOGOUT işlem , başlangıç durumunu tekrar tekrar döndürür.
Örneğin, kök düşürücünüz şöyle görünüyorsa:
const rootReducer = combineReducers({
/* your app’s top-level reducers */
})
Yeniden adlandırabilir appReducerve yeni bir rootReducertemsilci yazabilirsiniz :
const appReducer = combineReducers({
/* your app’s top-level reducers */
})
const rootReducer = (state, action) => {
return appReducer(state, action)
}
Şimdi sadece yenisine eylemden rootReducersonra başlangıç durumuna dönmeyi öğretmeliyiz USER_LOGOUT. Bildiğimiz gibi, indirgeyicilerin undefined, eylem ne olursa olsun, ilk argüman olarak çağrıldıklarında başlangıç durumuna dönmeleri beklenir . Diyelim şartlı biriken şerit bu gerçeği kullanın statebiz bunu geçerken appReducer:
const rootReducer = (state, action) => {
if (action.type === 'USER_LOGOUT') {
state = undefined
}
return appReducer(state, action)
}
Şimdi, her USER_LOGOUTateşlendiğinde, tüm redüktörler yeniden başlatılacak. Ayrıca, istedikleri takdirde başlangıçta yaptıklarıdan farklı bir şey iade edebilirler, çünkü kontrol edebilirler action.type.
Tekrarlamak için, yeni kodun tamamı şöyle görünür:
const appReducer = combineReducers({
/* your app’s top-level reducers */
})
const rootReducer = (state, action) => {
if (action.type === 'USER_LOGOUT') {
state = undefined
}
return appReducer(state, action)
}
Burada durumu mutasyona uğratmadığımı, sadece yerel bir değişkenin referansını yeniden atarımstate başka bir işleve geçmeden önce . Bir devlet nesnesini değiştirmek, Redux ilkelerinin ihlali anlamına gelir.
Redux-persist kullanıyorsanız , depolama alanınızı da temizlemeniz gerekebilir. Redux-persist, durumunuzun bir kopyasını bir depolama motorunda tutar ve durum kopyası yenileme sırasında oradan yüklenir.
İlk olarak, uygun depolama motorunu içe aktarmanız ve ardından undefinedher depolama durumu anahtarına ayarlamadan önce durumu ayrıştırmanız ve temizlemeniz gerekir.
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);
};