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 相关文章推荐
jQuery使用手册之二 DOM操作
Mar 24 Javascript
jquery 学习笔记 传智博客佟老师附详细注释
Sep 12 Javascript
jQuery Clone Bug解决代码
Dec 22 Javascript
javascript作用域容易记错的两个地方分析
Jun 22 Javascript
Javascript基础知识(一)核心基础语法与事件模型
Sep 29 Javascript
利用node.js搭建简单web服务器的方法教程
Feb 20 Javascript
Vue.js实现移动端短信验证码功能
Mar 29 Javascript
基于Axios 常用的请求方法别名(详解)
Mar 13 Javascript
基于JS实现html中placeholder属性提示文字效果示例
Apr 19 Javascript
js中获取URL参数的共用方法getRequest()方法实例详解
Oct 24 Javascript
vue + element-ui的分页问题实现
Dec 17 Javascript
layui中的switch开关实现方法
Sep 03 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
PHP 只允许指定IP访问(允许*号通配符过滤IP)
2014/07/08 PHP
php中动态调用函数的方法
2015/03/16 PHP
Yii框架中jquery表单验证插件用法示例
2016/10/18 PHP
JQuery的read函数与js的onload不同方式实现
2013/03/18 Javascript
基于jquery实现后台左侧菜单点击上下滑动显示
2013/04/11 Javascript
jquery动态增加删除表格行的小例子
2013/11/14 Javascript
node.js中的fs.rename方法使用说明
2014/12/16 Javascript
浅析jQuery 3.0中的Data
2016/06/14 Javascript
基于Vue实现timepicker
2017/04/25 Javascript
JavaScript常用截取字符串的三种方式用法区别实例解析
2018/05/15 Javascript
理顺8个版本vue的区别(小结)
2018/09/17 Javascript
使用puppeteer爬取网站并抓出404无效链接
2018/12/20 Javascript
了解重排与重绘
2019/05/29 Javascript
如何阻止小程序遮罩层下方图层滚动
2019/09/05 Javascript
微信小程序个人中心的列表控件实现代码
2020/04/26 Javascript
Python文件夹与文件的操作实现代码
2014/07/13 Python
Python中的urllib模块使用详解
2015/07/07 Python
Python使用PIL库实现验证码图片的方法
2016/03/11 Python
Python3 中文文件读写方法
2018/01/23 Python
Python错误处理操作示例
2018/07/18 Python
python实现简单加密解密机制
2019/03/19 Python
如何用Python破解wifi密码过程详解
2019/07/12 Python
Python读写文件模式和文件对象方法实例详解
2019/09/17 Python
Python中如何将一个类方法变为多个方法
2019/12/30 Python
使用 django orm 写 exists 条件过滤实例
2020/05/20 Python
python不到50行代码完成了多张excel合并的实现示例
2020/05/28 Python
python中def是做什么的
2020/06/10 Python
css3 clip实现圆环进度条的示例代码
2018/02/07 HTML / CSS
违反工作纪律检讨书
2014/02/15 职场文书
岗位工作说明书
2014/07/29 职场文书
2014年英语教研组工作总结
2014/12/06 职场文书
土地租赁协议书
2015/01/29 职场文书
颐和园的导游词
2015/01/30 职场文书
黄山导游词
2015/01/31 职场文书
《艾尔登法环》1.03.3补丁上线 碎星伤害调整
2022/04/07 其他游戏
解决WINDOWS电脑开机后桌面没有任何图标
2022/04/09 数码科技