解决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 相关文章推荐
超级简单的图片防盗(HTML),好用
Apr 08 Javascript
javascript add event remove event
Apr 07 Javascript
window.onresize 多次触发的解决方法
Nov 08 Javascript
借助javascript代码判断网页是静态还是伪静态
May 05 Javascript
网站接入QQ登录的两种方法
Jul 22 Javascript
JS数组操作(数组增加、删除、翻转、转字符串、取索引、截取(切片)slice、剪接splice、数组合并)
May 20 Javascript
jquery实现拖动效果(代码分享)
Jan 25 Javascript
jQuery、zepto、js常用小技巧
Feb 12 Javascript
JavaScript控制浏览器全屏显示简单示例
Jul 05 Javascript
Vue项目中使用WebUploader实现文件上传的方法
Jul 21 Javascript
js图数据结构处理 迪杰斯特拉算法代码实例
Sep 11 Javascript
webpack4 optimization使用总结
Nov 10 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 如何向 MySQL 发送数据
2006/10/09 PHP
20个2014年最优秀的PHP框架回顾
2014/10/22 PHP
yii2超好用的日期组件和时间组件
2016/05/05 PHP
Yii使用DbTarget实现日志功能的示例代码
2020/07/21 PHP
css把超出的部分显示为省略号的方法兼容火狐
2008/07/23 Javascript
替代window.event.srcElement效果的可兼容性的函数
2009/12/18 Javascript
基于jQuery的试卷自动排版系统实现代码
2011/01/06 Javascript
JavaScript高级程序设计 错误处理与调试学习笔记
2011/09/10 Javascript
JavaScript表达式:URL 协议介绍
2013/03/10 Javascript
javascript 表格内容排序 简单操作示例代码
2014/01/03 Javascript
Jquery Ajax解析XML数据(同步及异步调用)简单实例
2014/02/12 Javascript
Jquery日历插件制作简单日历
2015/10/28 Javascript
js实现textarea限制输入字数
2017/02/13 Javascript
Angular2中如何使用ngx-translate进行国际化
2017/05/21 Javascript
Vue条件循环判断+计算属性+绑定样式v-bind的实例
2018/09/18 Javascript
vue组件实现移动端九宫格转盘抽奖
2020/10/16 Javascript
[02:23]1个至宝=115个英雄特效 最“绿”至宝拉比克“魔导师密钥”登场
2018/12/29 DOTA
python实现textrank关键词提取
2018/06/22 Python
django开发post接口简单案例,获取参数值的方法
2018/12/11 Python
利用Python正则表达式过滤敏感词的方法
2019/01/21 Python
Python正则表达式匹配数字和小数的方法
2019/07/03 Python
Python操作MySQL数据库实例详解【安装、连接、增删改查等】
2020/01/17 Python
tensorflow 变长序列存储实例
2020/01/20 Python
Django全局启用登陆验证login_required的方法
2020/06/02 Python
详解python中的闭包
2020/09/07 Python
使用Python爬取小姐姐图片(beautifulsoup法)
2021/02/11 Python
美体小铺加拿大官方网站:The Body Shop加拿大
2016/10/30 全球购物
世界上最大的二手相机店:KEN
2017/05/17 全球购物
德国街头和运动文化高品质商店:BSTN Store
2017/08/26 全球购物
到底Java是如何传递参数的?是by value或by reference?
2012/07/13 面试题
Linux常见面试题
2016/10/04 面试题
博士生求职信
2014/07/06 职场文书
农村文化建设标语
2014/10/07 职场文书
2014年移动公司工作总结
2014/12/08 职场文书
公司优秀员工推荐信
2015/03/24 职场文书
Win10 和 Win11可以共存吗? win10/11产品生命周期/服务更新介绍
2021/11/21 数码科技