解决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 相关文章推荐
JQuery入门——事件切换之toggle()方法应用介绍
Feb 05 Javascript
判断复选框是否被选中的两种方法
Jun 04 Javascript
javascript创建动态表单的方法
Jul 25 Javascript
js事件冒泡、事件捕获和阻止默认事件详解
Aug 04 Javascript
Angularjs结合Bootstrap制作的一个TODO List
Aug 18 Javascript
jQuery实现智能判断固定导航条或侧边栏的方法
Sep 04 Javascript
Jquery实时监听input value的实例
Jan 26 Javascript
微信小程序request出现400的问题解决办法
May 23 Javascript
详解vue中引入stylus及报错解决方法
Sep 22 Javascript
JS中的两种数据类型及实现引用类型的深拷贝的方法
Aug 12 Javascript
layui自定义插件citySelect实现省市区三级联动选择
Jul 26 Javascript
Node.js API详解之 util模块用法实例分析
May 09 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
xml+php动态载入与分页
2006/10/09 PHP
php强制运行广告的方法
2014/12/01 PHP
PHP解析RSS的方法
2015/03/05 PHP
List Installed Software Features
2007/06/11 Javascript
ASP.NET jQuery 实例13 原创jQuery文本框字符限制插件-TextArea Counter
2012/02/03 Javascript
5秒后跳转到另一个页面的js代码
2013/10/12 Javascript
jquery教程限制文本框只能输入数字和小数点示例分享
2014/01/13 Javascript
Jquery ajax加载等待执行结束再继续执行下面代码操作
2015/11/24 Javascript
JavaScript实现使用Canvas绘制图形的基本教程
2016/10/27 Javascript
AngularJS 中ui-view传参的实例详解
2017/08/25 Javascript
vue单个组件实现无限层级多选菜单功能
2018/04/10 Javascript
35个最好用的Vue开源库(史上最全)
2019/01/03 Javascript
bootstrap table插件动态加载表头
2019/07/19 Javascript
基于vue.js仿淘宝收货地址并设置默认地址的案例分析
2020/08/20 Javascript
[04:09]2014DOTA2国际邀请赛Ti西雅图 历届冠军相继出局 BBC综述今日比赛
2014/07/20 DOTA
Python类的专用方法实例分析
2015/01/09 Python
Python进程间通信用法实例
2015/06/04 Python
Python处理JSON数据并生成条形图
2016/08/05 Python
python的socket编程入门
2018/01/29 Python
关于Python正则表达式 findall函数问题详解
2018/03/22 Python
将matplotlib绘图嵌入pyqt的方法示例
2020/01/08 Python
太阳镜仓库,售价20美元或更少:Sunglass Warehouse
2016/09/28 全球购物
欧洲领先的火车票和大巴票预订平台:Trainline
2018/12/26 全球购物
学生评语大全
2014/04/18 职场文书
超市促销活动总结
2014/07/01 职场文书
中华在我心中演讲稿
2014/09/13 职场文书
迎新生欢迎词
2015/01/23 职场文书
公司放假通知怎么写
2015/04/15 职场文书
2015公司年度工作总结
2015/05/14 职场文书
三严三实学习心得体会(精选N篇)
2016/01/05 职场文书
iPhone13将有八大升级
2021/04/15 数码科技
Python机器学习之逻辑回归
2021/05/11 Python
MySQL REVOKE实现删除用户权限
2021/06/18 MySQL
解析Redis Cluster原理
2021/06/21 Redis
MySQL 外连接语法之 OUTER JOIN
2022/04/09 MySQL
单机多实例部署 MySQL8.0.20
2022/05/15 MySQL