解决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 相关文章推荐
javascript 折半查找字符在数组中的位置(有序列表)
Dec 09 Javascript
jQuery Ajax使用 全解析
Dec 15 Javascript
基于JQuery的Select选择框的华丽变身
Aug 23 Javascript
获取表单控件原始(初始)值的方法
Aug 21 Javascript
JavaScript中的console.time()函数详细介绍
Dec 29 Javascript
使用jQuery制作遮罩层弹出效果的极简实例分享
May 12 Javascript
JavaScript编程中实现对象封装特性的实例讲解
Jun 24 Javascript
使用node.js中的Buffer类处理二进制数据的方法
Nov 26 Javascript
JS二分查找算法详解
Nov 01 Javascript
记录vue项目中遇到的一点小问题
May 14 Javascript
node.js的http.createServer过程深入解析
Jun 06 Javascript
vue集成openlayers加载geojson并实现点击弹窗教程
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
关于BIG5-HKSCS的解决方法
2007/03/20 PHP
php判断文件上传类型及过滤不安全数据的方法
2014/12/17 PHP
PHP错误机制知识汇总
2016/03/24 PHP
php实现贪吃蛇小游戏
2016/07/26 PHP
php mysql procedure实现获取多个结果集的方法【基于thinkPHP】
2016/11/09 PHP
jquery.cookie用法详细解析
2013/12/18 Javascript
JavaScript通过正则表达式实现表单验证电话号码
2014/03/07 Javascript
快速学习JavaScript的6个思维技巧
2015/10/13 Javascript
angular仿支付宝密码框输入效果
2017/03/25 Javascript
nodejs个人博客开发第七步 后台登陆
2017/04/12 NodeJs
jquery实现图片放大点击切换
2017/06/06 jQuery
详解Vue学习笔记入门篇之组件的内容分发(slot)
2017/07/17 Javascript
Vue实现点击时间获取时间段查询功能
2020/08/21 Javascript
python网络编程之读取网站根目录实例
2014/09/30 Python
Python正则表达式匹配HTML页面编码
2015/04/08 Python
详解Python当中的字符串和编码
2015/04/25 Python
在VS Code上搭建Python开发环境的方法
2018/04/06 Python
python实现验证码识别功能
2018/06/07 Python
解决新版Pycharm中Matplotlib图像不在弹出独立的显示窗口问题
2019/01/15 Python
Django 全局的static和templates的使用详解
2019/07/19 Python
django搭建项目配置环境和创建表过程详解
2019/07/22 Python
python爬虫爬取笔趣网小说网站过程图解
2019/11/18 Python
python定间隔取点(np.linspace)的实现
2019/11/27 Python
python 经典数字滤波实例
2019/12/16 Python
详解python命令提示符窗口下如何运行python脚本
2020/09/11 Python
Python通过getattr函数获取对象的属性值
2020/10/16 Python
YesBabyOnline美国:全球性的在线婚纱礼服工厂
2018/05/05 全球购物
在C语言中"指针和数组等价"到底是什么意思?
2014/03/24 面试题
商场总经理岗位职责
2014/02/03 职场文书
加入学生会演讲稿
2014/04/24 职场文书
建筑施工安全责任书
2014/07/24 职场文书
医务人员医德考评自我评价
2015/03/03 职场文书
保险公司反洗钱宣传活动总结
2015/05/08 职场文书
分享15个Webpack实用的插件!!!
2021/03/31 Javascript
浅谈Python数学建模之整数规划
2021/06/23 Python
vue @click.native 绑定原生点击事件
2022/04/22 Vue.js