最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 项目优化——localStorage|sessionStorage统一管理方案

    正文概述 掘金(PN_feather)   2021-01-19   446

    localStorage|sessionStorage主要区别

    sessionStorage的生命周期是浏览器关闭前,而localStorage的生命周期是永久的。

    为什么要管理

    防止项目滥用本地存储(localStorage|sessionStorage)而出现例如:

    不同业务线,却用着同样的key命名存储,存储数据相互修改。这样的bug一旦出现,可能很难排查到,毕竟测试流程一般是单业务线的走。

    完整代码附带详细注释

    代码只演示单一存储方式,具体使用哪种根据项目使用情况及两者区别来定。

    如果项目需要两种存储方法一起用,可以自行优化(storage对象另外添加3个方法或者现有方法添加参数支持,当然还需要同步修改优化原型方法)。

    核心代码

    /**
     * storage再封装
     * 需要在./data中注册后的字段才可以运行存储
     */
    // 引入注册列表
    import {config} from './data';
    
    // 存储变量添加统一前缀(例如:项目_作者_ 下划线分割的方式)
    const pre = 'project_author_';
    
    // 存储方式 'localStorage' | 'sessionStorage'
    const storageType = 'sessionStorage';
    
    /**
     * 核心:阻止未注册key添加到存储中——装饰模式优化setItem方法
     * 考虑到没有添加就不会有获取和删除,所以只对setItem做处理
     */
    const setOptimize = function (setItem) {
      return function (...args) {
        // setItem第一个入参为key
        const [key] = args;
        // 自定义注册列表config中,如果不包含当前key(需要截取掉自定义前缀)则阻止存入,并添加友善提示
        if (!config.includes(key.substr(pre.length))) {
          // 如果有eslint配置禁用console,可以自行添加 // eslint-disable-next-line
          console.warn('当前字面量' + key + '未配置缓存,请在/src/tools/localStorage/data中注入属性');
        } else {
          // 如果已注册则直接返回原储存方法即可
          return setItem.apply(this, args);
        }
      };
    };
    // 获取原型并调用优化方法
    Object.getPrototypeOf(window[storageType]).setItem = setOptimize(Object.getPrototypeOf(window[storageType]).setItem);
    
    // 重写调用本地存储的方法,统一项目的调用方式
    const storage = {
      get (key) {
        return JSON.parse(window[storageType].getItem(pre + key));
      },
      set (key, value) {
        return window[storageType].setItem(pre + key, JSON.stringify(value));
      },
      remove (key) {
        return window[storageType].removeItem(pre + key);
      }
    };
    
    export default storage;
    
    

    配置示例(key的列表)

    export const config = [
      'userName', // 缓存的用户名
      'TOCKEN', // tocken
      '@@', // ***
      'vuex' // ***
    ];
    

    调用简易示例

    // 引入存储方法
    import storage from '@/tools/localStorage';
    
    // 存
    storage.set('userName', this.userName);
    // 取
    this.userName = storage.get('userName');
    // 删
    storage.remove('userName');
    

    成果图展示

    存储数据展示 项目优化——localStorage|sessionStorage统一管理方案

    未注册key添加存储时友善提示展示 项目优化——localStorage|sessionStorage统一管理方案

    尾言

    不管项目是否需要这样的管理方案,总归是有益无害。

    最后:你是否知道配置示例(key的列表)中'@@'和'vuex'分别是定义什么的key吗?欢迎留言评论。


    起源地下载网 » 项目优化——localStorage|sessionStorage统一管理方案

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元