2019 年 8 月 25 日编辑
如其中一个 cmets 所述。原来的redux-storage 包已移至react-stack。这种方法仍然侧重于实现您自己的状态管理解决方案。
原答案
虽然提供的答案在某些时候是有效的,但重要的是要注意原始的 redux-storage 包已被弃用并且不再维护......
redux-storage 包的原作者决定弃用该项目,不再维护。
现在,如果您不想依赖其他包来避免将来出现此类问题,那么很容易推出自己的解决方案。
您需要做的就是:
1- 创建一个从localStorage 返回状态的函数,然后在第二个参数中将状态传递给createStore 的redux 函数,以便对存储进行水合
const store = createStore(appReducers, state);
2- 监听状态变化,每次状态变化,保存状态到localStorage
store.subscribe(() => {
//this is just a function that saves state to localStorage
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 {
//state object
}
};
}
}
然后在引导您的应用时...
import StateLoader from "./state.loader"
const stateLoader = new StateLoader();
let store = createStore(appReducers, stateLoader.loadState());
store.subscribe(() => {
stateLoader.saveState(store.getState());
});
希望对某人有所帮助
性能说明
如果您的应用程序中的状态更改非常频繁,那么过于频繁地保存到本地存储可能会损害您的应用程序的性能,尤其是在要序列化/反序列化的状态对象图很大的情况下。对于这些情况,您可能需要使用 RxJs、lodash 或类似的东西来去抖动或限制将状态保存到 localStorage 的函数。