私はローカルストレージを監視しようとしています:
テンプレート:
<p>token - {{token}}</p>
スクリプト:
computed: {
token() {
return localStorage.getItem('token');
}
}
ただし、token
が変更されても変更されません。ページを更新した後にのみ。
Vuexまたは状態管理を使用せずにこれを解決する方法はありますか?
確実なこと!私の意見では、ベストプラクティスは getter / setter 構文を使用してlocalstorageをラップすることです。
これが実際の例です:
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);
}
};
}
});
JSFiddle 。
ボイラープレート(getter/setter-syntax)を避けたい場合は、 vue-persistent-state を使用してリアクティブな永続状態を取得します。
例えば:
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
がすべてのコンポーネントおよびVueインスタンスのデータとして使用可能になりました。this.token
はlocalStorageに保存され、this.token
バニラVueアプリでのように。
プラグインは基本的にウォッチャーであり、localStorage.set
。コードを読むことができます here 。それ
initialState
を使用可能にします。免責事項:私は vue-persistent-state の著者です。
VueJsサイトにはこれに関するページがあります。 https://vuejs.org/v2/cookbook/client-side-storage.html
それらは例を提供します。このhtmlテンプレートを考える
<template>
<div id="app">
My name is <input v-model="name">
</div>
<template>
ライフサイクルmounted
メソッドとウォッチャーのこの使用を提供します。
const app = new Vue({
el: '#app',
data: {
name: ''
},
mounted() {
if (localStorage.name) {
this.name = localStorage.name;
}
},
watch: {
name(newName) {
localStorage.name = newName;
}
}
});
mounted
メソッドは、name
が既に存在する場合はローカルストレージから設定されることを保証し、ウォッチャーはローカルストレージの名前が変更されるたびにコンポーネントが反応できるようにします。これは、ローカルストレージのデータが追加または変更された場合は正常に機能しますが、誰かがローカルストレージを手動でワイプしてもVueは反応しません。
あなたは2つの方法でそれを行うことができます、
vue-ls を使用し、ストレージキーにリスナーを追加して、
Vue.ls.on('token', callback)
または
this.$ls.on('token', callback)
dOMのストレージイベントリスナーを使用して:
document.addEventListener('storage', storageListenerMethod);