Salah satu cara untuk melakukannya adalah dengan menulis peredam root di aplikasi Anda.
Root reducer biasanya akan mendelegasikan penanganan aksi ke reducer yang dihasilkan oleh combineReducers()
. Namun, setiap kali ia menerima USER_LOGOUT
tindakan, ia mengembalikan keadaan awal dari awal lagi.
Misalnya, jika peredam root Anda terlihat seperti ini:
const rootReducer = combineReducers({
/* your app’s top-level reducers */
})
Anda dapat mengubah nama appReducer
dan menulis rootReducer
delegasi baru untuk itu:
const appReducer = combineReducers({
/* your app’s top-level reducers */
})
const rootReducer = (state, action) => {
return appReducer(state, action)
}
Sekarang kita hanya perlu mengajarkan yang baru rootReducer
untuk mengembalikan keadaan awal setelah USER_LOGOUT
tindakan. Seperti yang kita ketahui, reduksi seharusnya mengembalikan keadaan awal ketika mereka dipanggil dengan undefined
argumen pertama, apa pun tindakannya. Mari kita gunakan fakta ini untuk menghapus secara akumulatif akumulasi yang state
kita berikan appReducer
:
const rootReducer = (state, action) => {
if (action.type === 'USER_LOGOUT') {
state = undefined
}
return appReducer(state, action)
}
Sekarang, setiap kali USER_LOGOUT
kebakaran, semua reduksi akan diinisialisasi lagi. Mereka juga dapat mengembalikan sesuatu yang berbeda dari yang mereka lakukan pada awalnya jika mereka mau karena mereka dapat memeriksa action.type
juga.
Untuk mengulangi, kode lengkap baru terlihat seperti ini:
const appReducer = combineReducers({
/* your app’s top-level reducers */
})
const rootReducer = (state, action) => {
if (action.type === 'USER_LOGOUT') {
state = undefined
}
return appReducer(state, action)
}
Perhatikan bahwa saya tidak mengubah keadaan di sini, saya hanya menetapkan ulang referensi variabel lokal yang dipanggil state
sebelum meneruskannya ke fungsi lain. Mutasi objek negara akan melanggar prinsip Redux.
Jika Anda menggunakan redux-persist , Anda mungkin juga perlu membersihkan penyimpanan Anda. Redux-persist menyimpan salinan status Anda di mesin penyimpanan, dan salinan status akan dimuat dari sana saat refresh.
Pertama, Anda perlu mengimpor mesin penyimpanan yang sesuai dan kemudian, untuk menguraikan status sebelum mengaturnya undefined
dan membersihkan setiap kunci status penyimpanan.
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);
};