[解決済み] Reduxストアの状態をリセットする方法とは?
質問
状態管理にReduxを使っています。
ストアを初期状態に戻すにはどうすればよいですか?
例えば、2つのユーザー・アカウント(
u1
と
u2
).
次のような一連の流れを想像してください。
-
ユーザー
u1
がアプリにログインして何かをするので、ストアにいくつかのデータをキャッシュします。 -
ユーザー
u1
がログアウトします。 -
ユーザー
u2
は、ブラウザを更新せずにアプリにログインします。
この時点で、キャッシュされたデータには
u1
そして、それをクリーンアップしたいと思います。
最初のユーザーがログアウトしたときに、Reduxストアを初期状態に戻すにはどうすればよいですか?
解決方法は?
一つの方法としては、アプリケーションにroot reducerを書くことでしょう。
ルートリデューサは通常、アクションの処理を
combineReducers()
. しかし
USER_LOGOUT
アクションを実行すると、初期状態に戻ってしまう。
例えば、root reducerがこんな感じだったとします。
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') {
return appReducer(undefined, action)
}
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') {
return appReducer(undefined, action)
}
return appReducer(state, action)
}
を使用している場合 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')
return appReducer(undefined, action);
}
return appReducer(state, action);
};
関連
-
vue for 登録ページ効果 vue for sms 認証コードログイン
-
[解決済み】ReactJSでエラー発生 Uncaught TypeError: Super expression は null か関数でなければならず、undefined ではありません。
-
[解決済み】「.addEventListener is not a function」なぜこのエラーが発生するのか?
-
[解決済み] 配列から特定の項目を削除するにはどうすればよいですか?
-
[解決済み] jQueryで要素が非表示になっているかどうかを確認するには?
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] let "と "var "の使い分けは?
-
[解決済み] Reduxの非同期フローになぜミドルウェアが必要なのか?
-
[解決済み】別のウェブページにリダイレクトするにはどうすればいいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
親子コンポーネント通信を解決する3つのVueスロット
-
WeChatアプレット用ユニアプリによるグローバルシェアリング
-
vue for 登録ページ効果 vue for sms 認証コードログイン
-
vue+webrtc(Tencent cloud)ライブ機能の実践を実現するために
-
JavaScriptの配列共通メソッド解説
-
Vueのフィルタの説明
-
[解決済み】最大呼び出しスタックサイズ超過エラー
-
[解決済み】React Nativeアプリをターミナルから実行するとエラーが発生する(iOS)
-
[解決済み] Web API エラー - このリクエストはブロックされました; コンテンツは HTTPS で提供されなければなりません
-
OSSアップロードエラーを解決する: net::ERR_SSL_PROTOCOL_ERROR