解决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中的float运算精度实例分析
Aug 21 Javascript
js类型检查实现代码
Oct 29 Javascript
入门基础学习 ExtJS笔记(一)
Nov 11 Javascript
jquery中实现简单的tabs插件功能的代码
Mar 02 Javascript
实用的Jquery选项卡TAB示例代码
Aug 28 Javascript
javascript验证身份证完全方法具体实现
Nov 18 Javascript
跟我学习javascript的call(),apply(),bind()与回调
Nov 16 Javascript
javascript结合Flexbox简单实现滑动拼图游戏
Feb 18 Javascript
关于JS中match() 和 exec() 返回值和属性的测试
Mar 21 Javascript
jQuery插件HighCharts实现的2D堆条状图效果示例【附demo源码下载】
Mar 14 Javascript
elementui实现预览图片组件二次封装
Dec 29 Javascript
vue项目配置 webpack-obfuscator 进行代码加密混淆的实现
Feb 26 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
谏山创故乡大分县日田市水坝将设立《进击的巨人》立艾伦、三笠以及阿尔敏的铜像!
2020/03/06 日漫
Discuz! Passport 通行证整合
2008/03/27 PHP
PHP初学者最感迷茫的问题小结
2010/03/27 PHP
PHP7.0安装笔记整理
2015/08/28 PHP
windows下的WAMP环境搭建图文教程(推荐)
2017/07/27 PHP
php打开本地exe程序,js打开本地exe应用程序,并传递相关参数方法
2018/02/06 PHP
php实现微信企业转账功能
2018/10/02 PHP
ExtJs Excel导出并下载IIS服务器端遇到的问题
2011/09/16 Javascript
SOSO地图JS画出标注和中心点以html形式运行
2013/08/09 Javascript
js css后面所带参数含义介绍
2013/08/18 Javascript
js验证输入是否为手机号码或电话号码示例
2013/12/30 Javascript
jQuery+json实现的简易Ajax调用实例
2015/12/14 Javascript
学习Node.js模块机制
2016/10/17 Javascript
简单理解js的prototype属性及使用
2016/12/07 Javascript
nodejs 实现钉钉ISV接入的加密解密方法
2017/01/16 NodeJs
Vue-路由导航菜单栏的高亮设置方法
2018/03/17 Javascript
完美解决linux下node.js全局模块找不到的情况
2018/05/16 Javascript
react 父子组件之间通讯props
2018/09/08 Javascript
jQuery实现根据身份证号获取生日、年龄、性别等信息的方法
2019/01/09 jQuery
微信小程序实现人脸识别登陆的示例代码
2019/04/02 Javascript
vue使用代理解决请求跨域问题详解
2019/07/24 Javascript
[01:04]DOTA2:伟大的Roshan雕塑震撼来临
2015/01/30 DOTA
python DataFrame获取行数、列数、索引及第几行第几列的值方法
2018/04/08 Python
python中in在list和dict中查找效率的对比分析
2018/05/04 Python
查看django版本的方法分享
2018/05/14 Python
Python读写及备份oracle数据库操作示例
2018/05/17 Python
python GUI库图形界面开发之PyQt5结合Qt Designer创建信号与槽的详细方法与实例
2020/03/08 Python
django项目中新增app的2种实现方法
2020/04/01 Python
深入浅析pycharm中 Make available to all projects的含义
2020/09/15 Python
Python 使用office365邮箱的示例
2020/10/29 Python
pandas针对excel处理的实现
2021/01/15 Python
德国黑胶唱片、街头服装及运动鞋网上商店:HHV
2018/08/24 全球购物
西班牙多品牌鞋店连锁店:Krack
2018/11/30 全球购物
会计系个人求职信范文分享
2013/12/20 职场文书
房屋继承公证书
2014/04/10 职场文书
2015年党小组工作总结
2015/05/26 职场文书