Một cách để làm điều đó là viết một trình giảm gốc trong ứng dụng của bạn.
Bộ giảm tốc gốc thường sẽ ủy thác xử lý hành động cho bộ giảm tốc được tạo bởi combineReducers()
. Tuy nhiên, bất cứ khi nào nó nhận được USER_LOGOUT
hành động, nó sẽ trả lại trạng thái ban đầu.
Ví dụ: nếu trình giảm gốc của bạn trông như thế này:
const rootReducer = combineReducers({
/* your app’s top-level reducers */
})
Bạn có thể đổi tên nó thành appReducer
và viết một rootReducer
ủy nhiệm mới cho nó:
const appReducer = combineReducers({
/* your app’s top-level reducers */
})
const rootReducer = (state, action) => {
return appReducer(state, action)
}
Bây giờ chúng ta chỉ cần dạy cái mới rootReducer
để trả về trạng thái ban đầu sau khi USER_LOGOUT
hành động. Như chúng ta biết, các bộ giảm tốc được cho là trả về trạng thái ban đầu khi chúng được gọi với undefined
tư cách là đối số đầu tiên, bất kể hành động. Chúng ta hãy sử dụng thực tế này để loại bỏ một cách có điều kiện state
khi chúng ta chuyển nó tới appReducer
:
const rootReducer = (state, action) => {
if (action.type === 'USER_LOGOUT') {
state = undefined
}
return appReducer(state, action)
}
Bây giờ, bất cứ khi nào USER_LOGOUT
cháy, tất cả các bộ giảm tốc sẽ được khởi tạo lại. Họ cũng có thể trả lại một cái gì đó khác với ban đầu nếu họ muốn vì họ cũng có thể kiểm tra action.type
.
Để nhắc lại, mã hoàn toàn mới trông như thế này:
const appReducer = combineReducers({
/* your app’s top-level reducers */
})
const rootReducer = (state, action) => {
if (action.type === 'USER_LOGOUT') {
state = undefined
}
return appReducer(state, action)
}
Lưu ý rằng tôi không làm thay đổi trạng thái ở đây, tôi chỉ đơn thuần gán lại tham chiếu của một biến cục bộ được gọi state
trước khi chuyển nó sang hàm khác. Đột biến một đối tượng trạng thái sẽ là vi phạm các nguyên tắc Redux.
Trong trường hợp bạn đang sử dụng redux-contin , bạn cũng có thể cần phải làm sạch bộ nhớ của mình. Redux-contin giữ một bản sao trạng thái của bạn trong một công cụ lưu trữ và bản sao trạng thái sẽ được tải từ đó khi làm mới.
Trước tiên, bạn cần nhập công cụ lưu trữ thích hợp và sau đó, phân tích trạng thái trước khi cài đặt undefined
và làm sạch từng khóa trạng thái lưu trữ.
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);
};