解决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 相关文章推荐
IE与Firefox下javascript getyear年份的兼容性写法
Dec 20 Javascript
关于firefox的ElementTraversal 接口 使用说明
Nov 11 Javascript
让table变成exls的示例代码
Mar 24 Javascript
node.js+Ajax实现获取HTTP服务器返回数据
Nov 26 Javascript
自己封装的一个简单的倒计时功能实例
Nov 23 Javascript
简单理解Vue条件渲染
Dec 03 Javascript
如何更好的编写js async函数
May 13 Javascript
Jquery遍历筛选数组的几种方法和遍历解析json对象,Map()方法详解以及数组中查询某值是否存在
Jan 18 jQuery
vue使用codemirror的两种用法
Aug 27 Javascript
js判断复选框是否选中的方法示例【基于jQuery】
Oct 10 jQuery
JQuery事件委托(适用于给动态生成的脚本元素添加事件)
Feb 01 jQuery
vue 实现用户登录方式的切换功能
Apr 14 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
晶体管单管来复再生式收音机
2021/03/02 无线电
JavaScript 自动完成脚本整理(33个)
2009/10/20 Javascript
让firefox支持IE的一些方法的javascript扩展函数代码
2010/01/02 Javascript
一个原生的用户等级的进度条
2010/07/03 Javascript
理解Javascript_05_原型继承原理
2010/10/13 Javascript
node.js 一个简单的页面输出实现代码
2012/03/07 Javascript
jQuery 网易相册鼠标移动显示隐藏效果实现代码
2013/03/31 Javascript
arcgis for js 修改infowindow样式的方法
2016/11/02 Javascript
JavaScript严格模式详解
2017/01/16 Javascript
在JS中如何把毫秒转换成规定的日期时间格式实例
2017/05/11 Javascript
vue-resouce设置请求头的三种方法
2017/09/12 Javascript
layer插件select选中默认值的方法
2018/08/14 Javascript
对angularJs中ng-style动态改变样式的实例讲解
2018/09/30 Javascript
微信小程序实现多选功能
2018/11/04 Javascript
vue项目实现图片上传功能
2019/12/23 Javascript
[28:05]完美世界DOTA2联赛循环赛Inki vs DeMonsTer 第一场 10月30日
2020/10/31 DOTA
fastcgi文件读取漏洞之python扫描脚本
2017/04/23 Python
Python中的TCP socket写法示例
2018/05/11 Python
redis之django-redis的简单缓存使用
2018/06/07 Python
对python中数组的del,remove,pop区别详解
2018/11/07 Python
Python流行ORM框架sqlalchemy安装与使用教程
2019/06/04 Python
django 框架实现的用户注册、登录、退出功能示例
2019/11/28 Python
python连接打印机实现打印文档、图片、pdf文件等功能
2020/02/07 Python
Jupyter Notebook打开任意文件夹操作
2020/04/14 Python
Marlies Dekkers内衣法国官方网上商店:国际知名的荷兰内衣品牌
2019/03/18 全球购物
财务会计专业毕业生自荐信
2013/10/19 职场文书
五星级酒店餐饮部总监的标准岗位职责
2014/02/17 职场文书
2015年学校党支部工作总结
2015/04/01 职场文书
2015年煤矿安全工作总结
2015/05/23 职场文书
感恩教师节主题班会
2015/08/12 职场文书
2016年10月份红领巾广播稿
2015/12/21 职场文书
《桂花雨》教学反思
2016/02/19 职场文书
Tomcat项目启动失败的原因和解决办法
2022/04/20 Servers
baselines示例程序train_cartpole.py的ImportError
2022/05/20 Python
Redis基本数据类型哈希Hash常用操作命令
2022/06/01 Redis
CSS 鼠标点击拖拽效果的实现代码
2022/12/24 HTML / CSS