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 相关文章推荐
jquery属性过滤选择器使用示例
Jun 18 Javascript
Javascript中的getUTCHours()方法使用详解
Jun 10 Javascript
使用AngularJS处理单选框和复选框的简单方法
Jun 19 Javascript
js如何判断访问是来自搜索引擎(蜘蛛人)还是直接访问
Sep 14 Javascript
jQuery图片拖动组件Dropzone用法示例
Jan 17 Javascript
Javascript中 带名 匿名 箭头函数的重要区别(推荐)
Jan 29 Javascript
Angular 4.x 动态创建表单实例
Apr 25 Javascript
AngularJS 打开新的标签页实现代码
Sep 07 Javascript
Node.js对MongoDB进行增删改查操作的实例代码
Apr 18 Javascript
node.js实现上传文件功能
Jul 15 Javascript
JS canvas实现画板和签字板功能
Feb 23 Javascript
微信小程序 WeUI扩展组件库的入门教程
Apr 21 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
php 用checkbox一次性删除多条记录的方法
2010/02/23 PHP
解析phpstorm + xdebug 远程断点调试
2013/06/20 PHP
PHP实现的比较完善的购物车类
2014/12/02 PHP
用JavaScript获取网页中的js、css、Flash等文件
2006/12/20 Javascript
jquery插件validate验证的小例子
2013/05/08 Javascript
IE6-IE9中tbody的innerHTML不能赋值的解决方法
2014/09/26 Javascript
js如何判断访问是来自搜索引擎(蜘蛛人)还是直接访问
2015/09/14 Javascript
Bootstrap Modal遮罩弹出层代码分享
2016/11/21 Javascript
javascript 定时器工作原理分析
2016/12/03 Javascript
原生js实现返回顶部缓冲效果
2017/01/18 Javascript
JS实现手写parseInt的方法示例
2017/09/24 Javascript
vue二级路由设置方法
2018/02/09 Javascript
浅谈node.js 命令行工具(cli)
2018/05/10 Javascript
vuejs router history 配置到iis的方法
2018/09/20 Javascript
vue.js自定义组件directives的实例代码
2018/11/09 Javascript
[01:56]《DOTA2》中文配音CG
2013/04/22 DOTA
Python中os.path用法分析
2015/01/15 Python
pygame学习笔记(1):矩形、圆型画图实例
2015/04/15 Python
python中numpy基础学习及进行数组和矢量计算
2017/02/12 Python
Django中使用celery完成异步任务的示例代码
2018/01/23 Python
Python利用Django如何写restful api接口详解
2018/06/08 Python
Python构建图像分类识别器的方法
2019/01/12 Python
Python神奇的内置函数locals的实例讲解
2019/02/22 Python
Python面向对象编程基础实例分析
2020/01/17 Python
Pytorch 实现数据集自定义读取
2020/01/18 Python
Python ellipsis 的用法详解
2020/11/20 Python
详解css3自定义滚动条样式写法
2017/12/25 HTML / CSS
Claire’s法国:时尚配饰、美容、珠宝、头发
2021/01/16 全球购物
受欢迎的大学生自我评价
2013/12/05 职场文书
买卖车协议书
2014/04/21 职场文书
小学生爱国演讲稿
2014/04/25 职场文书
优秀大学生自荐信
2014/06/09 职场文书
个性车贴标语
2014/06/24 职场文书
见习报告格式要求
2014/11/04 职场文书
优质服务标语口号
2015/12/26 职场文书
JavaWeb实现显示mysql数据库数据
2022/03/19 Java/Android