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_LOGOUTtindakan, 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 appReducerdan menulis rootReducerdelegasi 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 rootReduceruntuk mengembalikan keadaan awal setelah USER_LOGOUTtindakan. Seperti yang kita ketahui, reduksi seharusnya mengembalikan keadaan awal ketika mereka dipanggil dengan undefinedargumen pertama, apa pun tindakannya. Mari kita gunakan fakta ini untuk menghapus secara akumulatif akumulasi yang statekita berikan appReducer:
const rootReducer = (state, action) => {
if (action.type === 'USER_LOGOUT') {
state = undefined
}
return appReducer(state, action)
}
Sekarang, setiap kali USER_LOGOUTkebakaran, 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.typejuga.
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 statesebelum 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 undefineddan 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);
};