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 URL解析函数和分段URL解析方法
Apr 12 Javascript
js实现input框文字动态变换显示效果
Aug 19 Javascript
Javascript技术难点之apply,call与this之间的衔接
Dec 04 Javascript
基于jQuery实现动态搜索显示功能
May 05 Javascript
vue2.0父子组件间通信的实现方法
Apr 19 Javascript
详解Vuejs2.0之异步跨域请求
Apr 20 Javascript
vue 和vue-touch 实现移动端左右导航效果(仿京东移动站导航)
Apr 22 Javascript
windows下vue-cli导入bootstrap样式
Apr 25 Javascript
JS拖拽排序插件Sortable.js用法实例分析
Feb 20 Javascript
用node.js写一个jenkins发版脚本
May 21 Javascript
JavaScript鼠标拖拽事件详解
Apr 03 Javascript
vue项目,代码提交至码云,iconfont的用法说明
Jul 30 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短址转换实现方法
2015/02/25 PHP
PHP数组操作――获取数组最后一个值的方法
2015/04/14 PHP
Yii框架实现邮箱激活的方法【数字签名】
2016/10/18 PHP
PDO的安全处理与事物处理方法
2016/10/31 PHP
PHP调用API接口实现天气查询功能的示例
2017/09/21 PHP
PHP使用openssl扩展实现加解密方法示例
2020/02/20 PHP
PHP7 foreach() 函数修改
2021/03/09 PHP
收集的一些Array及String原型对象的扩展实现代码
2010/12/05 Javascript
css3元素简单的闪烁效果实现(html5 jquery)
2013/12/28 Javascript
node.js中的fs.link方法使用说明
2014/12/15 Javascript
jQuery实现鼠标划过展示大图的方法
2015/03/09 Javascript
JS实现的仿东京商城菜单、仿Win右键菜单及仿淘宝TAB特效合集
2015/09/28 Javascript
基于jQuery实现的菜单切换效果
2015/10/16 Javascript
Bootstrap modal 多弹窗之叠加关闭阴影遮罩问题的解决方法
2017/02/27 Javascript
React Router v4 入坑指南(小结)
2018/04/08 Javascript
在angularJs中进行数据遍历的2种方法
2018/10/08 Javascript
elementUI select组件value值注意事项详解
2019/05/29 Javascript
vue实现图片按比例缩放问题操作
2020/08/11 Javascript
Ant-design-vue Table组件customRow属性的使用说明
2020/10/28 Javascript
vue祖孙组件之间的数据传递案例
2020/12/07 Vue.js
[08:44]DOTA2发布会群星聚首 我们都是刀塔人
2014/03/21 DOTA
用python做一个搜索引擎(Pylucene)的实例代码
2017/07/05 Python
python3实现钉钉消息推送的方法示例
2019/03/14 Python
详解Python中的各种转义符\n\r\t
2019/07/10 Python
Python实现变声器功能(萝莉音御姐音)
2019/12/05 Python
python实现最速下降法
2020/03/24 Python
五分钟学会怎么用python做一个简单的贪吃蛇
2021/01/12 Python
售后服务承诺书范文
2014/03/26 职场文书
抗洪抢险事迹材料
2014/05/06 职场文书
质量安全标语
2014/06/07 职场文书
法英专业大学生职业生涯规划书范文
2014/09/22 职场文书
2014年党务工作总结
2014/11/25 职场文书
2015年师德表现自我评价
2015/03/05 职场文书
2016大学生暑期三下乡心得体会
2016/01/23 职场文书
员工试用期工作总结
2019/06/20 职场文书
导游词之黄帝陵景区
2019/09/16 职场文书