ホームページ  >  記事  >  ウェブフロントエンド  >  Vue で localstorage と sessionstorage を使用する方法

Vue で localstorage と sessionstorage を使用する方法

php中世界最好的语言
php中世界最好的语言オリジナル
2018-04-14 09:17:112187ブラウズ

今回は、Vue で localstorage と sessionstorage を使用する方法を説明します。Vue で localstorage と sessionstorage を使用する際の 注意事項 とは何ですか?実際のケースを見てみましょう。

1. プロジェクトの使用中に明らかになったいくつかの問題

誰もが localstorage['aaa']='This is an example

string' とこれらのネイティブ構文の実装を直接使用しますが、いつか実装方法を変更したり、ストレージ サイズを制御したりする必要がある場合、その場合、修正が必要なコードがたくさんあります

プロジェクトは非常に大規模なので、全員が付けたキー名は必然的に繰り返され、これは地球規模の汚染を引き起こすことにもなります

ローカルストレージの使用は標準化されていないため、無駄が発生し、ストレージスペースが不足します

2. 解決策

ストレージの使用状況をカプセル化し、統一した方法で処理します

ストレージのキー値の命名規則を標準化する

ストレージの使用法を標準化する

2.1. 統一されたカプセル化方法

メソッドをカプセル化すると、結合度が減り、実装メソッドの切り替えが容易になり、ストレージ サイズを制御できます

実装の変更は、さまざまなパラメーターを構成することで実現できます

図に示すようにプロジェクト構造を編集します

コードの実装

/*
 * storage.js
 */
/*
 * @Author: 石国庆
 * @Desc: 本地数据存储方法封装
 * @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对象,只能多写几遍
 * @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:其他方法的实现
// TODO:超时时间的设置
/*
 * 方法实现
 * */
import local from './storage/localstorage.js'
import session from './storage/session.js'
import cookies from './storage/cookies.js'
import json from './storage/json.js'
/*
* 函数体
* */
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(){},
 // 获取最大存储空间:只有LocalStorage和SessionStorage可以使用这个方法
 getMaxSpace(options){
  let store=this.getStorage(options)
  store.getMaxSpace()
 },
 // 获取使用了的空间:只有LocalStorage和SessionStorage可以使用这个方法
 getUsedSpace(options){
  let store=this.getStorage(options)
  store.getUsedSpace()
 }
}
export default storage
// https://segmentfault.com/a/1190000002458488
// 5、遍历localStorage存储的key
//  .length 数据总量,例:localStorage.length
//  .key(index) 获取key,例:var key=localStorage.key(index);
// 备注:localStorage存数的数据是不能跨浏览器共用的,一个浏览器只能读取各自浏览器的数据,储存空间5M。
// 超时设置
// 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;
//   }
//  }
// }
rreerreerreerree 2.2.

名前空間

の使用を標準化する キー値の汚染を防ぐために、合理的に名前空間を使用できます

名前空間を定義できますが、同じオブジェクトに大量のデータを保存できないため、後続の操作の量が多すぎます

たとえば、グローバルなものは global

の下にあります。 たとえば、各関数システムにシステム接辞を追加します

システムの名前空間の仕様は事前に設計しておかないと、実際に開発する際にルールを守れない人が多くなります

グローバルで使用されるものは README.md ドキュメントに反映される必要があります

/*
 * localstorage.js
 * localstorage的实现
 */
// 这个有点奇怪,文件名称叫local.js不能按照js文件解析
export default {
 getItem(key){
  let item = localStorage.getItem(key)
  // 这点要判断是字符串还是对象
  let result = /^[{\[].*[}\]]$/g.test(item)
  if (result) {
   return JSON.parse(item)
  } else {
   return item
  }
 },
 setItem(key, value){
  // 这点要判断是字符串还是对象
  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最大存储容量
 getMaxSpace(){
  if (!window.localStorage) {
   console.log('当前浏览器不支持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('当前localStorage使用容量为' + (size / 1024).toFixed(2) + 'KB')
 }
}
2.3. ストレージ使用仕様

2.3.1. 問題の原因

この問題は、アクセス許可を使用してログインする必要があり、ログイン時にストレージ容量が不足していると報告され続けるために発生します。理由を確認したところ、バックエンドが数千のスーパーマネージドデータをすべて返したことがわかりました。十分なスペースがなかったため、この問題を解決するためにバックエンド インターフェイスから返されたデータの内容を後で変更しました。

しかし、この出来事は私たちに何を考えさせたのでしょうか?

localstorage と sessionstorage のストレージ容量は、異なるブラウザーでも基本的に 5M です

localstorage と sessionstorage のストレージはドメイン名に従います

Boss.hivescm.com の下の localstorage ストレージは 5M です

b2b.hivescm.com の下の localstorage ストレージも 5M です

今回問題が解決したとしても、1つのドメイン名でlocalstorageとsessionstorageの合計10Mの容量をフル活用する計画を立てるべきです

2.3.2. ストレージ使用計画

グローバルに使用されるもの、共有されるもの、永続的に保存されるものはローカルストレージに保存されます

使用後は永久保管の必要のないものを忘れずに片づけてください

データ量が大きすぎる場合は、ローカルに保存せずに動的に取得してください

より大きなストレージ容量の Indexeddb を使用することもできますが、互換性の問題があります

実施計画でストレージに保存する内容に文字数制限を設定できます

sessionstorage と localstorage の H5 機能を最大限に活用してください

例: vuex に保存されたリスト データは、実際には localstorage に保存されます

例: フォーム検証の一部のデータはセッションストレージを使用します

3. その他

3.1. 拡張子

これは、イベントの処理が原因で、vue コンポーネントを終了するときに無駄なイベントをクリーンアップする必要があると推測できます

。 例: this.bus.$on('aa') は、イベントをアンロードするために this.bus.$off('aa') を使用する必要があります

3.2. 字符长短获取

var len = 0
for (var i = 0; i < val.length; i++) {
 if (val[i].match(/[^\x00-\xff]/ig) != null) //全角
  len += 2 //如果是全角,占用两个字节 如果mysql中某字段是text, 如果设置编码为utf-8,那么一个中文是占3个字节, gbk是两个字节
 else
  len += 1 //半角占用一个字节
}
return len

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

Angular操作table表格使其排序

JS怎么判断客户端类型

以上がVue で localstorage と sessionstorage を使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。