解决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 delete 使用示例代码
Mar 29 Javascript
Easy.Ajax 部分源代码 支持文件上传功能, 兼容所有主流浏览器
Feb 24 Javascript
javascript拖拽上传类库DropzoneJS使用方法
Dec 05 Javascript
JavaScript继承学习笔记【新手必看】
May 10 Javascript
彻底学会Angular.js中的transclusion
Mar 12 Javascript
JavaScript实现审核流程状态的动态显示进度条
Mar 15 Javascript
微信小程序button组件使用详解
Jan 31 Javascript
使用vue打包时vendor文件过大或者是app.js文件很大的问题
Jun 29 Javascript
Angular5中提取公共组件之radio list的实例代码
Jul 10 Javascript
JavaScript事件对象event用法分析
Jul 27 Javascript
JavaScript前端开发时数值运算的小技巧
Jul 28 Javascript
vue实现公共方法抽离
Jul 31 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
实用函数5
2007/11/08 PHP
PHP跨时区(UTC时间)应用解决方案
2013/01/11 PHP
php 创建以UNIX时间戳命名的文件夹(示例代码)
2014/03/08 PHP
JavaScript中令你抓狂的魔术变量
2006/11/30 Javascript
获取阴历(农历)和当前日期的js代码
2016/02/15 Javascript
AngularJS入门教程之AngularJS 模板
2016/08/18 Javascript
详解Bootstrap的iCheck插件checkbox和radio
2016/08/24 Javascript
微信小程序使用video组件播放视频功能示例【附源码下载】
2017/12/08 Javascript
Vue中的字符串模板的使用
2018/05/17 Javascript
解决在vue项目中webpack打包后字体不生效的问题
2018/09/01 Javascript
layui实现多图片上传并限制上传的图片数量
2019/09/26 Javascript
laravel实现中文和英语互相切换的例子
2019/09/30 Javascript
vue+canvas实现移动端手写签名
2020/05/21 Javascript
[42:22]DOTA2上海特级锦标赛C组小组赛#1 OG VS Archon第一局
2016/02/27 DOTA
Python对列表排序的方法实例分析
2015/05/16 Python
Python验证码识别的方法
2015/07/10 Python
对numpy中数组元素的统一赋值实例
2018/04/04 Python
python 正确保留多位小数的实例
2018/07/16 Python
matplotlib实现区域颜色填充
2019/03/18 Python
Python 多线程,threading模块,创建子线程的两种方式示例
2019/09/29 Python
python 使用while写猜年龄小游戏过程解析
2019/10/07 Python
python 微信好友特征数据分析及可视化
2020/01/07 Python
jupyter notebook中美观显示矩阵实例
2020/04/17 Python
Pycharm创建python文件自动添加日期作者等信息(步骤详解)
2021/02/03 Python
Bench加拿大官方网站:英国城市服装品牌
2017/11/03 全球购物
Kidsroom台湾:来自德国的婴儿用品
2017/12/11 全球购物
公司道歉信范文
2014/01/09 职场文书
最新的互联网创业计划书
2014/01/10 职场文书
会展策划与管理专业大学生职业生涯规划
2014/02/07 职场文书
一句话工作感言
2014/03/01 职场文书
个人查摆剖析材料
2014/10/04 职场文书
2014年保管员工作总结
2014/11/18 职场文书
2016领导干部廉洁从政心得体会
2016/01/19 职场文书
《圆的面积》教学反思
2016/02/19 职场文书
《草船借箭》教学反思
2016/02/23 职场文书
简单聊聊Golang中defer预计算参数
2022/03/25 Golang