J'essaie de surveiller le stockage local:
Modèle:
<p>token - {{token}}</p>
Scénario:
computed: {
token() {
return localStorage.getItem('token');
}
}
Mais cela ne change pas lorsque token
change. Uniquement après avoir actualisé la page.
Existe-t-il un moyen de résoudre ce problème sans utiliser Vuex ou la gestion d'état?
Chose sûre! À mon avis, la meilleure pratique consiste à utiliser la syntaxe getter / setter pour encapsuler le stockage local.
Voici un exemple de travail:
HTML:
<div id="app">
{{token}}
<button @click="token++"> + </button>
</div>
JS:
new Vue({
el: '#app',
data: function() {
return {
get token() {
return localStorage.getItem('token') || 0;
},
set token(value) {
localStorage.setItem('token', value);
}
};
}
});
Et un JSFiddle .
Si vous voulez éviter le passe-partout (syntaxe getter/setter), utilisez vue-persistent-state pour obtenir un état persistant réactif.
Par exemple:
import persistentState from 'vue-persistent-state';
const initialState = {
token: '' // will get value from localStorage if found there
};
Vue.use(persistentState, initialState);
new Vue({
template: '<p>token - {{token}}</p>'
})
token
est désormais disponible en tant que données dans tous les composants et Vue instances. Toute modification de this.token
sera stocké dans localStorage, et vous pouvez utiliser this.token
comme vous le feriez dans une application Vanilla Vue.
Le plugin est essentiellement watcher et localStorage.set
. Vous pouvez lire le code ici . Il
initialState
disponible dans toutes les instances Vue, etAvertissement : je suis l'auteur de vue-persistent-state .
Le site VueJs a une page à ce sujet. https://vuejs.org/v2/cookbook/client-side-storage.html
Ils en donnent un exemple. Compte tenu de ce modèle html
<template>
<div id="app">
My name is <input v-model="name">
</div>
<template>
Ils fournissent cette utilisation de la méthode du cycle de vie mounted
et d'un observateur.
const app = new Vue({
el: '#app',
data: {
name: ''
},
mounted() {
if (localStorage.name) {
this.name = localStorage.name;
}
},
watch: {
name(newName) {
localStorage.name = newName;
}
}
});
La méthode mounted
vous assure que name
est défini à partir du stockage local s'il existe déjà, et l'observateur permet à votre composant de réagir chaque fois que le nom dans le stockage local est modifié. Cela fonctionne bien lorsque des données dans le stockage local sont ajoutées ou modifiées, mais Vue ne réagira pas si quelqu'un efface manuellement leur stockage local.
vous pouvez le faire de deux manières,
en utilisant vue-ls puis en ajoutant l'écouteur sur les clés de stockage, avec
Vue.ls.on('token', callback)
ou
this.$ls.on('token', callback)
en utilisant l'écouteur d'événements de stockage du DOM:
document.addEventListener('storage', storageListenerMethod);