วิธีหนึ่งในการทำเช่นนั้นคือการเขียนตัวลดทอนในแอปพลิเคชันของคุณ
combineReducers()
ลดความรากปกติจะมอบหมายการจัดการการดำเนินการเพื่อลดที่สร้างขึ้นโดย อย่างไรก็ตามเมื่อใดก็ตามที่มันได้รับUSER_LOGOUT
การกระทำก็จะส่งกลับสถานะเริ่มต้นอีกครั้ง
ตัวอย่างเช่นหากตัวลดทอนของคุณมีลักษณะดังนี้:
const rootReducer = combineReducers({
/* your app’s top-level reducers */
})
คุณสามารถเปลี่ยนชื่อเป็นappReducer
และเขียนการrootReducer
มอบสิทธิ์ใหม่:
const appReducer = combineReducers({
/* your app’s top-level reducers */
})
const rootReducer = (state, action) => {
return appReducer(state, action)
}
ตอนนี้เราแค่ต้องสอนคนใหม่rootReducer
ให้กลับสู่สภาวะเริ่มต้นหลังจากUSER_LOGOUT
การกระทำ ดังที่เราทราบแล้ว reducers ควรจะคืนค่าสถานะเริ่มต้นเมื่อพวกเขาถูกเรียกว่าundefined
เป็นอาร์กิวเมนต์แรกไม่ว่าการกระทำ ลองใช้ความจริงนี้เพื่อตัดการสะสมstate
ตามที่เราส่งไปที่appReducer
:
const rootReducer = (state, action) => {
if (action.type === 'USER_LOGOUT') {
state = undefined
}
return appReducer(state, action)
}
ตอนนี้เมื่อใดก็ตามที่USER_LOGOUT
เกิดเพลิงไหม้ reducers ทั้งหมดจะเริ่มต้นใหม่อีกครั้ง พวกเขาสามารถคืนสิ่งที่แตกต่างจากตอนแรกถ้าพวกเขาต้องการเพราะพวกเขาสามารถตรวจสอบได้action.type
เช่นกัน
หากต้องการย้ำรหัสใหม่แบบเต็มจะมีลักษณะดังนี้:
const appReducer = combineReducers({
/* your app’s top-level reducers */
})
const rootReducer = (state, action) => {
if (action.type === 'USER_LOGOUT') {
state = undefined
}
return appReducer(state, action)
}
โปรดทราบว่าฉันไม่ได้กลายพันธุ์รัฐที่นี่ฉันเป็นเพียง มอบหมายการอ้างอิงตัวแปรท้องถิ่นที่เรียกว่าstate
ก่อนที่จะส่งไปยังฟังก์ชั่นอื่น การกลายพันธุ์วัตถุของรัฐจะเป็นการละเมิดหลักการ Redux
ในกรณีที่คุณกำลังใช้ redux-persistคุณอาจต้องล้างข้อมูลที่เก็บ Redux-persist เก็บสำเนาสถานะของคุณในเอนจินการจัดเก็บและสำเนาสถานะจะถูกโหลดจากที่นั่นเมื่อรีเฟรช
ก่อนอื่นคุณต้องนำเข้าเครื่องมือจัดเก็บข้อมูลที่เหมาะสมจากนั้นจึงแยกวิเคราะห์สถานะก่อนที่จะตั้งค่าundefined
และทำความสะอาดคีย์สถานะการจัดเก็บแต่ละรายการ
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);
};