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 相关文章推荐
js url传值中文乱码之解决之道
Nov 20 Javascript
Javascript Object.extend
May 18 Javascript
Dom 结点创建 基础知识
Oct 01 Javascript
require.js深入了解 require.js特性介绍
Sep 04 Javascript
使用javascript将时间转换成今天,昨天,前天等格式
Jun 25 Javascript
javascript表单处理具体实现代码(表单、链接、按钮)
May 07 Javascript
关于ES6的六个小特性(二)
Feb 20 Javascript
Javascript 详解封装from表单数据为json串进行ajax提交
Mar 29 Javascript
easyui下拉框动态级联加载的示例代码
Nov 29 Javascript
VUE渲染后端返回含有script标签的html字符串示例
Oct 28 Javascript
vue组件库的在线主题编辑器的实现思路
Apr 03 Javascript
canvas多重阴影发光效果实现
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
VFP与其他应用程序的集成
2006/10/09 PHP
用PHP查询搜索引擎排名位置的代码
2010/01/05 PHP
下拉列表多级联动dropDownList示例代码
2013/06/27 PHP
thinkphp 字母函数详解T/I/N/D/M/A/R/U
2017/04/03 PHP
php单元测试phpunit入门实例教程
2017/11/17 PHP
详解PHP多个进程配合redis的有序集合实现大文件去重
2019/03/06 PHP
PHP 扩展Memcached命令用法实例总结
2020/06/04 PHP
Tips 带三角可关闭的文字提示
2010/10/06 Javascript
js鼠标及对象坐标控制属性详细解析
2013/12/14 Javascript
在javascript中如何得到中英文混合字符串的长度
2014/01/17 Javascript
javascript获取函数名称、函数参数、对象属性名称的代码实例
2014/04/12 Javascript
JavaScript分秒倒计时器实现方法
2015/02/02 Javascript
基于JavaScript实现Json数据根据某个字段进行排序
2015/11/24 Javascript
JavaScript基本语法学习教程
2016/01/14 Javascript
用canvas 实现个图片三角化(LOW POLY)效果
2016/02/18 Javascript
window.close(); 关闭浏览器窗口js代码的总结介绍
2016/07/14 Javascript
jQuery自定义多选下拉框效果
2017/06/19 jQuery
JS非空验证及邮箱验证的实例
2017/08/11 Javascript
详解JavaScript基础知识(JSON、Function对象、原型、引用类型)
2018/01/16 Javascript
vue-cli+webpack项目 修改项目名称的方法
2018/02/28 Javascript
javaScript中&quot;==&quot;和&quot;===&quot;的区别详解
2018/03/16 Javascript
JavaScript实现简单音乐播放器
2020/04/17 Javascript
浅谈JavaScript中this的指向问题
2020/07/28 Javascript
Python subprocess模块学习总结
2014/03/13 Python
python中json格式数据输出的简单实现方法
2016/10/31 Python
python dataframe常见操作方法:实现取行、列、切片、统计特征值
2018/06/09 Python
python实现多线程端口扫描
2019/08/31 Python
Python Dataframe常见索引方式详解
2020/05/27 Python
Python基于pandas绘制散点图矩阵代码实例
2020/06/04 Python
如何使用Python处理HDF格式数据及可视化问题
2020/06/24 Python
Python unittest生成测试报告过程解析
2020/09/08 Python
新闻专业本科生的自我评价分享
2013/11/20 职场文书
保安岗位职责
2014/02/21 职场文书
初一语文教学反思
2016/03/03 职场文书
详细聊聊vue中组件的props属性
2021/11/02 Vue.js
SQLServer RANK() 排名函数的使用
2022/03/23 SQL Server