解决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 相关文章推荐
flash javascript之间的通讯方法小结
Dec 20 Javascript
document.getElementById为空或不是对象的解决方法
Jan 24 Javascript
一起来写段JS drag拖动代码
Dec 09 Javascript
js导航菜单(自写)简单大方
Mar 28 Javascript
JS字符串截取函数实例
Dec 27 Javascript
Javascript验证用户输入URL地址是否为空及格式是否正确
Oct 09 Javascript
[js高手之路]HTML标签解释成DOM节点的实现方法
Aug 31 Javascript
vue实现登录后页面跳转到之前页面
Jan 07 Javascript
angular使用md5,CryptoJS des加密的方法
Jun 03 Javascript
vue指令v-html使用过滤器filters功能实例
Oct 25 Javascript
electron 如何将任意资源打包的方法步骤
Apr 16 Javascript
Vue+Element UI实现概要小弹窗的全过程
May 30 Vue.js
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执行shell脚本运行程序不产生core文件的方法
2016/12/28 PHP
jQuery实现等比例缩放大图片让大图片自适应页面布局
2013/10/16 Javascript
跟我学Nodejs(三)--- Node.js模块
2014/05/25 NodeJs
使用变量动态设置js的属性名
2014/10/19 Javascript
jquery中radio checked问题
2015/03/16 Javascript
JavaScript移除数组内重复元素的方法
2015/03/18 Javascript
JS实现的鼠标跟随代码(卡通手型点击效果)
2015/10/26 Javascript
基于jquery实现省市联动特效
2015/12/17 Javascript
原生javascript实现图片无缝滚动效果
2016/02/12 Javascript
原生JS实现平滑回到顶部组件
2016/03/16 Javascript
简单了解JavaScript操作XPath的一些基本方法
2016/06/03 Javascript
JS+Canvas实现的俄罗斯方块游戏完整实例
2016/12/12 Javascript
JS实现旋转木马式图片轮播效果
2017/01/18 Javascript
Element UI 自定义正则表达式验证方法
2018/09/04 Javascript
VUE中V-IF条件判断改变元素的样式操作
2020/08/09 Javascript
[00:12]DAC2018 no[o]ne亮相SOLO赛 他是否如他的id一样无人可挡?
2018/04/06 DOTA
Python使用正则表达式实现文本替换的方法
2017/04/18 Python
使用TensorFlow实现SVM
2018/09/06 Python
python json.loads兼容单引号数据的方法
2018/12/19 Python
Python3几个常见问题的处理方法
2019/02/26 Python
你可能不知道的Python 技巧小结
2020/01/29 Python
Python中包的用法及安装
2020/02/11 Python
Python魔术方法专题
2020/06/19 Python
通过Django Admin+HttpRunner1.5.6实现简易接口测试平台
2020/11/11 Python
详解利用python识别图片中的条码(pyzbar)及条码图片矫正和增强
2020/11/17 Python
美国家具网站:Cymax
2016/09/17 全球购物
工程管理专业个人求职信范文
2013/12/07 职场文书
大四本科生的自我评价
2013/12/30 职场文书
给客户的道歉信
2014/01/13 职场文书
环境科学专业优秀毕业生自荐书
2014/02/03 职场文书
六一亲子活动总结
2014/07/01 职场文书
2015年公务员工作总结
2015/04/24 职场文书
2015年党小组工作总结
2015/05/26 职场文书
导游词之徐州云龙湖
2019/11/19 职场文书
MySQL kill不掉线程的原因
2021/05/07 MySQL
如何利用Python实现一个论文降重工具
2021/07/09 Python