ホームページ > 記事 > ウェブフロントエンド > Vue で localstorage と sessionstorage を使用する方法
今回は、Vue で localstorage と sessionstorage を使用する方法を説明します。Vue で localstorage と sessionstorage を使用する際の 注意事項 とは何ですか?実際のケースを見てみましょう。
1. プロジェクトの使用中に明らかになったいくつかの問題
誰もが localstorage['aaa']='This is an examplestring' とこれらのネイティブ構文の実装を直接使用しますが、いつか実装方法を変更したり、ストレージ サイズを制御したりする必要がある場合、その場合、修正が必要なコードがたくさんあります
プロジェクトは非常に大規模なので、全員が付けたキー名は必然的に繰り返され、これは地球規模の汚染を引き起こすことにもなります ローカルストレージの使用は標準化されていないため、無駄が発生し、ストレージスペースが不足します2. 解決策
ストレージの使用状況をカプセル化し、統一した方法で処理します ストレージのキー値の命名規則を標準化するストレージの使用法を標準化する
/* * 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中文网其它相关文章!
推荐阅读:
以上がVue で localstorage と sessionstorage を使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。