一些Vue缓存处理

为了更好的缓存,想出一个小小的设计思路,用来处理 Vuex 和 localStorage 数据的绑定,并且能够根据页面的操作来进行自动更新,并反馈到页面上。

必备知识

  1. Vuex State、Mutations、Action、getter,使用和原理
  2. Vue 计算属性、生命周期、响应原理和局限等等。
  3. localStorage。

准备工作

  1. 对 localStorage 封装。
export default {
  get(key) {
    let val = localStorage.getItem(key);
    if (!val) {
      return null;
    }
    //考虑只存数组情况
    if (val.substr(0, 1) === "{" || val.substr(0, 1) === "[") {
      return JSON.parse(val);
    } else {
      return val.split(",");
    }
  },
  set(key, data) {
    data instanceof Set && (data = [...data]);
    localStorage.setItem(key, JSON.stringify(data));
  },
  remove(key) {
    //删除逻辑要进行获取判断验证
    localStorage.removeItem(key);
    return this.get(key) === null ? true : false;
  },
  clear() {
    localStorage.clear();
  }
};
  1. 助手函数
 //根据id 在数组中查找数据 返回 是否存在,所在位置,详细信息
  hasIdByArr(arr = [], id) {
    let a = { has: false, index: undefined, data: [] };
    for (let i = 0; i < arr.length; i++) {
      if (arr[i].id == id) {
        a.has = true;
        a.index = i;
        a.data = arr[i];
        break;
      }
    }
    return a;
  },

主要思想

获取的阶段

在一个需要用到缓存的组件的时候,我在生命周期的beforeCreate阶段去获取一下 Vuex 中Mutations的一个方法,这个方法就是去获取localStorage的需要的属性值,把它赋值为State

这样设计,不会在初次加载的时候就获取所有的缓存数据,只有在使用的时候才会去获取。去提取localStorageCreate阶段获取也一样,但是我感觉应该和页面的数据获取分开,因为操作的是 Vuex 所以在beforeCreate阶段也是可以的。

这样 Vuex 中就有了需要的缓存值。页面展示的时候,直接使用 Vue 的计算属性获取就可以了,如果你想要筛选数据就可以使用 Vuex 的getter
例如:

//在 created 阶段获取一个传值的 getter
const { onceCount, onceStar } = this.$store.getters.getOnceCart(this.id);
this.count = onceCount;
this.favorite = onceStar;
// 在 getter 中的定义
getOnceCart: ({ cart, star }) => id => {
  return {
    onceCount:
      cart.filter(val => val.id == id).length > 0
        ? cart.filter(val => val.id == id)[0].count
        : 0,
    onceStar: star.filter(val => val.id == id).length > 0 ? true : false
  };
};

因为当前的页面缓存属性,需要你先去让获取后才会有,所以需要等数据获取后才能去 getter 筛选,所以在创建阶段赋值。

设置阶段

在页面渲染后,我们可能会对页面进行操作,从未触发页面的缓存修改。

  1. 在 Vuex 方面
    使用 mutations 去提交修改 State 和 localStorage。
 changeStar({ star }, news) {
    star = news;
    storage.set("star", star);
  },
  1. 使用 Action 对组件提交过来的数据进行处理和拦截,然后抛给 mutations 保存
  pushStarData({ commit }, news) {
      const { starData, status } = news;
      const { id } = starData;
      let old = this.state.star || [];
      const { index, has } = help.hasIdByArr(old, id);
      if (status) {
        old.push(starData);
      } else {
        old.splice(index, 1);
      }
      commit("changeStar", old);
    },
  1. 在组件中的使用
 changeFa() {
      let { count, checkBox, ...starData } = this.getCartData()
      starData.time = this.$help.getUTCTime();
      starData.specifications = this.specifications;
      this.$store.dispatch('pushStarData', { starData, status: this.favorite });
    }

总结

总的来说就是在一个组件使用的时候去请求 Vuex 把 localStorage 的数据保存到 State 中,组建可以使用计算属性或 vuex 的 getter 去筛选或直接获取数据。
在页面操作的时候,使用 dispatch 提交需要缓存的数据,在 Vuex 中的 action 中去修改,处理,拦截等操作,完成后去提交 mutations,mutations 同步修改 vuex 和 localStorage。这个设计完全符合 Vue 的响应模式,修改的只是 Vuex 的 State 而已,页面的属性是计算属性或 getter 动态获取的,页面能够直接响应修改。

注意

  1. 在涉及到 form 的时候,比如 checkBox ,使用 change 事件较好,如果使用监听器,会在首次就去触发一次修改,因为你这个组件的默认值和你的缓存值不一样,这时也会触发修改的。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,858评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,372评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,282评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,842评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,857评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,679评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,406评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,311评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,767评论 1 315
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,945评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,090评论 1 350
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,785评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,420评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,988评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,101评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,298评论 3 372
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,033评论 2 355

推荐阅读更多精彩内容

  • 一:什么是闭包?闭包的用处? (1)闭包就是能够读取其他函数内部变量的函数。在本质上,闭包就 是将函数内部和函数外...
    xuguibin阅读 9,615评论 1 52
  • 10-1.city页面路由配置 1.添加路由配置 2.添加相对应的页面在pages文件下面添加city文件夹和Ci...
    读书的鱼阅读 885评论 1 16
  • 系列文章:Vue 2.0 升(cai)级(keng)之旅Vuex — The core of Vue applic...
    6ed7563919d4阅读 4,551评论 2 58
  • vuex 场景重现:一个用户在注册页面注册了手机号码,跳转到登录页面也想拿到这个手机号码,你可以通过vue的组件化...
    sunny519111阅读 8,017评论 4 111
  • 1. scrollTop移动端失效问题 项目中有个需求,左右切换列表时滚动条滚到开始位置,用Chrome开发调试时...
    如沙雨下阅读 3,687评论 0 0