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 appReducer
ve yeni bir rootReducer
temsilci yazabilirsiniz :
const appReducer = combineReducers({
/* your app’s top-level reducers */
})
const rootReducer = (state, action) => {
return appReducer(state, action)
}
Şimdi sadece yenisine eylemden rootReducer
sonra 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 state
biz bunu geçerken appReducer
:
const rootReducer = (state, action) => {
if (action.type === 'USER_LOGOUT') {
state = undefined
}
return appReducer(state, action)
}
Şimdi, her USER_LOGOUT
ateş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 undefined
her 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);
};