2019年8月25日編集
コメントの1つで述べられているように。元のredux-storageパッケージはreact-stackに移動されました。このアプローチは、独自の状態管理ソリューションの実装に引き続き焦点を当てています。
元の回答
提供された回答はある時点で有効でしたが、元のredux-storageパッケージが非推奨になり、保守されなくなったことに注意することが重要です...
パッケージredux-storageの元の作成者は、プロジェクトを非推奨にすることを決定し、現在は維持されていません。
さて、将来このような問題を回避するために他のパッケージに依存したくない場合は、独自のソリューションをロールバックするのは非常に簡単です。
あなたがする必要があるのは:
1-ストアをハイドレイトするために、2番目のパラメーターで状態を返す関数を作成し、localStorage
その状態をcreateStore
'sredux関数に渡します。
const store = createStore(appReducers, state);
2-状態の変化をリッスンし、状態が変化するたびに、状態を localStorage
store.subscribe(() => {
saveState(store.getState());
});
そして、それだけです...私は実際に本番環境で同様のものを使用していますが、関数を使用する代わりに、以下のような非常に単純なクラスを作成しました...
class StateLoader {
loadState() {
try {
let serializedState = localStorage.getItem("http://contoso.com:state");
if (serializedState === null) {
return this.initializeState();
}
return JSON.parse(serializedState);
}
catch (err) {
return this.initializeState();
}
}
saveState(state) {
try {
let serializedState = JSON.stringify(state);
localStorage.setItem("http://contoso.com:state", serializedState);
}
catch (err) {
}
}
initializeState() {
return {
}
};
}
}
そして、アプリをブートストラップするとき...
import StateLoader from "./state.loader"
const stateLoader = new StateLoader();
let store = createStore(appReducers, stateLoader.loadState());
store.subscribe(() => {
stateLoader.saveState(store.getState());
});
それが誰かを助けることを願っています
パフォーマンスノート
アプリケーションで状態の変更が頻繁に発生する場合、特にシリアル化/逆シリアル化する状態オブジェクトグラフが大きい場合は、ローカルストレージに保存する頻度が高すぎると、アプリケーションのパフォーマンスが低下する可能性があります。このような場合はRxJs
、lodash
などを使用して状態をlocalStorageに保存する関数をデバウンスまたはスロットルすることができます。