156 votes

État de Vuex lors du rafraîchissement de la page

Mon application utilise l'API Firebase pour l'authentification des utilisateurs, enregistrant le statut de connexion comme une valeur booléenne dans un état Vuex.

Lorsque l'utilisateur se connecte, je définis le statut de connexion et j'affiche conditionnellement le bouton Connexion/Déconnexion en conséquence.

Mais lorsque la page est rafraîchie, l'état de l'application vue est perdu et réinitialisé par défaut

Cela pose un problème car même lorsque l'utilisateur est connecté et que la page est rafraîchie, le statut de connexion est à nouveau défini sur false et le bouton de connexion est affiché au lieu du bouton de déconnexion, même si l'utilisateur reste connecté....

Que dois-je faire pour empêcher ce comportement

Dois-je utiliser des cookies Ou une autre meilleure solution est disponible...

-

3 votes

Je n'utilise aucun type de stockage local pour gérer cela. Il peut s'agir de Cookies ou autre chose

0 votes

@El_Matella à part les cookies, quel autre méthode utilisez-vous pour stocker des données localement

1 votes

En général, j'utilise un package npm de stockage local qui peut choisir la meilleure méthode pour stocker les données pour moi : npmjs.com/package/local-storage "L'API est un moyen simplifié d'interagir avec tout ce qui concerne le stockage local. Notez que lorsque le stockage local n'est pas pris en charge dans le navigateur actuel, un stockage en mémoire est utilisé de manière transparente."

144voto

sobolevn Points 5397

Ceci est un cas d'utilisation connu. Il existe différentes solutions.

Par exemple, on peut utiliser vuex-persistedstate. Il s'agit d'un plugin pour vuex pour gérer et stocker l'état entre les rafraîchissements de page.

Code d'exemple:

import { Store } from 'vuex'
import createPersistedState from 'vuex-persistedstate'
import * as Cookies from 'js-cookie'

const store = new Store({
  // ...
  plugins: [
    createPersistedState({
      getState: (key) => Cookies.getJSON(key),
      setState: (key, state) => Cookies.set(key, state, { expires: 3, secure: true })
    })
  ]
})

Ce que nous faisons ici est simple:

  1. vous devez installer js-cookie
  2. sur getState nous essayons de charger l'état sauvegardé depuis Cookies
  3. sur setState nous sauvegardons notre état dans Cookies

Documentation et instructions d'installation: https://www.npmjs.com/package/vuex-persistedstate

0 votes

Merci... Venait de jeter un coup d'œil à la page github du plugin... Merci encore une fois

9 votes

Avez-vous besoin de faire quelque chose de spécifique pour définir / obtenir les données ? Lors du rechargement, mes données sont réinitialisées aux valeurs par défaut. J'ai simplement essayé de définir via this.$store.state.user, en utilisant des objets et des chaînes simples - sans succès.

7 votes

Parce que les cookies sont tranmis entre le client et le serveur, je regarderais probablement le stockage local à la place ...

105voto

James Westgate Points 6789

Lors de la création de votre état VueX, enregistrez-le dans la session de stockage en utilisant le plugin vuex-persistedstate. De cette manière, les informations seront perdues lorsque le navigateur est fermé. Évitez d'utiliser les cookies car ces valeurs voyageront entre le client et le serveur.

import Vue from 'vue'
import Vuex from 'vuex'
import createPersistedState from 'vuex-persistedstate'

Vue.use(Vuex);

export default new Vuex.Store({
    plugins: [createPersistedState({
        storage: window.sessionStorage,
    })],
    state: {
        //....
    }
});

Utilisez sessionStorage.clear(); lorsque l'utilisateur se déconnecte manuellement.

REMARQUE : Notez que si votre magasin contient des valeurs qui ne sont pas intrinsèquement de type chaîne de caractères (par exemple des dates), votre application peut échouer ou le comportement peut changer car le processus de sérialisation/désérialisation convertira ces valeurs en chaînes de caractères.

19 votes

Je suis surpris que la solution des cookies reçoive autant d'étoiles. Je pense que cette solution est bien meilleure car elle efface automatiquement tout l'état lorsque la fenêtre du navigateur est fermée. Je n'aime pas envoyer mes données d'état sous forme de cookies au serveur, et je ne veux pas non plus conserver des données sensibles lorsque la fenêtre du navigateur se ferme.

0 votes

Vous êtes également limité à 8k au total avec vos en-têtes, y compris les cookies.

2 votes

@MarkHagers et il est pris en charge nativement depuis IE8 ! Pas besoin de charger du code supplémentaire.

27voto

Rijo K P Points 775

L'état Vuex est conservé en mémoire. Le chargement de la page purgera cet état actuel. C'est pourquoi l'état ne persiste pas lors du rechargement.

Mais le vuex-persistedstate plugin résout ce problème

npm install --save vuex-persistedstate

Importez maintenant ceci dans le store.

import Vue from 'vue'
import Vuex from 'vuex'
import account from './modules/account'
import createPersistedState from "vuex-persistedstate";

Vue.use(Vuex);

const store = new Vuex.Store({
  modules: {
    account,
  },
  plugins: [createPersistedState()]
});

Cela a fonctionné parfaitement avec une seule ligne de code : plugins: [createPersistedState()]

2 votes

Avec vuex créer un magasin: const magasin = createStore({ /*...*/ plugins: [createPersistedState()], });

1 votes

C'est la démarche la plus simple sans ajouter un autre paquet. Cela fonctionne!

0 votes

Fonctionne parfaitement! Par défaut, l'état est sauvegardé dans localStorage sous la clé vuex.

13voto

oahehc Points 91

Je pense que l'utilisation de cookies/localStorage pour sauvegarder le statut de connexion pourrait causer des erreurs dans certaines situations.
Firebase enregistre déjà les informations de connexion dans localStorage pour nous, y compris expirationTime et refreshToken.
Par conséquent, j'utiliserai le hook créé de Vue et l'api Firebase pour vérifier le statut de connexion.
Si le jeton a expiré, l'api actualisera le jeton pour nous.
Ainsi, nous sommes sûrs que le statut de connexion affiché dans notre application est identique à celui de Firebase.

new Vue({
    el: '#app',
    created() {
        firebase.auth().onAuthStateChanged((user) => {
            if (user) {
                log('L'utilisateur est connecté');
                // mettre à jour les données ou l'état de vuex
            } else {
                log('L'utilisateur n\'est pas connecté.');
            }
        });
    },
});

0 votes

La meilleure approche officielle et recommandée contre cette situation

13voto

Leonardo Filipe Points 143

Mettre sur l'état :

producteur : JSON.parse(localStorage.getItem('producteur') || "{}")

mettre sur les mutations :

localStorage.setItem("producteur",JSON.stringify(state.producteur)) // OU
localStorage.removeItem("producteurs");

fonctionne bien pour moi !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X