看起来您正在尝试在多页面上下文中使用单页面应用程序框架。为了使两者更好地配合,您可以考虑制作自己的中间件来同步状态localStorage
创建一个在刷新/页面导航后似乎没有丢失任何状态的应用程序。
- 类似于这样的方式redux-logger https://github.com/fcomb/redux-logger logs 前一个和后一个状态 https://github.com/fcomb/redux-logger/blob/master/src/index.js#L48,我可能会从一开始插入中间件开始(
localStorageLoad
)和结束(localStorageDump
) 的createStoreWithMiddleware
函数创建(就在redux-logger
):
// store/configureStore.js
const createStoreWithMiddleware = applyMiddleware(
localStorageLoad, thunk, promise, localStorageDump, logger
)(createStore);
- 然后,当您初始化应用程序以在应用程序渲染之前加载存储的状态时,立即触发初始操作:
// index.js
const store = configureStore();
store.dispatch({ type: 'INIT' });
ReactDOM.render(<App />, document.getElementById('root'));
The localStorageLoad
将处理INIT
行动并派遣某种SET_STATE
操作,其中将包含具有先前保存的状态的有效负载localStorage
.
// middleware/localStorageLoad.js
export default store => next => action => {
const { type } = action;
if (type === 'INIT') {
try {
const storedState = JSON.parse(
localStorage.getItem('YOUR_APP_NAME')
);
if (storedState) {
store.dispatch({
type: 'RESET_STATE',
payload: storedState
});
}
return;
} catch (e) {
// Unable to load or parse stored state, proceed as usual
}
}
next(action);
}
然后,添加一个减速器,用该有效负载替换状态,从而有效地像以前一样重新启动应用程序。
- 要完成循环,您需要一个
localStorageDump
位于链末端的中间件,将每个简化状态对象保存到localStorage
。像这样的事情:
// middleware/localStorageDump.js
export default store => next => action => {
const state = store.getState();
localStorage.setItem('YOUR_APP_NAME', JSON.stringify(state));
next(action);
}
只是一个想法,还没有实际尝试过。希望这有助于您开始寻找解决方案。