vue路由中前进后退的一些事儿


Posted in Javascript onMay 18, 2019

前言

最近蒸煮在做一个独立项目的时候遇到了一个小坑,特此做个爬坑纪念。

基本情景是页面之间通过vue路由跳转,从页面A跳转到页面B(在页面B进行对应操作后),再从页面B跳转到页面C。之后再从页面C返回到页面B,页面B保留之前状态,返回页面A,页面B状态不保留。(。・∀・)ノ゙嗨~感觉说的好乱。

总之就是,前进刷新,后退不刷新(刷新是指是否重新渲染)

相信很多小伙伴都会想到用keep-alive开启缓存页面来实现,鹅,蒸煮也没例外,下面就是蒸煮的爬坑过程。

vue路由开启keep-alive缓存页面

keep-alive是vue官方提供的一种缓存组件实例的方法。

第一步,先改写<router-view>的展示方式

<keep-alive>
//这是会被缓存的页面
 <router-view v-if="$route.meta.keepAlive">
 </router-view></keep-alive>
<router-view v-if = "!$route.meta.keepAlive">
//这里是不被缓存的组件
</router-view>

第二步,在路由配置文件里,配置组件是否被缓存

routes:[
 {  path: '/', 
   name: 'Index', 
   component: Index,  
   meta:{ 
    title:"博物馆",  
    keepAlive:false//不缓存 
   } 
   }, 
   { 
   path:'/searchMain', 
   name:'SearchMain', 
   component:SearchMain, 
   meta:{ 
    title:"搜索", 
    keepAlive:true,//缓存 
     } 
   },
   { 
   path:'/collectionDetails', 
   name:'CollectionDetails', 
   component:CollectionDetails, 
   meta:{  
    title:"藏品详情", 
    keepAlive:false,//不缓存 
    } 
   }]

这样的话无论什么时候,缓存的组件一直会被缓存

第三步,根据路由钩子来改变缓存组件的状态

beforeRouteLeave(to, from, next) { 
  if(to.path="首页"){
   from.meta.keepAlive =false;
  }else if(to.path="详情页"){
  from.meta.keepAlive = true;
  } // 跳转到 首页时,不缓存,跳转到详情页时缓存(就是不刷新) 
  next();
  }
这种行吗?行吗?行吗?不行!!因为第一次的时候确实会成功,可是退出去以后就gg了,
因为keepAlive已经变成了false,第二次就不会缓存。那么第一个页面加下面代码,让他进入的时候
 beforeRouteLeave(to, from, next) { 
  if(to.path=="/searchMain"){ 
  to.meta.keepAlive =true;  
  } 
  next(true); 
 return; 
},

实践证明,搜索界面的数据一直是第一次缓存过的数据。

二,为了解决这个问题,蒸煮想起了keep-alive组件相关的两个钩子函数。

activated:缓存的组件再次进入时触发;

deactivated:缓存的组件离开时会触发;

第一次进入keep-alive组件时,其生命周期执行顺序:

beforeRouteEnter ->created ->mounted ...->activated ->deactivated

非首次进入时,其生命周期执行顺序

beforeRouteEnter ->activated ->deactivated

第二次进入的时候vue组件的生命周期函数都没有执行,说明缓存组件也无法销毁。更无法更新。

解决方法

activated() {
 if(!this.$route.meta.isBack) {
  // 如果isBack是false,表明需要获取新数据,否则就不再请求,直接使用缓存的数据  this.getData(); // ajax获取数据方法
 }
 // 恢复成默认的false,避免isBack一直是true,导致下次无法获取数据
 this.$route.meta.isBack = false
},

但素,重新换取数据,之前保存在data里的数据并没有变,感觉还是不太彻底!

终极解决方案

最后终于到答案的最后一步啦那

就是动态给要缓存的路由组件添加key值啦~

<keep-alive>
   <router-view v-if="$route.meta.keepAlive" :key='key'></router-view>
</keep-alive>
   <router-view v-if="!$route.meta.keepAlive" :key='key'></router-view>

在vuex中有条件改变key的值

beforeRouteLeave(to,from,next){
 if(to.path=="/"){
  this.$store.commit("UPDATE_KEY",this.$route.name!==undefined?this.$route.name+
  +new Date():this.$route+ +new Date());
 }
}

这样的话就会有一个很重要的问题,这些缓存过的组件,都是在内存中的,如果一直操作,内存堆积越来越大,导致系统卡顿。所以离开时就销毁吧

手动触发销毁

beforeRouteLeave(to,from,next){
 if(to.path=="/"){
  this.$store.commit("UPDATE_KEY",this.$route.name!==undefined?this.$route.name+ +new Date():this.$route+ +new Date());
     this.$destroy();//销毁吧
}

结语:写完了,希望能够供大家参考哦!

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
深入理解JavaScript系列(14) 作用域链介绍(Scope Chain)
Apr 12 Javascript
JS中Eval解析JSON字符串的一个小问题
Feb 21 Javascript
JQuery解析XML的方法小结
Apr 02 Javascript
JavaScript实现经典排序算法之插入排序
Dec 28 Javascript
Vue实现点击后文字变色切换方法
Feb 11 Javascript
Vue手把手教你撸一个 beforeEnter 钩子函数
Apr 24 Javascript
vue实现pdf导出解决生成canvas模糊等问题(推荐)
Oct 18 Javascript
vue-cli2 构建速度优化的实现方法
Jan 08 Javascript
vue基础之事件简写、事件对象、冒泡、默认行为、键盘事件实例分析
Mar 11 Javascript
vue组件系列之TagsInput详解
May 14 Javascript
40行代码把Vue3的响应式集成进React做状态管理
May 20 Javascript
解决vue-router路由拦截造成死循环问题
Aug 05 Javascript
如何写好一个vue组件,老夫的一年经验全在这了(推荐)
May 18 #Javascript
微信小程序云开发 生成带参小程序码流程
May 18 #Javascript
详解小程序开发经验:多页面数据同步
May 18 #Javascript
JavaScript实现星级评价效果
May 17 #Javascript
JavaScript实现美化滑块效果
May 17 #Javascript
vue中使用mxgraph的方法实例代码详解
May 17 #Javascript
vue中引入mxGraph的步骤详解
May 17 #Javascript
You might like
使用无限生命期Session的方法
2006/10/09 PHP
php读取der格式证书乱码解决方法
2015/06/22 PHP
Yii框架批量插入数据扩展类的简单实现方法
2017/05/23 PHP
PHP编译configure时常见错误的总结
2017/08/17 PHP
TP - 比RBAC更好的权限认证方式(Auth类认证)
2021/03/09 PHP
Nigma vs Alliance BO5 第一场2.14
2021/03/10 DOTA
JavaScript代码简单实现求杨辉三角给定行的最大值
2013/10/29 Javascript
js验证输入是否为手机号码或电话号码示例
2013/12/30 Javascript
js 判断控件获得焦点的示例代码
2014/03/04 Javascript
浅谈JavaScript 中有关时间对象的方法
2016/08/15 Javascript
详解react-native WebView 返回处理(非回调方法可解决)
2018/02/27 Javascript
Angular8 实现table表格表头固定效果
2020/01/03 Javascript
[48:00]完美世界DOTA2联赛循环赛 Forest vs Inki BO2第二场 11.04
2020/11/04 DOTA
Python中的元类编程入门指引
2015/04/15 Python
Python中的数学运算操作符使用进阶
2016/06/20 Python
Python中的__slots__示例详解
2017/07/06 Python
Python使用Matplotlib实现雨点图动画效果的方法
2017/12/23 Python
python实现任意位置文件分割的实例
2018/12/14 Python
python实现求特征选择的信息增益
2018/12/18 Python
解决python3 安装不了PIL的问题
2019/08/16 Python
详解使用Python下载文件的几种方法
2019/10/13 Python
selenium+Chrome滑动验证码破解二(某某网站)
2019/12/17 Python
Python数据结构dict常用操作代码实例
2020/03/12 Python
在pycharm中关掉ipython console/PyDev操作
2020/06/09 Python
python 获取计算机的网卡信息
2021/02/18 Python
美国在线自行车商店:Jenson USA
2018/05/22 全球购物
银行实习的自我鉴定
2013/12/10 职场文书
本科毕业生求职自荐信
2014/02/03 职场文书
公司联欢晚会主持词
2014/03/22 职场文书
大学生求职自荐信
2015/03/24 职场文书
2015年度团总支工作总结
2015/04/23 职场文书
教师学习中国梦心得体会
2016/01/05 职场文书
六年级上册《闻官军收河南河北》的教学设计
2019/11/15 职场文书
Nginx工作原理和优化总结。
2021/04/02 Servers
html+css实现环绕倒影加载特效
2021/07/07 HTML / CSS