Vuex資料頁面重新整理丟失問題解決方案
用Vue做專案開發很久了,對於vuex能用、會用,但是因為狀態脫離頁面和重新整理丟失兩個原因,一直都有種牴觸,特別是一些簡單的資料都是透過query或者本地儲存就解決了,然而對於一些複雜內容,不可避免的還是要使用Vuex去處理(真香),但是重新整理丟失的問題,的確叫人頭大。最近閒下來,我們來研究下怎麼幹掉這個問題~
不大瞭解Vuex的同學,可以
由於Vuex的資料是儲存在記憶體中的,相當於memory cache,當頁面重新整理的時候記憶體被清空過載新內容,原來的資料就丟了,為了解決這個我們可以藉助瀏覽器的本地儲存來解決,此時我們有兩個選擇
localStorage 真·持久儲存
sessionStorage 會話期儲存
相比之下localStorage太持久了,不主動清除都會一直在,而sessionStorage更符合Vuex會話期狀態管理的設計初衷。因此下文中統一使用sessionStorage來做補充,解決問題。
有了補充物件之後,我們要做的只有兩點
1、每次在mutation中set state的時候,同步的塞到sessionStorage一份
2、狀態初始化的時候,從sessionStorage中讀取相應內容並作為預設值(存在的話)
看起來很簡單,於是第一版方案有了,
export default new Vuex.Store({ state: { userLevel: sessionStorage.getItem('userLevel') || '' }, mutations: { SET_USERLEVEL(state, userLevel) { sessionStorage.setItem('userLevel', userLevel) state.userLevel = userLevel } }, modules: { } })
這個是解決問題了,但是每個mutation都要sessionStorage.setItem一下實在有點麻煩,而且初始化還要都getItem一遍,我很懶不想寫。。。於是我們改進了第二版
const storeMaker = (state) => { // 初始化 Object.keys(state).map((key) => { // 判斷型別獲取本地儲存資料 if (typeof state[key] === 'object') { if (sessionStorage.getItem(key) && JSON.parse(sessionStorage.getItem(key))) { state[key] = JSON.parse(sessionStorage.getItem(key)) } } else if (typeof state[key] === 'number') { if (sessionStorage.getItem(key) && parseInt(sessionStorage.getItem(key))) { state[key] = parseInt(sessionStorage.getItem(key)) } } else { if (sessionStorage.getItem(key)) { state[key] = sessionStorage.getItem(key) } } }) // 重寫set處理 return new Proxy(state, { set: function(target, key, value) { let temp = value if (typeof temp === 'object') { temp = JSON.stringify(temp) } sessionStorage.setItem(key, temp) return Reflect.set(target, key, value) } }) }export default new Vuex.Store({ state: storeMaker({ userLevel: '' }), mutations: { SET_USERLEVEL(state, userLevel) { state.userLevel = userLevel } }, modules: { } })
內容不多,主要定義了一個storeMaker的函式實現了兩個功能
1、對傳入的state初始值判斷型別,並嘗試從sessionStorage中讀取資料替換預設值
2、透過Proxy重置state的set邏輯,新增同步儲存到sessionStorage的邏輯
其實本來可以透過Proxy重置get邏輯處理取值的問題,但是由於vuex本身透過defineProperty函式重置了get邏輯,在這裡使用proxy覆蓋會有衝突,因此在初始化的時候直接讀取sessionStorage。
同時也存在一些問題:
1、目前只處理了一級屬性,二級以下屬性沒處理,對於初始化會有偏差。對於這點處理層級也不宜過深,因為過深的結構設計本來就並不合理,兩層基本也足夠了。基本處理就是對於state的每個key再去遍歷一遍,如果是object(非null非陣列非空物件)就重新proxy一下
2、可以嘗試打包成npm包,或者寫成Vuex的外掛形式,方便使用
3、等等
~狀態不好,先寫到這,大家有興趣一起來討論,清清腦子再來補充~
聯想到的一些點:
1、memory cache和disk cache?記憶體怎麼清理?js垃圾回收機制?
2、SessionStorage怎麼做到會話期快取?
3、session機制怎麼回事?
4、http的無狀態?狀態保持?客戶端保持?服務端保持?
5、等等等等
發散開看看,一個地方真的能學到很多東西。。。
原文出處:https://www.cnblogs.com/heioray/p/10284268.html 、
作者:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4328/viewspace-2820877/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- vuex頁面重新整理資料丟失的解決辦法Vue
- vuex頁面重新整理後資料丟失Vue
- vue傳參頁面重新整理資料丟失問題Vue
- vuex配sessionStorage進行自動儲存,解決重新整理資料丟失的問題。VueSession
- JS頁面重新整理保持資料不丟失JS
- vue.js頁面重新整理及後退引數丟失的解決方案Vue.js
- vue重新整理頁面丟失404Vue
- 頁面跳轉時,統計資料丟失問題探討
- Vuex持久化外掛(vuex-persistedstate)-解決重新整理資料消失的問題Vue持久化
- Vuex持久化外掛-解決重新整理資料消失的問題Vue持久化
- eladmin 打包專案放到頁面重新整理丟失頁面
- react-router browserHistory重新整理頁面404問題解決React
- RocketMq訊息丟失問題解決MQ
- 資料庫高可靠,輕鬆解決事務丟失問題資料庫
- Android資料庫升級不丟失資料解決方案Android資料庫
- 解決瀏覽器返回頁面不重新整理的問題瀏覽器
- 解決Oracle資料庫日誌檔案丟失恢復問題Oracle資料庫
- 用getChildFragmentManager解決Fragment巢狀Fragment資料丟失的問題Fragment巢狀
- dfm檔案資料丟失問題
- Golang浮點數精度丟失問題擴充套件包解決方案Golang套件
- 記錄--前端金額運算精度丟失問題及解決方案前端
- 用指令碼解決ASP.NET頁面重新整理問題 (轉)指令碼ASP.NET
- 小程式頁面返回重新整理資料onLoad和onShow頁面傳參解決
- PHP中SESSION丟失(不能跨頁面傳遞)解決辦法PHPSession
- 硬碟資料丟失原因和解決方案/資料恢復方法硬碟資料恢復
- Django資料庫連線丟失問題Django資料庫
- JavaScript精度丟失原因以及解決方案JavaScript
- cassandra tombstone導致寫資料丟失問題徵解
- JavaScript中解決計算精度丟失的問題JavaScript
- SpringCloud解決feign呼叫token丟失問題SpringGCCloud
- 伺服器資料恢復方法-RAID資訊丟失解決方案伺服器資料恢復AI
- 完美解決方案-雪花演算法ID到前端之後精度丟失問題演算法前端
- PbootCMS前端頁面樣式丟失boot前端
- 資料庫層面問題解決思路資料庫
- 解決vue專案部署到Nginx重新整理頁面報404的問題VueNginx
- Jison解決JS處理後端返回的Long型資料精度丟失問題JS後端
- Web-請求資料+號丟失問題Web
- dg 主庫丟失歸檔 解決方案