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优化技巧(文件瘦身篇)
Jan 28 Javascript
JS 强制设为首页的代码
Jan 31 Javascript
JavaScript控制Session操作方法
Jan 17 Javascript
js Math 对象的方法
Sep 01 Javascript
js添加select下默认的option的value和text的方法
Oct 19 Javascript
javascript中基本类型和引用类型的区别分析
May 12 Javascript
AngularJS中watch监听用法分析
Nov 04 Javascript
bootstrap日历插件datetimepicker使用方法
Dec 14 Javascript
js-FCC算法-No repeats please字符串的全排列(详解)
May 02 Javascript
详解vue-cli 脚手架 安装
Apr 16 Javascript
Cordova(ionic)项目实现双击返回键退出应用
Sep 17 Javascript
javascript实现鼠标点击生成文字特效
Dec 24 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代码的50个实用技巧必备(上)
2016/01/22 PHP
图文详解phpstorm配置Xdebug进行调试PHP教程
2016/06/13 PHP
ThinkPHP5分页paginate代码实例解析
2020/11/10 PHP
传智播客学习之java 反射
2009/11/22 Javascript
javascript 跨浏览器开发经验总结(五) js 事件
2010/05/19 Javascript
基于jquery的一个拖拽到指定区域内的效果
2011/09/21 Javascript
jquery实现点击TreeView文本父节点展开/折叠子节点
2013/01/10 Javascript
获取客户端网卡MAC地址和IP地址实现JS代码
2013/03/17 Javascript
iframe的父子窗口之间的对象相互调用基本用法
2013/09/03 Javascript
jquery ajax post提交数据乱码
2013/11/05 Javascript
用js模拟struts2的多action调用示例
2014/05/19 Javascript
javascript 兼容各个浏览器的事件
2015/02/04 Javascript
整理关于Bootstrap模态弹出框的慕课笔记
2017/03/29 Javascript
ES6中Array.find()和findIndex()函数的用法详解
2017/09/16 Javascript
Node.js net模块功能及事件监听用法分析
2019/01/05 Javascript
Echarts实现单条折线可拖拽效果
2019/12/19 Javascript
OpenLayers3实现测量功能
2020/09/25 Javascript
ubuntu中配置pyqt4环境教程
2017/12/27 Python
Python中的并发处理之asyncio包使用的详解
2018/04/03 Python
django 通过ajax完成邮箱用户注册、激活账号的方法
2018/04/17 Python
对Python3中列表乘以某一个数的示例详解
2019/07/20 Python
python mqtt 客户端的实现代码实例
2019/09/25 Python
三个python爬虫项目实例代码
2019/12/28 Python
详解python第三方库的安装、PyInstaller库、random库
2021/03/03 Python
HTML5 canvas 瀑布流文字效果的示例代码
2018/01/31 HTML / CSS
荷兰之家英文站:Holland at Home
2016/10/26 全球购物
香港卓悦化妆品官网:BONJOUR
2017/09/21 全球购物
印度首个本地在线平台:nearbuy
2019/03/28 全球购物
N:Philanthropy官网:美国洛杉矶基础款服装
2020/06/09 全球购物
高考备战决心书
2014/03/11 职场文书
档案信息化建设方案
2014/05/16 职场文书
优秀班主任事迹材料
2014/12/16 职场文书
个人年终总结开头
2015/03/06 职场文书
初中生思想道德自我评价
2015/03/09 职场文书
Nginx配置80端口访问8080及项目名地址方法解析
2021/03/31 Servers
企业开发CSS命名BEM代码规范实践
2022/02/12 HTML / CSS