詳解Vue中l(wèi)ocalstorage和sessionstorage的使用
1. 項(xiàng)目使用中暴露出來(lái)的幾個(gè)問(wèn)題
大家到處直接使用localstorage['aaa']='這是一段示例字符串'這些原生語(yǔ)法實(shí)現(xiàn),這樣耦合度太高了,假如有一天我們需要換實(shí)現(xiàn)方式,或者對(duì)存儲(chǔ)大小做一些控制,那么需要修改的代碼就會(huì)很多
項(xiàng)目很大,那么大家起的key的名字難免會(huì)重復(fù),而且這樣也會(huì)造成全局污染
因?yàn)閘ocalstorage的使用不規(guī)范,所以造成了存儲(chǔ)空間的浪費(fèi)和不夠用
2. 解決辦法
封裝storage的使用方法,統(tǒng)一處理
規(guī)范storage的key值的命名規(guī)則
規(guī)范storage的使用規(guī)范
2.1. 封裝統(tǒng)一的方法
封裝成方法可以降低耦合度,可以方便切換實(shí)現(xiàn)方式,可以控制存儲(chǔ)量大小
改變實(shí)現(xiàn)可以通過(guò)配置不同的參數(shù)來(lái)實(shí)現(xiàn)
編輯如圖所示的項(xiàng)目結(jié)構(gòu)
代碼實(shí)現(xiàn)
/* * storage.js */ /* * @Author: 石國(guó)慶 * @Desc: 本地?cái)?shù)據(jù)存儲(chǔ)方法封裝 * @Date: 2017.11.14 * @Ref: * https://github.com/WQTeam/web-storage-cache * https://developer.mozilla.org/en-US/docs/Web/API/Storage/LocalStorage * @Explain:為了不new對(duì)象,只能多寫幾遍 * @Example: * * 1、LocalStorage的使用 * import storage from '@/utils/storage.js' * storage.setItem('shiguoqing0',[1,2,3,4,5,6]) * storage.setItem('shiguoqing1',{userId:'dfdf',token:11232323}) * storage.setItem('shiguoqing2','dfdfdf') * console.log(storage.getItem('shiguoqing0')) * console.log(storage.getItem('shiguoqing1')) * console.log(storage.getItem('shiguoqing2')) * storage.removeItem('shiguoqing2') * * * 2、SessionStorage的使用 * storage.setItem('shiguoqing0',[1,2,3,4,5,6],{type:'session'}) * * */ // TODO:其他方法的實(shí)現(xiàn) // TODO:超時(shí)時(shí)間的設(shè)置 /* * 方法實(shí)現(xiàn) * */ import local from './storage/localstorage.js' import session from './storage/session.js' import cookies from './storage/cookies.js' import json from './storage/json.js' /* * 函數(shù)體 * */ let storage= { config:{ type:'local',// local,session,cookies,json expires:new Date().getTime() + 100 * 24 * 60 * 60 * 1000 }, getStorage(options){ let config={} if(options){ config=Object.assign({},this.config,options) }else{ config=this.config } return this.createStorage(config.type) }, createStorage(name){ switch(name){ case 'local':return local;break case 'session':return session;break case 'cookies':return cookies;break case 'json':return json;break } }, getItem(key,options){ let store=this.getStorage(options) return store.getItem(key) }, setItem(key, value,options){ let store=this.getStorage(options) store.setItem(key,value) }, removeItem(key,options){ let store=this.getStorage(options) store.removeItem(key) }, getAll(){}, clear(options){ let store=this.getStorage(options) store.clear() }, key(n){}, lenght(){}, has(key){}, forEach(cb){}, deleteAllExpires(){}, // 獲取最大存儲(chǔ)空間:只有LocalStorage和SessionStorage可以使用這個(gè)方法 getMaxSpace(options){ let store=this.getStorage(options) store.getMaxSpace() }, // 獲取使用了的空間:只有LocalStorage和SessionStorage可以使用這個(gè)方法 getUsedSpace(options){ let store=this.getStorage(options) store.getUsedSpace() } } export default storage // https://segmentfault.com/a/1190000002458488 // 5、遍歷localStorage存儲(chǔ)的key // .length 數(shù)據(jù)總量,例:localStorage.length // .key(index) 獲取key,例:var key=localStorage.key(index); // 備注:localStorage存數(shù)的數(shù)據(jù)是不能跨瀏覽器共用的,一個(gè)瀏覽器只能讀取各自瀏覽器的數(shù)據(jù),儲(chǔ)存空間5M。 // 超時(shí)設(shè)置 // function(st, key, value, expires) { // if (st == 'l') { // st = window.localStorage; // expires = expires || 60; // } else { // st = window.sessionStorage; // expires = expires || 5; // } // if (typeof value != 'undefined') { // try { // return st.setItem(key, JSON.stringify({ // data: value, // expires: new Date().getTime() + expires * 1000 * 60 // })); // } catch (e) {} // } else { // var result = JSON.parse(st.getItem(key) || '{}'); // if (result && new Date().getTime() < result.expires) { // return result.data; // } else { // st.removeItem(key); // return null; // } // } // }
/* * localstorage.js * localstorage的實(shí)現(xiàn) */ // 這個(gè)有點(diǎn)奇怪,文件名稱叫l(wèi)ocal.js不能按照js文件解析 export default { getItem(key){ let item = localStorage.getItem(key) // 這點(diǎn)要判斷是字符串還是對(duì)象 let result = /^[{\[].*[}\]]$/g.test(item) if (result) { return JSON.parse(item) } else { return item } }, setItem(key, value){ // 這點(diǎn)要判斷是字符串還是對(duì)象 if (typeof value == "string") { localStorage.setItem(key, value) } else { let item = JSON.stringify(value) localStorage.setItem(key, item) } }, removeItem(key){ localStorage.removeItem(key) }, getAll(){}, clear(){ localStorage.clear() }, key(n){}, forEach(cb){}, has(key){}, deleteAllExpires(){}, // 獲取localstorage最大存儲(chǔ)容量 getMaxSpace(){ if (!window.localStorage) { console.log('當(dāng)前瀏覽器不支持localStorage!') } var test = '0123456789' var add = function (num) { num += num if (num.length == 10240) { test = num return } add(num) } add(test) var sum = test var show = setInterval(function () { sum += test try { window.localStorage.removeItem('test') window.localStorage.setItem('test', sum) console.log(sum.length / 1024 + 'KB') } catch (e) { console.log(sum.length / 1024 + 'KB超出最大限制') clearInterval(show) } }, 0.1) }, // 獲取使用了的localstorage的空間 getUsedSpace(){ if (!window.localStorage) { console.log('瀏覽器不支持localStorage') } var size = 0 for (item in window.localStorage) { if (window.localStorage.hasOwnProperty(item)) { size += window.localStorage.getItem(item).length } } console.log('當(dāng)前l(fā)ocalStorage使用容量為' + (size / 1024).toFixed(2) + 'KB') } }
/* * session.js * sessionstorage的實(shí)現(xiàn) */ export default { getItem(key){ let item = sessionStorage.getItem(key) // 這點(diǎn)要判斷是字符串還是對(duì)象 let result = /^[{\[].*[}\]]$/g.test(item) if (result) { return JSON.parse(item) } else { return item } }, setItem(key, value){ // 這點(diǎn)要判斷是字符串還是對(duì)象 if (typeof value == "string") { sessionStorage.setItem(key, value) } else { let item = JSON.stringify(value) sessionStorage.setItem(key, item) } }, removeItem(key){ sessionStorage.removeItem(key) }, getAll(){}, clear(){ sessionStorage.clear() }, key(n){}, forEach(cb){}, has(key){}, deleteAllExpires(){}, // 獲取localstorage最大存儲(chǔ)容量 getMaxSpace(){ if (!window.sessionStorage) { console.log('當(dāng)前瀏覽器不支持sessionStorage!') } var test = '0123456789' var add = function (num) { num += num if (num.length == 10240) { test = num return } add(num) } add(test) var sum = test var show = setInterval(function () { sum += test try { window.sessionStorage.removeItem('test') window.sessionStorage.setItem('test', sum) console.log(sum.length / 1024 + 'KB') } catch (e) { console.log(sum.length / 1024 + 'KB超出最大限制') clearInterval(show) } }, 0.1) }, // 獲取使用了的localstorage的空間 getUsedSpace(){ if (!window.sessionStorage) { console.log('瀏覽器不支持sessionStorage') } var size = 0 for (item in window.sessionStorage) { if (window.sessionStorage.hasOwnProperty(item)) { size += window.sessionStorage.getItem(item).length } } console.log('當(dāng)前sessionStorage使用容量為' + (size / 1024).toFixed(2) + 'KB') } }
/* * cookies.js * cooikes的實(shí)現(xiàn),這輩子估計(jì)沒(méi)有時(shí)間實(shí)現(xiàn)了 */ export default { getItem(key){}, setItem(key, value){}, removeItem(key){}, getAll(){}, clear(){}, key(n){}, forEach(cb){}, has(key){}, deleteAllExpires(){} }
/* * json.js * json的實(shí)現(xiàn),這輩子估計(jì)也沒(méi)有時(shí)間實(shí)現(xiàn)了 */ export default { getItem(key){}, setItem(key, value){}, removeItem(key){}, getAll(){}, clear(){}, key(n){}, forEach(cb){}, has(key){}, deleteAllExpires(){} }
2.2. 規(guī)范命名空間的使用
為了防止key值污染,我們可以合理使用命名空間
我們可以定義命名空間,但是不能把很多數(shù)據(jù)存儲(chǔ)在同一對(duì)象里面,這樣后面的操作量會(huì)太大
比如全局的在global下面
比如各功能系統(tǒng)的加上系統(tǒng)詞綴
一個(gè)系統(tǒng)的命名空間規(guī)范應(yīng)該提前設(shè)計(jì)好,否則真正開(kāi)發(fā)起來(lái)會(huì)有很多人不按照規(guī)則使用
全局使用的東西要在README.md文檔中體現(xiàn)出來(lái)
示例
* localStorage['SGQ.global.userAuthor']:登錄的用戶信息都在這里,菜單,組織,集團(tuán) * localStorage['SGQ.global.systemName']:登錄的系統(tǒng)名稱 * localStorage['SGQ.vuex.state']:vuex中的state的存儲(chǔ)地址,這里面有所有的的東西 * localStorage['SGQ.wms.warehouse']:wms需要的倉(cāng)庫(kù)信息 + localStorage['SGQ.wms.warehouse'].permissionId + localStorage['SGQ.wms.warehouse'].dataResource * localStorage['SGQ.tms.org']:tms需要的網(wǎng)點(diǎn)的信息 + localStorage['SGQ.tms.org'].permissionId + localStorage['SGQ.tms.org'].orgName
2.3. storage使用規(guī)范
2.3.1. 問(wèn)題產(chǎn)生的原因
這個(gè)問(wèn)題的產(chǎn)生是因?yàn)槲覀円鰴?quán)限登錄,然后登錄的時(shí)候一直報(bào)存儲(chǔ)空間不夠的問(wèn)題,查了原因發(fā)現(xiàn)是后端把所有的超管的幾千條數(shù)據(jù)都返回來(lái)了,以至于不夠用,后來(lái)修改了后端接口返回的數(shù)據(jù)內(nèi)容解決了這個(gè)問(wèn)題。
但是這次的事給我們帶來(lái)了幾點(diǎn)思考?
localstorage和sessionstorage的存儲(chǔ)量在不同的瀏覽器中基本是5M
localstorage和sessionstorage的存儲(chǔ)是跟著域名來(lái)的
boss.hivescm.com下localstorage存儲(chǔ)是5M
b2b.hivescm.com下localstorage存儲(chǔ)也是5M
即使這次問(wèn)題解決了,但是我們應(yīng)該定一套方案,充分利用一個(gè)域名下,localstorage和sessionstorage的共10M空間
2.3.2. storage使用方案
全局使用的東西,共享的東西,永久存儲(chǔ)的東西儲(chǔ)存在localstorage中
不需要永久存儲(chǔ)的東西在使用完畢之后要記得及時(shí)清除
如果數(shù)據(jù)量過(guò)大就不要存儲(chǔ)在本地了,變?yōu)閯?dòng)態(tài)獲取
可以使用存儲(chǔ)量更大的Indexeddb,不過(guò)有兼容性問(wèn)題
可以在實(shí)現(xiàn)方案中對(duì)要存儲(chǔ)到storage中的東西做字?jǐn)?shù)限制
充分合理利用sessionstorage和localstorage的H5特性
例如:列表數(shù)據(jù)存儲(chǔ)在vuex中其實(shí)也會(huì)存到localstorage
例如:表單校驗(yàn)的一些數(shù)據(jù)都用sessionstorage
3. 其他
3.1. 延伸擴(kuò)展
由此可以類推到事件的處理,沒(méi)用的事件要及時(shí)在退出vue組件的時(shí)候清理掉
例如:this.bus.$on('aa')要用this.bus.$off('aa')卸載事件
3.2. 字符長(zhǎng)短獲取
var len = 0 for (var i = 0; i < val.length; i++) { if (val[i].match(/[^\x00-\xff]/ig) != null) //全角 len += 2 //如果是全角,占用兩個(gè)字節(jié) 如果mysql中某字段是text, 如果設(shè)置編碼為utf-8,那么一個(gè)中文是占3個(gè)字節(jié), gbk是兩個(gè)字節(jié) else len += 1 //半角占用一個(gè)字節(jié) } return len
以上就是小編整理的關(guān)于Vue中l(wèi)ocalstorage和sessionstorage的用法的全部?jī)?nèi)容,感謝你對(duì)腳本之家的支持。
- 在Vue3中使用localStorage保存數(shù)據(jù)的流程步驟
- 教你在Vue3中使用useStorage輕松實(shí)現(xiàn)localStorage功能
- VUE使用localstorage和sessionstorage實(shí)現(xiàn)登錄示例詳解
- vue如何使用cookie、localStorage和sessionStorage進(jìn)行儲(chǔ)存數(shù)據(jù)
- vue使用localStorage保存登錄信息 適用于移動(dòng)端、PC端
- Vue使用localStorage存儲(chǔ)數(shù)據(jù)的方法
- Vue項(xiàng)目使用localStorage+Vuex保存用戶登錄信息
- 詳解vue中l(wèi)ocalStorage的使用方法
- vue中的localStorage使用方法詳解
相關(guān)文章
Vue頁(yè)面刷新記住頁(yè)面狀態(tài)的實(shí)現(xiàn)
這篇文章主要介紹了Vue頁(yè)面刷新記住頁(yè)面狀態(tài)的實(shí)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-12-12Vue如何實(shí)現(xiàn)多頁(yè)面配置以及打包方式
這篇文章主要介紹了Vue如何實(shí)現(xiàn)多頁(yè)面配置以及打包方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10vue大屏自適應(yīng)的實(shí)現(xiàn)方法(cv就能用)
最近在用VUE寫大屏頁(yè)面,遇到屏幕自適應(yīng)問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于vue大屏自適應(yīng)的實(shí)現(xiàn)方法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-06-06vue 音樂(lè)App QQ音樂(lè)搜索列表最新接口跨域設(shè)置方法
這篇文章主要介紹了vue 音樂(lè)App QQ音樂(lè)搜索列表最新接口跨域設(shè)置方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-09-09如何在vue3中同時(shí)使用tsx與setup語(yǔ)法糖
這篇文章主要介紹了如何在vue3中同時(shí)使用tsx與setup語(yǔ)法糖,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09