Je souhaite conserver certaines parties de mon arborescence d'état dans le localStorage. Quel est le lieu approprié pour le faire? Réducteur ou action?
la source
Je souhaite conserver certaines parties de mon arborescence d'état dans le localStorage. Quel est le lieu approprié pour le faire? Réducteur ou action?
Le réducteur n'est jamais un endroit approprié pour le faire, car les réducteurs doivent être purs et ne pas avoir d'effets secondaires.
Je recommanderais simplement de le faire dans un abonné:
store.subscribe(() => {
// persist your state
})
Avant de créer le magasin, lisez ces parties persistantes:
const persistedState = // ...
const store = createStore(reducer, persistedState)
Si vous utilisez, combineReducers()
vous remarquerez que les réducteurs qui n'ont pas reçu l'état «démarreront» normalement en utilisant leur valeur d' state
argument par défaut . Cela peut être très pratique.
Il est conseillé de supprimer votre abonné afin de ne pas écrire trop rapidement dans localStorage, sinon vous aurez des problèmes de performances.
Enfin, vous pouvez créer un middleware qui encapsule cela comme une alternative, mais je commencerais par un abonné car c'est une solution plus simple et fait bien le travail.
Pour remplir les blancs de la réponse de Dan Abramov, vous pouvez utiliser
store.subscribe()
comme ceci:Avant de créer le magasin, vérifiez
localStorage
et analysez tout JSON sous votre clé comme ceci:Vous passez ensuite cette
persistedState
constante à votrecreateStore
méthode comme ceci:la source
persistedState
retournerinitialState
au lieu d'un objet vide? Sinon, je pense quecreateStore
va initialiser avec cet objet vide.En un mot: middleware.
Découvrez redux-persist . Ou écrivez le vôtre.
[UPDATE 18 Dec 2016] Modifié pour supprimer la mention de deux projets similaires désormais inactifs ou obsolètes.
la source
Si quelqu'un a un problème avec les solutions ci-dessus, vous pouvez écrire le vôtre. Laissez-moi vous montrer ce que j'ai fait. Ignorez les
saga middleware
choses, concentrez-vous simplement sur deux choseslocalStorageMiddleware
et lareHydrateStore
méthode. lelocalStorageMiddleware
tirer tout leredux state
et le met dedanslocal storage
etrehydrateStore
tirez tout leapplicationState
dans le stockage local si présent et le met dedansredux store
la source
localStorage
même si rien dans le magasin n'a changé? Comment compenser les écritures inutilesJe ne peux pas répondre à @Gardezi mais une option basée sur son code pourrait être:
la différence est que nous ne sauvegardons que quelques actions, vous pouvez éventuellement utiliser une fonction anti-rebond pour ne sauvegarder que la dernière interaction de votre état
la source
Je suis un peu en retard mais j'ai implémenté un état persistant selon les exemples cités ici. Si vous souhaitez mettre à jour l'état uniquement toutes les X secondes, cette approche peut vous aider:
Définir une fonction wrapper
Appeler une fonction wrapper dans votre abonné
Dans cet exemple, l'état est mis à jour au maximum toutes les 5 secondes, quelle que soit la fréquence à laquelle une mise à jour est déclenchée.
la source
(state) => { updateLocalStorage(store.getState()) }
danslodash.throttle
comme ceci:store.subscribe(throttle(() => {(state) => { updateLocalStorage(store.getState())} }
et de supprimer la logique de vérification de temps à l' intérieur.S'appuyant sur les excellentes suggestions et extraits de code courts fournis dans d'autres réponses (et l'article Medium de Jam Creencia ), voici une solution complète!
Nous avons besoin d'un fichier contenant 2 fonctions qui sauvegardent / chargent l'état vers / depuis le stockage local:
Ces fonctions sont importées par store.js où nous configurons notre boutique:
REMARQUE: vous devrez ajouter une dépendance:
npm install lodash.throttle
Le magasin est importé dans index.js afin qu'il puisse être transmis au fournisseur qui encapsule App.js :
Notez que les importations absolues nécessitent cette modification de YourProjectFolder / jsconfig.json - cela lui indique où chercher les fichiers s'il ne peut pas les trouver au début. Sinon, vous verrez des plaintes concernant la tentative d'importer quelque chose de l'extérieur de src .
la source