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 相关文章推荐
js cookies 常见网页木马挂马代码 24小时只加载一次
Apr 13 Javascript
jQuery中empty()方法用法实例
Jan 16 Javascript
Easyui的组合框的取值与赋值
Oct 28 Javascript
JS中跨页面调用变量和函数的方法(例如a.js 和 b.js中互相调用)
Nov 01 Javascript
给easyui datebox扩展一个清空的实例
Nov 09 Javascript
Jquery on绑定的事件 触发多次实例代码
Dec 08 Javascript
javascript 单例模式详解及简单实例
Feb 14 Javascript
详解layui弹窗父子窗口之间传参数的方法
Jan 16 Javascript
JavaScript寄生组合式继承原理与用法分析
Jan 11 Javascript
JS使用Dijkstra算法求解最短路径
Jan 17 Javascript
JavaScript随机数的组合问题案例分析
May 16 Javascript
JS实现页面侧边栏效果探究
Jan 08 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
centos 5.6 升级php到5.3的方法
2011/05/14 PHP
ThinkPHP中自定义目录结构的设置方法
2014/08/15 PHP
php中convert_uuencode()与convert_uuencode函数用法实例
2014/11/22 PHP
jQuery 行背景颜色的交替显示(隔行变色)实现代码
2009/12/13 Javascript
用jquery实现输入框获取焦点消失文字
2013/04/27 Javascript
javascript页面加载完执行事件代码
2014/02/11 Javascript
jQuery常用数据处理方法小结
2015/02/20 Javascript
jquery无限级联下拉菜单简单实例演示
2015/11/23 Javascript
前端性能优化及技巧
2016/05/06 Javascript
Bootstrap基本插件学习笔记之轮播幻灯片(23)
2016/12/08 Javascript
EasyUI学习之DataGird分页显示数据
2016/12/29 Javascript
ECMAScript6 新特性范例大全
2017/03/24 Javascript
Vue2.0 axios前后端登陆拦截器(实例讲解)
2017/10/27 Javascript
去掉vue 中的代码规范检测两种方法(Eslint验证)
2018/03/21 Javascript
bootstrap中selectpicker下拉框使用方法实例
2018/03/22 Javascript
Angular 数据请求的实现方法
2018/05/07 Javascript
Vue引入sass并配置全局变量的方法
2018/06/27 Javascript
Node.js Koa2使用JWT进行鉴权的方法示例
2018/08/17 Javascript
Node.js中读取TXT文件内容fs.readFile()用法
2018/10/10 Javascript
webpack4与babel配合使es6代码可运行于低版本浏览器的方法
2018/10/12 Javascript
用jQuery将JavaScript对象转换为querystring查询字符串的方法
2018/11/12 jQuery
浅谈Vue static 静态资源路径 和 style问题
2020/11/07 Javascript
python 生成不重复的随机数的代码
2011/05/15 Python
在Python编程过程中用单元测试法调试代码的介绍
2015/04/02 Python
Python彩色化Linux的命令行终端界面的代码实例分享
2016/07/02 Python
网红编程语言Python将纳入高考你怎么看?
2018/06/07 Python
老生常谈python中的重载
2018/11/11 Python
python实现贪吃蛇双人大战
2020/04/18 Python
Python爬虫之爬取淘女郎照片示例详解
2020/07/28 Python
手把手教你如何用Pycharm2020.1.1配置远程连接的详细步骤
2020/08/07 Python
HTML5 canvas基本绘图之图形变换
2016/06/27 HTML / CSS
烹饪自我鉴定
2014/03/01 职场文书
青安岗事迹材料
2014/05/14 职场文书
活动总结报告怎么写
2014/07/03 职场文书
教师工作能力自我评价
2015/03/04 职场文书
HTML速写之Emmet语法规则的实现
2021/04/07 HTML / CSS