解决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 相关文章推荐
抽出www.templatemonster.com的鼠标悬停加载大图模板的代码
Jul 11 Javascript
JavaScript 上万关键字瞬间匹配实现代码
Jul 07 Javascript
js读取被点击次数的简单实例(从数据库中读取)
Mar 07 Javascript
基于dropdown.js实现的两款美观大气的二级导航菜单
Sep 02 Javascript
如何使用PHP+jQuery+MySQL实现异步加载ECharts地图数据(附源码下载)
Feb 23 Javascript
使用getBoundingClientRect方法实现简洁的sticky组件的方法
Mar 22 Javascript
JS模仿腾讯图片站的图片翻页按钮效果完整实例
Jun 21 Javascript
在vue.js中抽出公共代码的方法示例
Jun 08 Javascript
完美解决iview 的select下拉框选项错位的问题
Mar 02 Javascript
vue路由教程之静态路由
Sep 03 Javascript
微信小程序自定义tabBar在uni-app的适配详解
Sep 30 Javascript
js 计数排序的实现示例(升级版)
Jan 12 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
PHPCMS的使用小结
2010/09/20 PHP
ThinkPHP中自定义目录结构的设置方法
2014/08/15 PHP
PHP date()格式MySQL中插入datetime方法
2019/01/29 PHP
Extjs3.0 checkboxGroup 动态添加item实现思路
2013/08/14 Javascript
JQuery插入DOM节点的方法
2015/06/11 Javascript
JavaScript验证Email(3种方法)
2015/09/21 Javascript
JavaScript Ajax编程 应用篇
2016/07/02 Javascript
JS公共小方法之判断对象是否为domElement的实例
2016/11/25 Javascript
JavaScript实现简单评论功能
2017/08/17 Javascript
详解 vue better-scroll滚动插件排坑
2018/02/08 Javascript
javascript原生封装一个淡入淡出效果的函数测试实例代码
2018/03/19 Javascript
在微信小程序里使用watch和computed的方法
2018/08/02 Javascript
Vue父子组件之间的通信实例详解
2018/09/28 Javascript
vue组件之间通信实例总结(点赞功能)
2018/12/05 Javascript
详解JavaScript 为什么要有 Symbol 类型?
2019/04/03 Javascript
vue实现数字动态翻牌的效果(开箱即用)
2019/12/08 Javascript
[00:52]DOTA2第二届亚洲邀请赛预选赛宣传片
2017/01/13 DOTA
Python判断变量是否已经定义的方法
2014/08/18 Python
Python中设置变量访问权限的方法
2015/04/27 Python
Python映射拆分操作符用法实例
2015/05/19 Python
对pytorch的函数中的group参数的作用介绍
2020/02/18 Python
Python: tkinter窗口屏幕居中,设置窗口最大,最小尺寸实例
2020/03/04 Python
matplotlib bar()实现百分比堆积柱状图
2021/02/24 Python
HTML5 b和i标记将被赋予真正的语义
2009/07/16 HTML / CSS
世界上最大的巴士旅游观光公司:Big Bus Tours
2016/10/20 全球购物
世界各地的旅游、观光和活动:Isango!
2019/10/29 全球购物
Footshop法国:购买运动鞋
2020/01/19 全球购物
网站美工岗位职责
2014/04/02 职场文书
幼儿园优秀班主任事迹材料
2014/05/14 职场文书
学校三节实施方案
2014/06/09 职场文书
2014年社区工作总结
2014/11/18 职场文书
2015年店长工作总结范文
2015/04/08 职场文书
2015年财务经理工作总结
2015/05/13 职场文书
业务员年终工作总结2015
2015/05/28 职场文书
学校运动会开幕词
2016/03/03 职场文书
Python利用folium实现地图可视化
2021/05/23 Python