解决vue单页面 回退页面 keeplive 缓存问题


Posted in Javascript onJuly 22, 2020

场景:项目中遇到 vue 点击回退 从A页跳到B页,缓存A页,当B页状态修改再次返回A时,A页查询条件缓存不刷新,列表刷新

A页:

解决vue单页面 回退页面 keeplive 缓存问题

B页:

解决vue单页面 回退页面 keeplive 缓存问题

解决方法:

利用keep-alive 缓存需要缓存的页面

1.在app.vue中改写router-view

<template>
 <div id="app">
   <keep-alive>
    <router-view v-if="$route.meta.keepAlive">
      <!-- 这里是会被缓存的视图组件,比如 page1,page2 -->
    </router-view>
  </keep-alive>
  <router-view v-if="!$route.meta.keepAlive">
    <!-- 这里是不被缓存的视图组件,比如 page3 -->
  </router-view>
 </div>
</template>

2.在router/index.js中添加路由元信息,设置需要缓存的页面

keepAlive:设置需要缓存的页面

isBack:通过beforeRouteEnter这个钩子函数中的from参数判断是从哪个页面过来的,这个参数执行时,组件实例还没创建,不能在data中定义变量。所以我们可以在路由中定义一个变量isBack,用来判断。

{
  path: '/trade',
  name: 'trade',
  component: () => import( /* webpackChunkName: "about" */ '@/views/trade.vue'),
  meta: {
   title:'trade.tradeTitle',
   keepAlive: true, // 此组件需要被缓存
   isBack:false, //用于判断上一个页面是哪个
  }
 },
 {
  path: '/detail/:id',
  name: 'detail',
  component: () => import( /* webpackChunkName: "about" */ '@/views/detail.vue'),
  meta: {
   title:'trade.detailTitle',
   keepAlive: false,
   isBack:false,//用于判断上一个页面是哪个
  }
 },

钩子函数的执行顺序:

不使用keep-alive

beforeRouteEnter --> created --> mounted --> destroyed

使用keep-alive

beforeRouteEnter --> created --> mounted --> activated --> deactivated

再次进入缓存的页面,只会触发beforeRouteEnter -->activated --> deactivated 。created和mounted不会再执行。我们可以利用不同的钩子函数,做不同的事。务必理解上述钩子函数的执行时机和执行顺序,本教程的核心就依赖于此钩子函数

activated和deactivated是使用keep-alive后,vue中比较重要的两个钩子函数,建议详细了解下。

在A页面中通过beforeRouteEnter这个钩子函数中判断是从哪个页面过来的

beforeRouteLeave(to, from, next) {
 // 路由导航钩子,此时还不能获取组件实例 `this`,所以无法在data中定义变量(利用vm除外)
   // 参考 https://router.vuejs.org/zh-cn/advanced/navigation-guards.html
   // 所以,利用路由元信息中的meta字段设置变量,方便在各个位置获取。这就是为什么在meta中定义isBack
   // 参考 https://router.vuejs.org/zh-cn/advanced/meta.html
  if (from.path === '/detail'){
   //判断是从哪个路由过来的,
    //如果是B页面即detail页面过来的,表明当前页面不需要刷新获取新数据,直接用之前缓存的数据即可
   to.meta.isBack = true;
  }else{
   to.meta.isBack = false;
  }
  next();
 },

data中定义变量isFirstEnter用来判断是否第一次进入,或是否刷新了页面,默认false

data() {
  return {
   isFirstEnter:false,
  };
 },

created中把isFirstEnter变为true,说明是第一次进入或刷新了页面

created() {
   this.isFirstEnter=true;
   // 只有第一次进入或者刷新页面后才会执行此钩子函数
   // 使用keep-alive后(2+次)进入不会再执行此钩子函数
   this.$nextTick(() => {
   this.getLists();
  });
 },

activated中增加判断条件

activated() {
  if(this.$route.meta.isBack || !this.isFirstEnter){
   // 如果isBack是false,表明需要获取新数据,否则就不再请求,直接使用缓存的数据
   // 如果isFirstEnter是true,表明是第一次进入此页面或用户刷新了页面,需获取新数据
   this.tradeList=[]
   this.AjaxList = []   //把数据清空,可以稍微避免让用户看到之前缓存的数据
   this.pageNum = 1;
   this.$nextTick(() => {
    this.getLists();
   });
  }else{
   this.$route.meta.isBack=false
   this.isFirstEnter=false;
  }
},

以上这篇解决vue单页面 回退页面 keeplive 缓存问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
计算世界完全对称日的js代码,粗糙版
Nov 04 Javascript
JS OffsetParent属性深入解析
Jan 13 Javascript
js实现正方形颜色从下往上升的效果
Aug 04 Javascript
js制作简易年历完整实例
Jan 28 Javascript
深入理解Node.js的HTTP模块
Oct 12 Javascript
JS去除字符串中空格的方法
Feb 14 Javascript
在javaScript中检测数据类型的几种方式小结
Mar 04 Javascript
Vue动态实现评分效果
May 24 Javascript
详解vue2.0的Element UI的表格table列时间戳格式化
Jun 13 Javascript
vue webpack开发访问后台接口全局配置的方法
Sep 18 Javascript
解决vue admin element noCache设置无效的问题
Nov 12 Javascript
.netcore+vue 实现压缩文件下载功能
Sep 24 Javascript
vue移动端弹起蒙层滑动禁止底部滑动操作
Jul 22 #Javascript
在vue中实现禁止屏幕滚动,禁止屏幕滑动
Jul 22 #Javascript
vue 弹出遮罩层样式实例
Jul 22 #Javascript
vue中解决拖拽改变存在iframe的div大小时卡顿问题
Jul 22 #Javascript
vue中实现拖动调整左右两侧div的宽度的示例代码
Jul 22 #Javascript
在vue中实现禁止回退上一步,路由不存历史记录
Jul 22 #Javascript
vue项目中使用多选框的实例代码
Jul 22 #Javascript
You might like
php is_file 判断给定文件名是否为一个正常的文件
2010/05/10 PHP
PHP版微信小店接口开发实例
2016/11/12 PHP
详解关于php的xdebug配置(编辑器vscode)
2019/01/29 PHP
PHP之多条件混合筛选功能的实现方法
2019/10/09 PHP
js前台判断开始时间是否小于结束时间
2012/02/23 Javascript
如何制作浮动广告 JavaScript制作浮动广告代码
2012/12/30 Javascript
js螺旋动画效果的具体实例
2013/11/15 Javascript
自定义函数实现IE7与IE8不兼容js中trim函数的问题
2015/02/03 Javascript
ionic2屏幕适配实现适配手机、平板等设备的示例代码
2017/08/11 Javascript
二维码图片生成器QRCode.js简单介绍
2017/08/18 Javascript
Vue 兄弟组件通信的方法(不使用Vuex)
2017/10/26 Javascript
Vue中UI组件库之Vuex与虚拟服务器初识
2019/05/07 Javascript
Javascript表单序列化原理及实现代码详解
2020/10/30 Javascript
[57:59]EG vs Secret 2018国际邀请赛淘汰赛BO3 第一场 8.22
2018/08/23 DOTA
[00:20]TI9观赛名额抽取Ⅱ
2019/07/24 DOTA
Python3中使用urllib的方法详解(header,代理,超时,认证,异常处理)
2016/09/21 Python
python+pygame简单画板实现代码实例
2017/12/13 Python
python实现k-means聚类算法
2018/02/23 Python
详谈python3中用for循环删除列表中元素的坑
2018/04/19 Python
Python requests库用法实例详解
2018/08/14 Python
Python UnboundLocalError和NameError错误根源案例解析
2018/10/31 Python
python写入文件自动换行问题的方法
2019/07/05 Python
python自动下载图片的方法示例
2020/03/25 Python
Django:使用filter的pk进行多值查询操作
2020/07/15 Python
python爬虫利用代理池更换IP的方法步骤
2021/02/21 Python
CSS3 实现的火焰动画
2020/12/07 HTML / CSS
HTML5 Convas APIs方法详解
2015/04/24 HTML / CSS
Lacoste美国官网:经典POLO衫品牌
2016/10/12 全球购物
试解释COMMIT操作和ROLLBACK操作的语义
2014/07/25 面试题
单位办理社保介绍信
2014/01/10 职场文书
秦始皇兵马俑导游词
2015/02/02 职场文书
幼师个人总结范文
2015/02/28 职场文书
博物馆观后感
2015/06/05 职场文书
运动会观后感
2015/06/09 职场文书
python3 hdf5文件 遍历代码
2021/05/19 Python
5种 JavaScript 方式实现数组扁平化
2021/10/05 Javascript