Routeur Redux - comment rejouer l'état après rafraîchissement?

j'ai une application de formulaire en plusieurs étapes, et j'ai du mal à comprendre comment je peux sauver mon état de redux et le rejouer après un rafraîchissement par exemple? Aller en arrière/en avant dans l'application fonctionne comme prévu, mais après actualiser de votre navigateur, mon état précédent est vide. Idéalement, j'aimerais pouvoir sauvegarder l'état précédent dans le stockage de session relatif à un chemin, de sorte que je puisse rejouer plus tard, mais je ne vois pas comment je peux le faire aussi facilement. Quelqu'un a fait quelque chose comme cela et peut fournir un certain les pointeurs? Grâce.

19
demandé sur Lee 2015-12-02 12:09:30

2 réponses

on dirait que vous essayez d'utiliser un cadre d'application d'une seule page dans un contexte de plusieurs pages. Pour rendre les deux jouer plus agréable ensemble, vous pourriez envisager de faire votre propre middleware qui synchronise l'État à et de localStorage pour créer une application qui semble n'avoir perdu aucun état après un rafraîchissement/navigation de page.

  1. de la même manière que redux-enregistreur journaux les États précédent et suivant, je commencerais probablement par me brancher un middleware au début (localStorageLoad) et de fin (localStorageDump de l'createStoreWithMiddleware création de fonction (juste avant redux-logger):
// store/configureStore.js

const createStoreWithMiddleware = applyMiddleware(
    localStorageLoad, thunk, promise, localStorageDump, logger
)(createStore);
  1. puis lancez une action initiale dès que vous initialisez votre application pour charger l'état stocké avant que votre application ne rende:
// index.js

const store = configureStore();

store.dispatch({ type: 'INIT' });

ReactDOM.render(<App />, document.getElementById('root'));

localStorageLoad poignée INIT action et d'expédition une sorte de SET_STATE action, qui contiendrait une charge utile avec l'état précédemment enregistré 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);
}

puis, Ajouter un réducteur qui remplace l'état par cette charge utile, redémarrant effectivement l'application comme elle l'était auparavant.

  1. Pour compléter la boucle, vous auriez besoin d'un localStorageDump middleware qui vient à la fin de la chaîne qui enregistre chaque état réduit objet dans localStorage. Quelque chose comme ceci:
// middleware/localStorageDump.js

export default store => next => action => {
    const state = store.getState();
    localStorage.setItem('YOUR_APP_NAME', JSON.stringify(state));
    next(action);
}

Juste une idée, n'ai pas réellement essayé. L'espoir qui aide à obtenir vous avez commencé à trouver une solution.

35
répondu bosgood 2015-12-02 16:42:16

Vous ne pouvez pas stocker l'état lors de l'actualisation, c'est normal. Généralement, vous stockez ces cookies à l'intérieur ou de stockage web.

  • les Cookies sont synchronisés entre le navigateur, le serveur et sont configurés sur chaque requête que vous effectuez.
  • Localstorage vous donne jusqu'à 5 MO pour stocker des données et n'est jamais envoyer avec la demande.

Redux:

  1. définir les propriétés localstorage lors du remplissage du formulaire. (assurez-vous de nettoyer quand complète)
  2. rafraîchir la page avec un formulaire incomplet.
  3. quand react Monte votre Form composant, utilisez componentWillMount méthode pour lire le localstorage et dispatch les données à un réducteur
  4. le réducteur met à jour l'état redux qui à son tour met à jour le composant avec les propriétés que vous avez obtenues de localstorage.

si vous utilisez redux pour stocker les données du formulaire dispatch les propriétés de localstorage.

Si pas de lire le localstorage à l'intérieur de la Form composant et définir les valeurs initiales.

Espérons que cette aide !

3
répondu JensDebergh 2015-12-02 10:47:13