我有一个多步骤表单应用程序,我正在努力解决如何保存我的redux状态并在刷新后重播它的例子?在应用程序中返回/转发按预期工作,但在浏览器刷新后,我之前的状态为空。理想情况下,我希望能够保存与路径相关的会话存储中的先前状态,以便我可以稍后重播,但我不知道如何轻松地做到这一点。有没有人这样做过,可以提供一些指示?谢谢。
答案 0 :(得分:36)
看起来您正试图在多页面上下文中使用单页面应用程序框架。为了使两者更好地结合在一起,您可以考虑制作自己的中间件,使状态与localStorage
同步,以创建一个在刷新/页面导航后似乎没有丢失任何状态的应用程序。
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'));
localStorageLoad
将处理INIT
操作并发送某种SET_STATE
操作,该操作将包含以前保存在localStorage
中的状态的有效内容。< / p>
// 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);
}
然后,添加一个reducer,用该有效负载替换状态,有效地重新启动应用程序,就像以前一样。
localStorageDump
中间件,它位于链的末尾,将每个简化状态对象保存到localStorage
。这样的事情:// middleware/localStorageDump.js
export default store => next => action => {
const state = store.getState();
localStorage.setItem('YOUR_APP_NAME', JSON.stringify(state));
next(action);
}
只是一个想法,还没有真正尝试过。希望有助于您开始寻求解决方案。
答案 1 :(得分:3)
您无法在刷新时存储状态这是正常的。通常,您将这些存储在cookie或Web存储中。
终极版:
Form
组件,请使用componentWillMount
方法将localstorage
和dispatch
数据读取到减速器如果使用redux存储表单数据,则调度localstorage的属性。
如果没有读取Form
组件中的localstorage并设置初始值。
希望这有帮助!