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操作select option 的代码小结
Jun 21 Javascript
15个款优秀的 jQuery 图片特效插件推荐
Nov 21 Javascript
javascript event在FF和IE的兼容传参心得(绝对好用)
Jul 10 Javascript
原生的html元素选择器类似jquery选择器
Oct 15 Javascript
node.js中的console.trace方法使用说明
Dec 09 Javascript
JavaScript如何禁止Backspace键
Dec 02 Javascript
JS中的==运算: [''] == false —&gt;true
Jul 24 Javascript
Angular设置title信息解决SEO方面存在问题
Aug 19 Javascript
解决easyui日期时间框ie的兼容的问题
Mar 01 Javascript
JavaScript ES6常用基础知识总结
Feb 09 Javascript
如何阻止小程序遮罩层下方图层滚动
Sep 05 Javascript
jQuery实现查看图片功能
Dec 01 jQuery
如何写好一个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实现telnet功能示例
2014/04/08 PHP
php解析json数据实例
2014/08/19 PHP
PHP信号量基本用法实例详解
2016/02/12 PHP
PHP的Yii框架中移除组件所绑定的行为的方法
2016/03/18 PHP
Laravel框架分页实现方法分析
2018/06/12 PHP
Laravel向公共模板赋值方法总结
2019/06/25 PHP
基于Asp.net与Javascript控制的日期控件
2010/05/22 Javascript
jquery中ajax学习笔记一
2011/10/16 Javascript
javascript 正则表达式相关应介绍
2012/11/27 Javascript
js实现倒计时时钟的示例代码
2013/12/17 Javascript
jQuery 中$(this).index与$.each的使用指南
2014/11/20 Javascript
NodeJS Web应用监听sock文件实例
2015/02/18 NodeJs
RequireJS使用注意细节
2016/05/15 Javascript
jQuery Ajax传值到Servlet出现乱码问题的解决方法
2016/10/09 Javascript
JS实现图片点击后出现模态框效果
2017/05/03 Javascript
Vue header组件开发详解
2018/01/26 Javascript
vue.js 图片上传并预览及图片更换功能的实现代码
2018/08/27 Javascript
基于Vue3.0开发轻量级手机端弹框组件V3Popup的场景分析
2020/12/30 Vue.js
让python 3支持mysqldb的解决方法
2017/02/14 Python
Python实现识别手写数字 简易图片存储管理系统
2018/01/29 Python
对python打乱数据集中X,y标签对的方法详解
2018/12/14 Python
python flask框架实现重定向功能示例
2019/07/02 Python
django云端留言板实例详解
2019/07/22 Python
python中matplotlib条件背景颜色的实现
2019/09/02 Python
Python使用gluon/mxnet模块实现的mnist手写数字识别功能完整示例
2019/12/18 Python
Python3.7+tkinter实现查询界面功能
2019/12/24 Python
Python中url标签使用知识点总结
2020/01/16 Python
Tensorflow矩阵运算实例(矩阵相乘,点乘,行/列累加)
2020/02/05 Python
Python关于__name__属性的含义和作用详解
2020/02/19 Python
15个应该掌握的Jupyter Notebook使用技巧(小结)
2020/09/23 Python
职称自我鉴定
2013/10/15 职场文书
技术总监的工作职责
2013/11/13 职场文书
投标单位介绍信
2014/01/09 职场文书
创建卫生先进单位实施方案
2014/03/10 职场文书
2014年圣诞节寄语
2014/12/08 职场文书
Java基础-封装和继承
2021/07/02 Java/Android