来了解一下前端本地化存储 WebStorage吧

113 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第20天,点击查看活动详情

Web Storage主要提供了一种机制,可以让浏览器提供一种比cookie更直观的key、value存储方式,其由两种机制:localStorage和sessionStorage,它们区别在于:

  1. localStorage,本地存储,数据容量上限为5M,针对同一个域名下,这个域名下是持久存储的,在关闭掉网页重新打开时,存储的内容依然保留;
  2. sessionStorage是会话级别的存储,并不是持久化存储,页面关闭,sessionStorage就不存在了

33333.png

这两种机制,都只保存在客户端,默认不参与服务端通信,这样很好的避免了 cookie 带来的性能问题和安全问题。它们具备相同的API接口封装,通过 setItem 和 getItem 等方法进行操作,非常方便,以下是storage的常用方法和属性:

属性/方法含义
Storage.length该属性返回一个整数,表示存储在Storage对象中的数据项数量;
Storage.key()该方法接受一个数值n作为参数,返回存储中的第n个key名称;
Storage.getItem()该方法接受一个key作为参数,并且返回key对应的value;
Storage.setItem()该方法接受一个key和value,并且将会把key和value添加到存储中。如果key存在,则更新其对应的值
Storage.removeItem()该方法接受一个key作为参数,并把该key从存储中删除;
Storage.clear()该方法的作用是清空存储中的所有key;
 let webSite={name: 'juejin', Soglon: '掘金是面向全球中文开发者的技术内容分享与交流平台。我们通过技术文章、沸点、课程、直播等产品和服务,打造一个激发开发者创作灵感,激励开发者沉淀分享,陪伴开发者成长的综合类技术社区。'};
 localStorage.setItem("name", "juejin");
 localStorage.setItem("webSite",JSON.stringify(webSite));
 // 接着进入相同的域名时就能拿到相应的值
 let webName = localStorage.getItem('name') // => juejin
 let webInfo = JSON.parse(localStorage.getItem("webSite")) //{name: 'juejin', Soglon: '掘金是面向全球中文开发者的技术内容分享与交流平台。我们通过技术文章、沸点、课程、直播等产品和服务,打造一个激发开发者创作灵感,激励开发者沉淀分享,陪伴开发者成长的综合类技术社区。'};

为了便于我们使用Storage,在开发中我们一般会对Storage进行封装:

 class MyCache {
     constructor(isLocal) {
         this.storage = isLocal ? localStorage : sessionStorage
     }
     // 储存或更新数据
     setItem(key, value) {
         this.storage.setItem(key, JSON.stringify(value))
     }
 ​
     // 获取数据
     getItem(key) {
         let value = this.storage.getItem(key)
         if (value) {
             value = JSON.parse(value)
         }
         return value
     }
 ​
     // 清除数据
     removeItem(key) {
         this.storage.removeItem(key)
     }
 ​
     // 清空储存
     clear() {
         this.storage.clear()
     }
     
     // 返回名称
     key(index){
         return this.storage.key(index)
     }
     
     // 获取数据数目
     length(){
         return this.storage.length
     }
 }
 const localCache = new MyCache(true)
 const sessionCache = new MyCache(false)
 ​
 export {
     localCache,
     sessionCache
 }
 ​

当Storage对象发生增删改变化时,都会触发storage事件。

这个事件的时间对象有4个属性:

  • domain:存储变化对应的域
  • key:被设置或被删除的键
  • newValue:键被设置的新值,若被删除则为null
  • oldValue:键变化之前的值
 window.addEventListener('storage', e=>{
     console.log(e.domain)
 })