これを行う1つの方法は、アプリケーションでルートリデューサーを記述することです。
ルートレデューサーは通常、アクションの処理をによって生成されたレデューサーに委任し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
アクションの後に初期状態を返すように新しいものを教える必要があるだけです。ご存じのように、レデューサーはundefined
、アクションに関係なく、最初の引数として呼び出されたときに初期状態を返すことになっています。この事実を使用して、次のstate
ように渡された累積を条件付きで削除しappReducer
ます。
const rootReducer = (state, action) => {
if (action.type === 'USER_LOGOUT') {
state = undefined
}
return appReducer(state, action)
}
これで、USER_LOGOUT
起動すると、すべてのレデューサーが新たに初期化されます。また、チェック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);
};