最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Vue中l(wèi)ocalstorage和sessionstorage的使用

 更新時(shí)間:2017年12月22日 10:46:26   作者:龍馬行空  
這篇文章主要介紹了詳解Vue中l(wèi)ocalstorage和sessionstorage的使用方法和經(jīng)驗(yàn)心得,有需要的朋友跟著小編參考學(xué)習(xí)下吧。

1. 項(xiàng)目使用中暴露出來的幾個(gè)問題

大家到處直接使用localstorage['aaa']='這是一段示例字符串'這些原生語法實(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)可以通過配置不同的參數(shù)來實(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ì)沒有時(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ì)也沒有時(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ì)好,否則真正開發(fā)起來會(huì)有很多人不按照規(guī)則使用

全局使用的東西要在README.md文檔中體現(xiàn)出來

示例

* 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)庫信息
+ 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. 問題產(chǎn)生的原因

這個(gè)問題的產(chǎn)生是因?yàn)槲覀円鰴?quán)限登錄,然后登錄的時(shí)候一直報(bào)存儲(chǔ)空間不夠的問題,查了原因發(fā)現(xiàn)是后端把所有的超管的幾千條數(shù)據(jù)都返回來了,以至于不夠用,后來修改了后端接口返回的數(shù)據(jù)內(nèi)容解決了這個(gè)問題。

但是這次的事給我們帶來了幾點(diǎn)思考?

localstorage和sessionstorage的存儲(chǔ)量在不同的瀏覽器中基本是5M

localstorage和sessionstorage的存儲(chǔ)是跟著域名來的

boss.hivescm.com下localstorage存儲(chǔ)是5M

b2b.hivescm.com下localstorage存儲(chǔ)也是5M

即使這次問題解決了,但是我們應(yīng)該定一套方案,充分利用一個(gè)域名下,localstorage和sessionstorage的共10M空間

2.3.2. storage使用方案

全局使用的東西,共享的東西,永久存儲(chǔ)的東西儲(chǔ)存在localstorage中

不需要永久存儲(chǔ)的東西在使用完畢之后要記得及時(shí)清除

如果數(shù)據(jù)量過大就不要存儲(chǔ)在本地了,變?yōu)閯?dòng)態(tài)獲取

可以使用存儲(chǔ)量更大的Indexeddb,不過有兼容性問題

可以在實(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ò)展

由此可以類推到事件的處理,沒用的事件要及時(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ì)腳本之家的支持。

相關(guān)文章

  • 用VueJS寫一個(gè)Chrome瀏覽器插件的實(shí)現(xiàn)方法

    用VueJS寫一個(gè)Chrome瀏覽器插件的實(shí)現(xiàn)方法

    這篇文章主要介紹了用VueJS寫一個(gè)Chrome瀏覽器插件的實(shí)現(xiàn)方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-02-02
  • vue點(diǎn)擊按鈕動(dòng)態(tài)創(chuàng)建與刪除組件功能

    vue點(diǎn)擊按鈕動(dòng)態(tài)創(chuàng)建與刪除組件功能

    這篇文章主要介紹了vue點(diǎn)擊按鈕動(dòng)態(tài)創(chuàng)建與刪除組件功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-12-12
  • vue中使用Axios最佳實(shí)踐方式

    vue中使用Axios最佳實(shí)踐方式

    Axios?是一個(gè)基于?promise?的網(wǎng)絡(luò)請(qǐng)求庫,可以用于瀏覽器和?node.js,Axios?使用簡(jiǎn)單,包尺寸小且提供了易于擴(kuò)展的接口,這篇文章主要介紹了vue中使用Axios最佳實(shí)踐,需要的朋友可以參考下
    2022-09-09
  • Vue3使用KeepAlive不生效的解決方法

    Vue3使用KeepAlive不生效的解決方法

    使用arco-design-pro的vue3后臺(tái)框架, 切換路由時(shí), 組件包裹的keepAlive不生效, 切換tab后組件狀態(tài)會(huì)刷新, 并重新獲取接口, 導(dǎo)致頁面切換時(shí)閃爍,所以本文給大家介紹了Vue3使用KeepAlive不生效的解決方法,需要的朋友可以參考下
    2024-11-11
  • Vue2.0利用 v-model 實(shí)現(xiàn)組件props雙向綁定的優(yōu)美解決方案

    Vue2.0利用 v-model 實(shí)現(xiàn)組件props雙向綁定的優(yōu)美解決方案

    本篇文章主要介紹了Vue2 利用 v-model 實(shí)現(xiàn)組件props雙向綁定的優(yōu)美解決方案,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-03-03
  • 一文教你vue3 watch如何停止監(jiān)視

    一文教你vue3 watch如何停止監(jiān)視

    這篇文章主要為大家詳細(xì)介紹了vue3中watch如何停止監(jiān)視,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-12-12
  • Vue遞歸實(shí)現(xiàn)樹形菜單方法實(shí)例

    Vue遞歸實(shí)現(xiàn)樹形菜單方法實(shí)例

    學(xué)習(xí)vue有一段時(shí)間了,最近使用vue做了一套后臺(tái)管理系統(tǒng),其中使用最多就是遞歸組件,下面這篇文章主要給大家介紹了關(guān)于Vue利用遞歸實(shí)現(xiàn)樹形菜單的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2018-11-11
  • vite(vue3)配置內(nèi)網(wǎng)ip訪問的方法步驟

    vite(vue3)配置內(nèi)網(wǎng)ip訪問的方法步驟

    Vite是一個(gè)快速的構(gòu)建工具,Vue3是一個(gè)流行的JavaScript框架,下面這篇文章主要給大家介紹了關(guān)于vite(vue3)配置內(nèi)網(wǎng)ip訪問的方法步驟,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • vue3 Composition API使用示例教程

    vue3 Composition API使用示例教程

    Vue3新增了Composition API,我們只需將實(shí)現(xiàn)某一功能的相關(guān)代碼全部放進(jìn)一個(gè)函數(shù)中,然后return需要對(duì)外暴露的對(duì)象,這篇文章主要介紹了vue3 Composition API使用,需要的朋友可以參考下
    2022-12-12
  • vue elementUI實(shí)現(xiàn)拖拽流程圖效果

    vue elementUI實(shí)現(xiàn)拖拽流程圖效果

    這篇文章主要為大家詳細(xì)介紹了如何通過vue elementUI實(shí)現(xiàn)拖拽流程圖效果,不引入插件,純手寫實(shí)現(xiàn),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-01-01

最新評(píng)論

巴林右旗| 罗定市| 五华县| 临邑县| 邯郸县| 丰县| 额尔古纳市| 顺义区| 巴彦淖尔市| 绥芬河市| 阳朔县| 潼南县| 禹城市| 奉化市| 中阳县| 大同县| 宿州市| 连城县| 辽源市| 临潭县| 玉环县| 博乐市| 田东县| 清镇市| 建德市| 沙洋县| 遵义市| 景泰县| 宜兴市| 清河县| 汝南县| 大城县| 循化| 南充市| 日喀则市| 宕昌县| 盘锦市| 客服| 永顺县| 温宿县| 探索|