解决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拖拽元素改变大小尺寸实现代码
Dec 10 Javascript
JavaScript实现按照指定长度为数字前面补零输出的方法
Mar 19 Javascript
javascript+html5实现绘制圆环的方法
Jul 28 Javascript
JavaScript中数组的合并以及排序实现示例
Oct 24 Javascript
基于javascript显示当前时间以及倒计时功能
Mar 18 Javascript
JS验证逗号隔开可以是中文字母数字
Apr 22 Javascript
总结JavaScript设计模式编程中的享元模式使用
May 21 Javascript
js Canvas实现的日历时钟案例分享
Dec 25 Javascript
关于 angularJS的一些用法
Nov 29 Javascript
layui之select的option叠加问题的解决方法
Mar 08 Javascript
jQuery对底部导航进行跳转并高亮显示的实例代码
Apr 23 jQuery
node.js使用net模块创建服务器和客户端示例【基于TCP协议】
Feb 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
php json与xml序列化/反序列化
2013/10/28 PHP
php使用unset()删除数组中某个单元(键)的方法
2015/02/17 PHP
Codeigniter校验ip地址的方法
2015/03/21 PHP
PHP SOCKET编程详解
2015/05/22 PHP
php单一接口的实现方法
2015/06/20 PHP
php求一个网段开始与结束IP地址的方法
2015/07/09 PHP
php提高网站效率的技巧
2015/09/29 PHP
PHP实现小程序批量通知推送
2018/11/27 PHP
用函数式编程技术编写优美的 JavaScript_ibm
2008/05/16 Javascript
jquery控制listbox中项的移动并排序的实现代码
2010/09/28 Javascript
FireFox下XML对象转化成字符串的解决方法
2011/12/09 Javascript
javascript加号&quot;+&quot;的二义性说明
2013/03/04 Javascript
javascript 函数及作用域总结介绍
2013/11/12 Javascript
jQuery获取页面元素绝对与相对位置的方法
2015/06/10 Javascript
在easyUI开发中,出现jquery.easyui.min.js函数库问题的解决办法
2015/09/11 Javascript
js+css绘制颜色动态变化的圈中圈效果
2016/01/27 Javascript
JS html时钟制作代码分享
2017/03/03 Javascript
jquery PrintArea 实现票据的套打功能(代码)
2017/03/17 Javascript
Javascript中 toFixed四舍六入方法
2017/08/21 Javascript
Vue兼容ie9的问题全面解决方案
2018/06/19 Javascript
[00:37]2016完美“圣”典风云人物:AMS宣传片
2016/12/06 DOTA
[00:36]DOTA2勇士令状莱恩声望物品——冥晶之厄展示
2018/05/25 DOTA
python实现通过pil模块对图片格式进行转换的方法
2015/03/24 Python
python+matplotlib绘制旋转椭圆实例代码
2018/01/12 Python
使用Python的Django和layim实现即时通讯的方法
2018/05/25 Python
在Mac下使用python实现简单的目录树展示方法
2018/11/01 Python
Python文件时间操作步骤代码详解
2020/04/13 Python
深入了解Python装饰器的高级用法
2020/08/13 Python
CSS3制作皮卡丘动画壁纸的示例
2020/11/02 HTML / CSS
详解Canvas 跨域脱坑实践
2018/11/07 HTML / CSS
Philosophy美国官网:美国美容品牌
2016/08/15 全球购物
ebookers英国:隶属全球最大的在线旅游公司Expedia
2017/12/28 全球购物
美术指导求职信
2014/03/17 职场文书
医院2014国庆节活动策划方案
2014/09/21 职场文书
综合办公室主任岗位职责
2015/04/01 职场文书
2016年万圣节活动总结
2016/04/05 职场文书