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 相关文章推荐
验证用户是否修改过页面的数据的实现方法
Sep 26 Javascript
IE6下出现JavaScript未结束的字符串常量错误的解决方法
Nov 21 Javascript
浅析onsubmit校验表单时利用ajax的return false无效问题
Jul 10 Javascript
fckeditor粘贴Word时弹出窗口取消的方法
Oct 30 Javascript
JS实现浏览器状态栏文字从右向左弹出效果代码
Oct 27 Javascript
js性能优化技巧
Nov 29 Javascript
JavaScript生成二维码图片小结
Dec 27 Javascript
jQuery+ajax实现文章点赞功能的方法
Dec 31 Javascript
微信小程序蓝牙连接小票打印机实例代码详解
Jun 03 Javascript
vscode vue 文件模板的配置方法
Jul 23 Javascript
原生js实现随机点名功能
Nov 05 Javascript
详解vue3中组件的非兼容变更
Mar 03 Vue.js
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
PHP curl 并发最佳实践代码分享
2012/09/05 PHP
CodeIgniter CLI模式简介
2014/06/17 PHP
JavaScript 空位补零实现代码
2010/02/26 Javascript
js弹出层之1:JQuery.Boxy (二)
2011/10/06 Javascript
原生js实现半透明遮罩层效果具体代码
2013/06/06 Javascript
使用CSS和jQuery模拟select并附提交后取得数据的代码
2013/10/18 Javascript
JS实现的仿东京商城菜单、仿Win右键菜单及仿淘宝TAB特效合集
2015/09/28 Javascript
浅析javascript的return语句
2015/12/15 Javascript
js实现页面跳转的五种方法推荐
2016/03/10 Javascript
jQuery中的select操作详解
2016/11/29 Javascript
基于JavaScript实现随机颜色输入框
2016/12/10 Javascript
JS实现css hover操作的方法示例
2017/04/07 Javascript
Ionic2调用本地SQlite实例
2017/04/22 Javascript
vue在手机中通过本机IP地址访问webApp的方法
2018/08/15 Javascript
vue引入静态js文件的方法
2020/06/20 Javascript
vue实现移动端input上传视频、音频
2020/08/18 Javascript
Vue+Vant 图片上传加显示的案例
2020/11/03 Javascript
python 自动提交和抓取网页
2009/07/13 Python
Python入门篇之字符串
2014/10/17 Python
Python中SOAP项目的介绍及其在web开发中的应用
2015/04/14 Python
Python中执行存储过程及获取存储过程返回值的方法
2017/10/07 Python
Python运维开发之psutil库的使用详解
2018/10/18 Python
如何基于Python和Flask编写Prometheus监控
2020/11/25 Python
Html5应用程序缓存(Cache manifest)
2018/06/04 HTML / CSS
VICHY薇姿俄罗斯官方网上商店:法国护肤品牌,火山温泉水
2019/11/22 全球购物
大一期末自我鉴定
2013/12/13 职场文书
2014年元旦联欢会活动策划方案
2014/02/16 职场文书
服务理念口号
2014/06/11 职场文书
解除劳动关系协议书范文
2014/09/11 职场文书
政府班子四风问题整改措施
2014/10/04 职场文书
交通事故赔偿协议书怎么写
2014/10/04 职场文书
2014年教师业务工作总结
2014/12/19 职场文书
培训班通知
2015/04/25 职场文书
2015年校本培训工作总结
2015/07/24 职场文书
2019年大学毕业生个人自我鉴定范文大全
2019/03/21 职场文书
Python Matplotlib绘制两个Y轴图像
2022/04/13 Python