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 相关文章推荐
对textarea框的代码调试,而且功能上使用非常方便,酷
Jun 30 Javascript
jQuery库与其他JS库冲突的解决办法
Feb 07 Javascript
js弹窗代码 可以指定弹出间隔
Jul 03 Javascript
原生JS实现表单checkbook获取已选择的值
Jul 21 Javascript
基于JavaScript实现跳转提示页面
Sep 24 Javascript
vue2滚动条加载更多数据实现代码
Jan 10 Javascript
jQuery插件jquery.kxbdmarquee.js实现无缝滚动效果
Feb 15 Javascript
微信小程序商品到详情的实现
Jun 27 Javascript
vue自定义全局共用函数详解
Sep 18 Javascript
MockJs结合json-server模拟后台数据
Aug 26 Javascript
js中script的上下放置区别,Dom的增删改创建操作实例分析
Dec 16 Javascript
JS使用Chrome浏览器实现调试线上代码
Jul 23 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中json_encode中文编码问题分析
2011/09/13 PHP
php+ajax做仿百度搜索下拉自动提示框(有实例)
2012/08/21 PHP
带密匙的php加密解密示例分享
2014/01/29 PHP
PHP配置把错误日志以邮件方式发送方法(Windows系统)
2015/06/23 PHP
PHP实现多文件上传的方法
2015/07/08 PHP
JavaScript判断密码强度(自写代码)
2013/09/06 Javascript
一个简单的jquery进度条示例
2014/04/28 Javascript
js实现简单的联动菜单效果
2015/08/19 Javascript
浅析jquery数组删除指定元素的方法:grep()
2016/05/19 Javascript
最实用的jQuery分页插件
2016/10/09 Javascript
Javascript 判断两个IP是否在同一网段实例代码
2016/11/28 Javascript
详解webpack的配置文件entry与output
2017/08/21 Javascript
微信小程序有旋转动画效果的音乐组件实例代码
2018/08/22 Javascript
详解vue2.6插槽更新v-slot用法总结
2019/03/09 Javascript
小程序关于请求同步的总结
2019/05/05 Javascript
vue+elementui通用弹窗的实现(新增+编辑)
2021/01/07 Vue.js
[52:05]EG vs OG 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
分享6个隐藏的python功能
2017/12/07 Python
Django中使用celery完成异步任务的示例代码
2018/01/23 Python
使用Python更换外网IP的方法
2018/07/09 Python
python 删除字符串中连续多个空格并保留一个的方法
2018/12/22 Python
执行Django数据迁移时报 1091错误及解决方法
2019/10/14 Python
Python 模拟生成动态产生验证码图片的方法
2020/02/01 Python
Python3.6安装卸载、执行命令、执行py文件的方法详解
2020/02/20 Python
Python闭包与装饰器原理及实例解析
2020/04/30 Python
关于HTML5的22个初级技巧(图文教程)
2012/06/21 HTML / CSS
凯特王妃父母建立的派对用品网站:Party Pieces
2017/05/28 全球购物
Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
2014/07/27 面试题
酒店经理职责
2014/01/30 职场文书
工程力学专业自荐信范文
2014/03/17 职场文书
《每逢佳节倍思亲》教后反思
2014/04/19 职场文书
公司授权委托书格式范文
2014/10/02 职场文书
好好学习保证书
2015/02/26 职场文书
小学重阳节活动总结
2015/03/24 职场文书
2015中学教师个人工作总结
2015/07/22 职场文书
电子表的操作介绍说明书
2019/10/28 职场文书