Redux router - how to replay state after refresh?

后端 未结 2 801
感情败类
感情败类 2021-01-31 19:42

I have a multi-step form application, and I\'m struggling with getting my head around how I can save my redux state and replay it after a refresh for example? Going back/forward

2条回答
  •  灰色年华
    2021-01-31 19:55

    It looks like you're trying to use a single-page app framework within a multiple-page context. To make the two play nicer together, you could look into making your own middleware that synchronizes state to and from localStorage to create an app that appears to not have lost any state after a refresh/page navigation.

    1. Similar to the way that redux-logger logs both the previous and next states, I'd probably start by plugging in a middleware at the beginning (localStorageLoad) and end (localStorageDump) of the createStoreWithMiddleware function creation (right before redux-logger):
    // store/configureStore.js
    
    const createStoreWithMiddleware = applyMiddleware(
        localStorageLoad, thunk, promise, localStorageDump, logger
    )(createStore);
    
    1. Then fire an initial action right when you initialize your app to load stored state before your app renders:
    // index.js
    
    const store = configureStore();
    
    store.dispatch({ type: 'INIT' });
    
    ReactDOM.render(, document.getElementById('root'));
    

    The localStorageLoad would handle the INIT action and dispatch some sort of SET_STATE action, which would contain a payload with the state that was previously saved in 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);
    }
    

    Then, add a reducer which replaces the state with that payload, effectively rebooting the app as it was previously.

    1. To complete the loop, you'd need a localStorageDump middleware that comes at the end of the chain that saves each reduced state object into localStorage. Something like this:
    // middleware/localStorageDump.js
    
    export default store => next => action => {
        const state = store.getState();
        localStorage.setItem('YOUR_APP_NAME', JSON.stringify(state));
        next(action);
    }
    

    Just an idea, haven't actually tried it. Hope that helps get you started towards a solution.

提交回复
热议问题