Vue實(shí)現(xiàn)實(shí)時(shí)更新sessionStorage數(shù)據(jù)的示例代碼
最近在做一個(gè)需求是:頁面右上角顯示未讀消息數(shù)量,當(dāng)用戶讀過消息后,數(shù)量要時(shí)時(shí)更新。
我這里直接將數(shù)據(jù)存儲在了sessionStorage中,但是當(dāng)我修改數(shù)據(jù)時(shí)頁面并沒有及時(shí)更新,只有刷新頁面后數(shù)據(jù)才會更新。
解決辦法:
1、在main.js中添加全局獲取緩存數(shù)據(jù)
只需修改xxx為自己定義的key即可
Vue.prototype.resetSetItem = function (key, newVal) { if (key === 'xxxx') { // 創(chuàng)建一個(gè)StorageEvent事件 var newStorageEvent = document.createEvent('StorageEvent'); const storage = { setItem: function (k, val) { sessionStorage.setItem(k, val); // 初始化創(chuàng)建的事件 newStorageEvent.initStorageEvent('setItem', false, false, k, null, val, null, null); // 派發(fā)對象 window.dispatchEvent(newStorageEvent) } } return storage.setItem(key, newVal); } }
2.在需要保存數(shù)據(jù)的地方進(jìn)行調(diào)用
(key,value)
this.resetSetItem('xxxxx', value);
3.在需要獲取數(shù)據(jù)的地方進(jìn)行sessionStorage變化監(jiān)聽
mounted:頁面創(chuàng)建的時(shí)候添加監(jiān)聽
beforeDestroy: 在頁面銷毀的時(shí)候移除監(jiān)聽
mounted() { window.addEventListener('setItem', this.updateUnreadMsgCount); },
methods: { updateUnreadMsgCount() { this.unreadMessagesCount = sessionStorage.getItem('xxxxxx'); }, }
beforeDestroy() { window.removeEventListener('setItem', this.updateUnreadMsgCount); },
至此~就可以實(shí)現(xiàn)sessionStorage中的數(shù)據(jù)實(shí)時(shí)更新了
另外一種實(shí)現(xiàn)思路(親測有效~~~):
若是將這個(gè)數(shù)量存儲到vuex的話,刷新頁面數(shù)據(jù)會丟失【但是可以使用vuex數(shù)據(jù)持久化vuex-persistedstate插件解決這一問題,原理也是幫助我們存儲在localStorage或者sessionStorage中,并且vuex中的數(shù)據(jù)變化后頁面也會跟著變化】
vuex中使用vuex-persistedstate插件實(shí)現(xiàn)數(shù)據(jù)持久化
vuex是在中大型項(xiàng)目中必不可少的狀態(tài)管理組件,刷新會重新更新狀態(tài),但是有時(shí)候我們并不希望如此。例如全局相關(guān)的,如登錄狀態(tài)、token、以及一些不常更新的狀態(tài)等,我們更希望能夠固化到本地,減少無用的接口訪問,以及更佳的用戶體驗(yàn)。
- 那么我們可以采用存儲到localStorage的方式來解決這一問題,
- 也可以監(jiān)聽頁面刷新的時(shí)候重新處理數(shù)據(jù)
- 也可以用現(xiàn)在比較流行的插件vuex-persistedstate來解決(其實(shí)他的原理也是存儲在了local storage,但是不用我們手動去處理了)
讓我們來看下使用插件是如何做到持久化的
1.安裝插件
npm i vuex-persistedstate --save
2.之前怎么寫vuex的數(shù)據(jù)管理還怎么寫,只不過在store/index.js文件引入一下這個(gè)插件,并配置即可
這種默認(rèn)寫法會將vuex中的所有數(shù)據(jù)存儲到Local Storage中,
import createPersistedState from 'vuex-persistedstate' export default new Vuex.Store({ // ... plugins: [persistedState()] })
如果我們想存儲到sessionStorage,又或者只想持久化某些數(shù)據(jù)的話,可以使用以下兩個(gè)屬性:
storage和reducer
plugins: [createPersistedState({ storage: window.sessionStorage, reducer(val) { console.log(val) return { // 只儲存state中的includes的leftList數(shù)據(jù)【這里多了一層includes,是因?yàn)楸卷?xiàng)目原因,大家可以打印一下val根據(jù)自己項(xiàng)目情況來賦值】 leftList: val.includes.leftList } } }) ]
完整代碼如下:
測試1:將所有數(shù)據(jù)存儲到Session Storage中
測試2:將某個(gè)數(shù)據(jù)存儲到Local Storage中
另,Vue3中如果項(xiàng)目使用了ts,那么Vuex對ts是不太友好的,可以考慮使用pinia插件代替vuex
到此這篇關(guān)于Vue實(shí)現(xiàn)實(shí)時(shí)更新sessionStorage數(shù)據(jù)的示例代碼的文章就介紹到這了,更多相關(guān)Vue更新sessionStorage數(shù)據(jù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- vue項(xiàng)目如何監(jiān)聽localStorage或sessionStorage的變化
- Vue瀏覽器緩存sessionStorage+localStorage+Cookie區(qū)別解析
- VUE使用localstorage和sessionstorage實(shí)現(xiàn)登錄示例詳解
- vue如何使用cookie、localStorage和sessionStorage進(jìn)行儲存數(shù)據(jù)
- vue+elementui+vuex+sessionStorage實(shí)現(xiàn)歷史標(biāo)簽菜單的示例代碼
- vue監(jiān)聽sessionStorage中值的變化方式
相關(guān)文章
Vue中mintui的field實(shí)現(xiàn)blur和focus事件的方法
今天小編就為大家分享一篇Vue中mintui的field實(shí)現(xiàn)blur和focus事件的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08Vue Router中的冗余導(dǎo)航錯(cuò)誤及解決方案
在現(xiàn)代前端開發(fā)中,單頁應(yīng)用(SPA)已經(jīng)成為主流,而 Vue.js 作為一款流行的前端框架,其官方路由庫 Vue Router 則是構(gòu)建 SPA 的核心工具之一,在使用 Vue Router 的過程中,開發(fā)者可能會遇到一些常見的錯(cuò)誤,本文將深入探討這一錯(cuò)誤的原因、影響以及解決方案2025-01-01vue-router跳轉(zhuǎn)方式的區(qū)別解析
在Vue中,router-link稱為聲明式路由,:to綁定為跳轉(zhuǎn)的目標(biāo)地址,一種是通過name,另一種是path,這篇文章主要介紹了vue-router跳轉(zhuǎn)方式的區(qū)別,需要的朋友可以參考下2022-12-12Vue 項(xiàng)目部署到服務(wù)器的問題解決方法
本篇文章主要介紹了Vue 項(xiàng)目部署到服務(wù)器的問題解決方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-12-12