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 相关文章推荐
extjs 学习笔记(一) 一些基础知识
Oct 13 Javascript
window.onbeforeunload方法在IE下无法正常工作的解决办法
Jan 23 Javascript
css transform 3D幻灯片特效实现步骤解读
Mar 27 Javascript
jQuery中wrapInner()方法用法实例
Jan 16 Javascript
将页面table内容与样式另存成excel文件的方法
Aug 05 Javascript
jquery实现点击向下展开菜单项(伸缩导航)效果
Aug 22 Javascript
谈谈JSON对象和字符串之间的相互转换JSON.stringify(obj)和JSON.parse(string)
Oct 01 Javascript
使用async-validator编写Form组件的方法
Jan 10 Javascript
微信小程序实现弹出层效果
May 26 Javascript
如何解决.vue文件url引用文件的问题
Jan 18 Javascript
深入理解Puppeteer的入门教程和实践
Mar 05 Javascript
layui实现下拉复选功能的例子(包括数据的回显与上传)
Sep 24 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页面编码的两种方法示例介绍
2014/03/03 PHP
php银联网页支付实现方法
2015/03/04 PHP
php数组生成html下拉列表的方法
2015/07/20 PHP
php实现简单的守护进程创建、开启与关闭操作
2019/08/13 PHP
CL vs ForZe BO5 第五场 2.13
2021/03/10 DOTA
onsubmit阻止form表单提交与onclick的相关操作
2010/09/03 Javascript
Javascript 判断是否存在函数的方法
2013/01/03 Javascript
jquery做的一个简单的屏幕锁定提示框
2014/03/26 Javascript
js实现在同一窗口浏览图片
2014/09/17 Javascript
JS用斜率判断鼠标进入DIV四个方向的方法
2016/11/07 Javascript
Vue.js 递归组件实现树形菜单(实例分享)
2016/12/21 Javascript
js实现符合国情的日期插件详解
2017/01/19 Javascript
react.js使用webpack搭配环境的入门教程
2017/08/14 Javascript
PHP 实现一种多文件上传的方法
2017/09/20 Javascript
Angularjs使用过滤器完成排序功能
2017/09/20 Javascript
JavaScript定义函数的三种实现方法
2017/09/23 Javascript
vuex实现登录状态的存储,未登录状态不允许浏览的方法
2018/03/09 Javascript
Js中将Long转换成日期格式的实现方法
2018/06/05 Javascript
解决LayUI表单获取不到data的问题
2018/08/20 Javascript
vue中接口域名配置为全局变量的实现方法
2018/09/20 Javascript
在微信小程序中使用mqtt服务的方法
2019/12/13 Javascript
在Django中管理Users和Permissions以及Groups的方法
2015/07/23 Python
Python中将两个或多个list合成一个list的方法小结
2019/05/12 Python
tensorflow保持每次训练结果一致的简单实现
2020/02/17 Python
Django模板标签{% for %}循环,获取制定条数据实例
2020/05/14 Python
css图标制作教程制作云图标
2014/01/19 HTML / CSS
马来西亚航空官方网站:Malaysia Airlines
2017/07/28 全球购物
加拿大最大的钻石商店:Peoples Jewellers
2018/01/01 全球购物
捷克汽车配件和工具销售网站:TorriaCars
2018/02/26 全球购物
苏格兰销售女装、男装和童装的连锁店:M&Co
2018/03/16 全球购物
美国电力供应商店/电气批发商:USESI
2018/10/12 全球购物
后勤人员岗位职责
2013/12/17 职场文书
副校长个人对照检查材料思想汇报
2014/10/04 职场文书
未婚证明格式
2015/06/15 职场文书
一文读懂go中semaphore(信号量)源码
2021/04/03 Golang
Linux系统下MySQL配置主从分离的步骤
2022/03/21 MySQL