vue移动端项目缓存问题实践记录


Posted in Javascript onOctober 29, 2018

最近在做一个vue移动端项目,被缓存问题搞得头都大了,积累了一些经验,特此记录总结下,权当是最近项目问题的一个回顾吧!

先描述下问题场景:A页面->B页面->C页面。假设A页面是列表页面,B页面是列表详情页面,C页面是操作改变B页面的一些东西,进行提交类似的操作。A页面进入B页面,应该根据不同的列表item显示不一样的详情,从B进入C,也应该根据item的标识比如ID展示不一样的内容,在C页面操作后,返回B页面,B页面数据发生变化。这个时候会有两种情况:

  • C页面操作数据后返回B页面,B页面对应数据应该发生变化。
  • C页面直接点击左上角箭头返回,B页面对应数据不应该发生变化。继续返回A列表页面,换一条数据,继续进入B页面,B页面展示不同内容,进入C页面,C页面刷新展示不同内容

另一种情况发生在写邮件的页面中,添加收件人,选人之后,继续添加,之前添加的联系人应该存在。但是从写邮件页面返回邮件列表再次进入写邮件页面,之前添加过的联系人数据就不应该存在了,这里就涉及到如何处理缓存,何时使用缓存,何时清除缓存的问题了。

目前项目整体结构如下:

<template>
 <div id="app">
  <keep-alive>
   <router-view v-if="$route.meta.keepAlive"></router-view>
  </keep-alive>
  <router-view v-if="!$route.meta.keepAlive"></router-view>
 </div>
</template>

虽然官方提供了include,exclude,可以让我们决定哪些组件使用缓存,哪些不使用缓存,但是并没有解决我们想动态使用缓存的目的,目前我的项目使用了如下两种方式处理缓存:

方式一 ,使用是否使用缓存标识

在路由文件router.js里给每个路由添加meta信息,标识是否使用缓存。

meta: {
  isUseCache: false,//不使用缓存
  keepAlive: true
}

使用方式:

A->B,B不能缓存;B->A,A缓存。

(1)A页面:

beforeRouteLeave(to, from, next) {
 // 设置下一个路由的 meta
 if(to.path=='/B'){
  to.meta.isUseCache = false;
 }
 next();
},
activated(){
  if(!this.$route.meta.isUseCache){
    this.getData();
  }
}

(2) B页面

beforeRouteLeave(to, from, next) {
 // 设置下一个路由的 meta
 if(to.path=='/A'){
  to.meta.isUseCache = true;
 }
 next();
},
activated(){
  if(!this.$route.meta.isUseCache){
    this.getData();
  }
}

方式二,强制清除缓存。

这种方式是从网上找的一种方式,使用了vue内部组件之后,不在支持动态销毁组件,缓存一直存在,只能从源头上下手,清掉缓存。

export const removeCatch = {
 beforeRouteLeave:function(to, from, next){
  if (from && from.meta.rank && to.meta.rank && from.meta.rank>to.meta.rank)
   {//此处判断是如果返回上一层,你可以根据自己的业务更改此处的判断逻辑,酌情决定是否摧毁本层缓存。
     if (this.$vnode && this.$vnode.data.keepAlive)
     {
       if (this.$vnode.parent && this.$vnode.parent.componentInstance && this.$vnode.parent.componentInstance.cache)
       {
         if (this.$vnode.componentOptions)
         {
           var key = this.$vnode.key == null
                 ? this.$vnode.componentOptions.Ctor.cid + (this.$vnode.componentOptions.tag ? `::${this.$vnode.componentOptions.tag}` : '')
                 : this.$vnode.key;
           var cache = this.$vnode.parent.componentInstance.cache;
           var keys = this.$vnode.parent.componentInstance.keys;
           if (cache[key])
           {
             if (keys.length) {
               var index = keys.indexOf(key);
               if (index > -1) {
                 keys.splice(index, 1);
               }
             }
             delete cache[key];
           }
         }
       }
     }
     this.$destroy();
   }
   next();
 }
};

在需要清掉缓存的页面混合引入该js即可。

总结

以上所述是小编给大家介绍的vue移动端项目缓存问题实践记录,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
Document 对象的常用方法
Jul 31 Javascript
Javascript实现的类似Google的Div拖动效果代码
Aug 09 Javascript
js+css实现增加表单可用性之提示文字
Jun 03 Javascript
调用jQuery滑出效果时闪烁的解决方法
Mar 27 Javascript
js 获取元素下面所有li的两种方法
Apr 14 Javascript
jQuery实现简洁的轮播图效果实例
Sep 07 Javascript
非常实用的vue导航钩子
Mar 20 Javascript
完美解决iview 的select下拉框选项错位的问题
Mar 02 Javascript
p5.js实现斐波那契螺旋的示例代码
Mar 22 Javascript
简单的vuex 的使用案例笔记
Apr 13 Javascript
vuejs 动态添加input框的实例讲解
Aug 24 Javascript
js遍历详解(forEach, map, for, for...in, for...of)
Aug 28 Javascript
vue 使用vue-i18n做全局中英文切换的方法
Oct 29 #Javascript
Element-UI踩坑之Pagination组件的使用
Oct 29 #Javascript
vue-router权限控制(简单方式)
Oct 29 #Javascript
详解Vue项目在其他电脑npm run dev运行报错的解决方法
Oct 29 #Javascript
Vue项目自动转换 px 为 rem的实现方法
Oct 29 #Javascript
vue 本地服务不能被外部IP访问的完美解决方法
Oct 29 #Javascript
Webstorm2016使用技巧(SVN插件使用)
Oct 29 #Javascript
You might like
PHP5.3.1 不再支持ISAPI
2010/01/08 PHP
如何在symfony中导出为CSV文件中的数据
2011/10/06 PHP
Codeigniter实现处理用户登录验证后的URL跳转
2014/06/12 PHP
php一维二维数组键排序方法实例总结
2014/11/13 PHP
php实现无限级分类
2014/12/24 PHP
Laravel 中创建 Zip 压缩文件并提供下载的实现方法
2019/04/02 PHP
ThinkPHP3.2框架自带分页功能实现方法示例
2019/05/13 PHP
jquery $.ajax入门应用一
2008/11/19 Javascript
JavaScript 匿名函数(anonymous function)与闭包(closure)
2011/10/04 Javascript
cnblogs 代码高亮显示后的代码复制问题解决实现代码
2011/12/14 Javascript
js根据日期判断星座的示例代码
2014/01/23 Javascript
JavaScript中的数值范围介绍
2014/12/29 Javascript
JS简单实现tab切换效果的多窗口显示功能
2016/09/07 Javascript
jquery 实时监听输入框值变化的完美方法(必看)
2017/01/26 Javascript
JS实现点击循环切换显示内容的方法
2017/10/19 Javascript
VueJs使用Amaze ui调整列表和内容页面
2017/11/30 Javascript
vue 实现单选框设置默认选中值
2019/11/07 Javascript
vue项目中极验验证的使用代码示例
2019/12/03 Javascript
JavaScript实现轮播图片完整代码
2020/03/07 Javascript
微信小程序中使用 async/await的方法实例分析
2020/05/06 Javascript
[01:38]DOTA2 2015国际邀请赛中国区预选赛 Showopen
2015/06/01 DOTA
python实现linux服务器批量修改密码并生成execl
2014/04/22 Python
对Pyhon实现静态变量全局变量的方法详解
2019/01/11 Python
python爬虫爬取图片的简单代码
2021/01/18 Python
CSS3教程(8):CSS3透明度指南
2009/04/02 HTML / CSS
英国最大的奢侈珠宝和手表网站:C W Sellors
2017/02/10 全球购物
美国女士内衣在线折扣商店:One Hanes Place
2019/03/24 全球购物
Expedia瑞典官网:预订度假屋、酒店、汽车租赁、机票等
2021/01/23 全球购物
优秀的教师个人的中文求职信
2013/09/21 职场文书
毕业生精彩的自我评价分享
2013/10/06 职场文书
《画家乡》教学反思
2014/04/22 职场文书
学生实习证明模板汇总
2014/09/25 职场文书
医院志愿者活动总结
2015/05/06 职场文书
公司宣传语大全
2015/07/13 职场文书
Python3接口性能测试实例代码
2021/06/20 Python
使用Python开发贪吃蛇游戏 SnakeGame
2022/04/30 Python