LocalStorage是由HTML5提供的一種客戶端存儲方式,可以在本地瀏覽器中存儲數(shù)據(jù)。在Vue中,我們通常使用LocalStorage來保存一些臨時(shí)數(shù)據(jù)或者用戶信息等。但是,LocalStorage的數(shù)據(jù)修改是被動的,我們需要手動去監(jiān)聽并更新Vue的數(shù)據(jù),否則Vue中的數(shù)據(jù)就會和LocalStorage的數(shù)據(jù)不同步,導(dǎo)致數(shù)據(jù)出現(xiàn)異常。
如何實(shí)現(xiàn)Vue對LocalStorage的監(jiān)聽呢?我們可以通過Vue的mixins,將監(jiān)聽LocalStorage的代碼混入到Vue中,在Vue中實(shí)現(xiàn)對LocalStorage的動態(tài)監(jiān)聽。
export default { mixins: [ { mounted() { window.addEventListener('storage', this._localStorageChange); }, beforeDestroy() { window.removeEventListener('storage', this._localStorageChange); }, methods: { _localStorageChange(event) { if (event.key === 'keyOfLocalStorage') { // 從LocalStorage中讀取數(shù)據(jù)并更新Vue中的數(shù)據(jù) this.$data.someData = JSON.parse(event.newValue); } }, }, }, ], };
在這段代碼中,我們使用mixins將LocalStorage監(jiān)聽方法混入到Vue的生命周期函數(shù)中。在Vue實(shí)例中,mounted()表示組件實(shí)例掛載到DOM元素上時(shí)運(yùn)行的方法,beforeDestroy()表示組件實(shí)例銷毀前運(yùn)行的方法。
在mounted()方法中,我們使用window.addEventListener()為LocalStorage設(shè)置監(jiān)聽事件,當(dāng)LocalStorage中的數(shù)據(jù)發(fā)生改變時(shí),便會觸發(fā)這個(gè)事件。我們將監(jiān)聽事件的方法設(shè)置為this._localStorageChange,也就是下面的方法。
在_beforeDestroy()中,我們使用window.removeEventListener()來移除LocalStorage監(jiān)聽事件。
在_localStorageChange()方法中,我們先判斷觸發(fā)事件的key是否為我們監(jiān)聽的keyOfLocalStorage,如果匹配上,則將LocalStorage中的數(shù)據(jù)讀取出來,由于LocalStorage存儲的是字符串,所以要使用JSON.parse()來轉(zhuǎn)化為對象,并將對象更新到Vue實(shí)例中的someData數(shù)據(jù)中。
通過這種方式實(shí)現(xiàn)對LocalStorage的監(jiān)聽,可以保證Vue中的數(shù)據(jù)和LocalStorage中的數(shù)據(jù)實(shí)時(shí)同步,不會出現(xiàn)數(shù)據(jù)不一致的情況。