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 数据缓存data(name, value)详解及实现
Jan 04 Javascript
深入理解javascript中defer的作用
Dec 11 Javascript
深入探寻javascript定时器
Jan 02 Javascript
JavaScript对象数组排序函数及六个用法
Dec 23 Javascript
自动完成的搜索框javascript实现
Feb 26 Javascript
angularjs使用directive实现分页组件的示例
Feb 07 Javascript
浅谈JS获取元素的N种方法及其动静态讨论
Aug 25 Javascript
深入理解JavaScript和TypeScript中的class
Apr 22 Javascript
Node.js Express安装与使用教程
May 11 Javascript
jQuery擦除插件eraser使用方法详解
Jan 11 jQuery
ckeditor一键排版功能实现方法分析
Feb 06 Javascript
8个非常实用的Vue自定义指令
Dec 15 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 函数语法介绍一
2009/06/14 PHP
php使用function_exists判断函数可用的方法
2014/11/19 PHP
php自定义urlencode,urldecode函数实例
2015/03/24 PHP
PHP常用的小程序代码段
2015/11/14 PHP
修改Laravel5.3中的路由文件与路径
2016/08/10 PHP
PHP中的输出echo、print、printf、sprintf、print_r和var_dump的示例代码
2020/12/01 PHP
CSS中简写属性要注意TRouBLe的顺序问题(避免踩坑)
2021/03/09 HTML / CSS
jQuery 处理网页内容的实现代码
2010/02/15 Javascript
基于jquery的button默认enter事件(回车事件)。
2011/05/18 Javascript
jQuery的animate函数学习记录
2014/08/08 Javascript
同一个网页中实现多个JavaScript特效的方法
2015/02/02 Javascript
javascript实现10个球随机运动、碰撞实例详解
2015/07/08 Javascript
Angular4学习笔记之实现绑定和分包
2017/08/01 Javascript
在小程序开发中使用npm的方法
2018/10/17 Javascript
vue中axios请求的封装实例代码
2019/03/23 Javascript
详解vue路由
2020/08/05 Javascript
JavaScript实现筛选数组
2021/03/02 Javascript
[07:55]2014DOTA2 TI正赛第三日 VG上演推进荣耀DKEG告别
2014/07/21 DOTA
[00:43]DOTA2小紫本全民票选福利PA至宝全方位展示
2014/11/25 DOTA
[01:24:16]2018DOTA2亚洲邀请赛 4.6 全明星赛
2018/04/10 DOTA
Python脚本实现DNSPod DNS动态解析域名
2015/02/14 Python
实例解析Python的Twisted框架中Deferred对象的用法
2016/05/25 Python
分享Python开发中要注意的十个小贴士
2016/08/30 Python
python根据list重命名文件夹里的所有文件实例
2018/10/25 Python
Python爬虫文件下载图文教程
2018/12/23 Python
解析Python3中的Import
2019/10/13 Python
用python计算文件的MD5值
2020/12/23 Python
CSS3 transform的skew属性值图文详解
2014/07/21 HTML / CSS
交通专业个人自荐信格式
2013/09/23 职场文书
大学生的四年学习自我评价
2013/12/13 职场文书
个人求职简历中英文自我评价
2013/12/16 职场文书
《小熊住山洞》教学反思
2014/02/21 职场文书
员工离职证明范本
2015/06/12 职场文书
2019年大学生职业生涯规划书最新范文
2019/03/25 职场文书
python中pandas.read_csv()函数的深入讲解
2021/03/29 Python
MySQL 重写查询语句的三种策略
2021/05/10 MySQL