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 相关文章推荐
javascript闭包的理解和实例
Aug 12 Javascript
jquery异步调用页面后台方法&amp;#8207;(asp.net)
Mar 01 Javascript
js动态为代码着色显示行号
May 29 Javascript
如何将网页表格内容导入excel
Feb 18 Javascript
深入理解JavaScript系列(43):设计模式之状态模式详解
Mar 04 Javascript
TypeScript 学习笔记之基本类型
Jun 19 Javascript
jQuery中attr()与prop()函数用法实例详解(附用法区别)
Dec 29 Javascript
jQuery事件绑定用法详解(附bind和live的区别)
Jan 19 Javascript
Angular实现的自定义模糊查询、排序及三角箭头标注功能示例
Dec 28 Javascript
vue使用jsonp抓取qq音乐数据的方法
Jun 21 Javascript
微信公众号获取用户地理位置并列出附近的门店的示例代码
Jul 25 Javascript
vue实现购物车功能(商品分类)
Apr 20 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
Smarty结合Ajax实现无刷新留言本实例
2007/01/02 PHP
php cookie 登录验证示例代码
2009/03/16 PHP
PHP动态页生成静态页的3种常用方法
2014/11/13 PHP
php json中文编码为null的解决办法
2016/12/14 PHP
web前端开发也需要日志
2010/12/09 Javascript
Fixie.js 自动填充内容的插件
2012/06/28 Javascript
JS去除字符串两端空格的简单实例
2013/12/27 Javascript
jQuery mobile类库使用时加载导航历史的方法简介
2015/12/04 Javascript
理解Javascript图片预加载
2016/02/23 Javascript
JS中setTimeout的巧妙用法前端函数节流
2016/03/24 Javascript
jQuery实现无限往下滚动效果代码
2016/04/16 Javascript
JavaScript闭包和范围实例详解
2016/12/19 Javascript
JS实现简单拖拽效果
2017/06/21 Javascript
nodejs操作mongodb的增删改查功能实例
2017/11/09 NodeJs
详解webpack-dev-server使用http-proxy解决跨域问题
2018/01/13 Javascript
Vue.js实现双向数据绑定方法(表单自动赋值、表单自动取值)
2018/08/27 Javascript
vue根据值给予不同class的实例
2018/09/29 Javascript
微信小程序如何使用globalData的方法
2019/06/06 Javascript
详解Vue3中对VDOM的改进
2020/04/23 Javascript
[06:10]6.81新信使新套装!给你一个炫酷的DOTA2
2014/05/06 DOTA
Python抓取京东图书评论数据
2014/08/31 Python
分享一个常用的Python模拟登陆类
2015/03/29 Python
使用Python实现博客上进行自动翻页
2017/08/23 Python
Python实现求解括号匹配问题的方法
2018/04/17 Python
python 用opencv调用训练好的模型进行识别的方法
2018/12/07 Python
python的turtle库使用详解
2019/05/10 Python
Python pandas RFM模型应用实例详解
2019/11/20 Python
Python 捕获代码中所有异常的方法
2020/08/03 Python
HTML5制作3D爱心动画教程 献给女友浪漫的礼物
2014/11/05 HTML / CSS
美国单身专业人士在线约会网站:EliteSingles
2019/03/19 全球购物
经理职责范文
2013/11/08 职场文书
小区物业门卫岗位职责
2014/04/10 职场文书
2014乡镇党委副书记对照检查材料思想汇报
2014/10/09 职场文书
2015年采购工作总结
2015/04/10 职场文书
环保建议书作文400字
2015/09/14 职场文书
酒吧七夕情人节宣传语
2015/11/24 职场文书