浅谈vue-router路由切换 组件重用挖下的坑


Posted in Javascript onNovember 01, 2019

问题描述:vue-router导航切换 时,如果两个路由都渲染同个组件,组件会重(chong)用,组件的生命周期钩子不会再被调用,使得组件的一些数据无法根据 path的改变得到更新

翻车现场再现:

这是我的/router/index.js 的内容节选

export default new Router({
 routes: [
 {
 path: '/main',
 component: Main
 },
 {
 path: '/get',
 component: Main
 }
 ]
})

这是我的 Main.vue的内容节选

<p>{{$router.currentRoute.path}}</p>

以上情景很明显 ,我是想要显示路由跳转前和路由跳转后的 path值

路由从 /main 跳转到了 /get ,理想情况是 网页中显示的路由从 /main 变成了 /get

但事实是网页没有一点变化 ,显示的内容依然是 /main

车祸原因分析

从我的车况来看, 我的这次路由跳转前后使用了完全相同的组件 ,通过仔细查看vue-router文档对应位置 ,发现了如下关键内容

当使用路由参数时,例如从 /user/foo 导航到 /user/bar,原来的组件实例会被复用。因为两个路由都渲染同个组件,比起销毁再创建,复用则显得更加高效。不过,这也意味着组件的生命周期钩子不会再被调用。

route object 是 immutable(不可变) 的,每次成功的导航后都会产生一个新的对象。

这两个关键的信息 表明,正常组件不复用时,组件内的 route对象是最新路由 对应的, 但是组件复用时,由于组件的生命周期钩子不会再被调用,组件内的route对象还是原来的,不会得到更新,所以出现了页面的path 信息 跳转前后没有变化

前往救援

原因分析清楚了,开始解决吧,还好vue-router提供了解决的api 如下

使用 2.2 中引入的 beforeRouteUpdate 守卫:

const User = {
 template: '...',
 beforeRouteUpdate (to, from, next) {
 // react to route changes...
 // don't forget to call next()
 }
}

修改完后的Main.vue如下

data () {
 return {
 path:this.$router.currentRoute.path;
 }
}
beforeRouteUpdate (to, from, next) {
 path = this.$router.currentRoute.path;
}

结果救援现场再次翻车

页面上的 path依旧没有变化

又再次分析原因,查看 vue-router文档对应位置 ,发现重要内容如下

beforeRouteUpdate (to, from, next) {
 // 在当前路由改变,但是该组件被复用时调用
 // 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候,
 // 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。
 // 可以访问组件实例 `this`
 },

上面说的是

/foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候,

我的是 从/main 调到/get ,并不符合上面的情况,活该翻车

一次真的救援

data () {
 return {
 path:this.$router.currentRoute.path;
 }
}
watch: {
 '$route' (to, from) {
 this.path = this.$router.currentRoute.path 
 }
}

这次真的救援成功了,页面的 path从 /main 变成了 /get

以上这篇浅谈vue-router路由切换 组件重用挖下的坑就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery 研究心得 取得属性的值
Nov 30 Javascript
jquery获取input的value问题说明
Aug 19 Javascript
关于jquery性能最佳实践的讨论,与求教
Mar 30 Javascript
jquery之超简单的div显示和隐藏特效demo(分享)
Jul 09 Javascript
JavaScript 浏览器对象模型BOM使用介绍
Apr 13 Javascript
javascript实现右侧弹出“分享到”窗口效果
Feb 01 Javascript
Bootstrap被封装的弹层
Jul 20 Javascript
最好用的Bootstrap fileinput.js文件上传组件
Dec 12 Javascript
基于jQuery实现顶部导航栏功能
Dec 27 Javascript
深入Node TCP模块的理解
Mar 13 Javascript
40行代码把Vue3的响应式集成进React做状态管理
May 20 Javascript
JavaScript使用canvas绘制坐标和线
Apr 28 Javascript
浅析js实现网页截图的两种方式
Nov 01 #Javascript
javascript使用链接跨域下载图片
Nov 01 #Javascript
async/await让异步操作同步执行的方法详解
Nov 01 #Javascript
浅谈Three.js截图并下载的大坑
Nov 01 #Javascript
vue中使用vee-validator完成表单校验方案
Nov 01 #Javascript
解决vue的过渡动画无法正常实现问题
Oct 31 #Javascript
VUE单页面切换动画代码(全网最好的切换效果)
Oct 31 #Javascript
You might like
一个多文件上传的例子(原创)
2006/10/09 PHP
XRegExp 0.2: Now With Named Capture
2007/11/30 Javascript
Extjs ajax同步请求时post方式参数发送方式
2009/08/05 Javascript
JavaScript高级程序设计 阅读笔记(四) ECMAScript中的类型转换
2012/02/27 Javascript
jQuery的缓存机制浅析
2014/06/07 Javascript
JavaScript中判断整字类型最简洁的实现方法
2014/11/08 Javascript
jQuery圆形统计图开发实例
2015/01/04 Javascript
PHP+jQuery实现随意拖动层并即时保存拖动位置
2015/04/30 Javascript
js下拉选择框与输入框联动实现添加选中值到输入框的方法
2015/08/17 Javascript
request请求获取参数的实现方法(post和get两种方式)
2016/09/27 Javascript
js仿手机页面文件下拉刷新效果
2016/10/14 Javascript
微信小程序websocket聊天室的实现示例代码
2019/02/12 Javascript
layui 动态设置checbox 选中状态的例子
2019/09/02 Javascript
Vue实现base64编码图片间的切换功能
2019/12/04 Javascript
vue2.x 对象劫持的原理实现
2020/04/19 Javascript
js实现鼠标拖曳效果
2020/12/30 Javascript
[01:05:12]2014 DOTA2国际邀请赛中国区预选赛 TongFu VS CIS-GAME
2014/05/21 DOTA
django model去掉unique_together报错的解决方案
2016/10/18 Python
用virtualenv建立多个Python独立虚拟开发环境
2017/07/06 Python
Python解析命令行读取参数--argparse模块使用方法
2018/01/23 Python
Python之文字转图片方法
2018/05/10 Python
python通过ffmgep从视频中抽帧的方法
2018/12/05 Python
Python时间序列缺失值的处理方法(日期缺失填充)
2019/08/11 Python
python如何保证输入键入数字的方法
2019/08/23 Python
django admin 添加自定义链接方式
2020/03/11 Python
django form和field具体方法和属性说明
2020/07/09 Python
python正则表达式 匹配反斜杠的操作方法
2020/08/07 Python
会计学应届毕业生推荐信
2013/11/04 职场文书
四群教育工作实施方案
2014/03/26 职场文书
中学生操行评语
2014/04/24 职场文书
师德演讲稿范文
2014/05/06 职场文书
2015年酒店客房部工作总结
2015/04/25 职场文书
小学教师党员承诺书
2015/04/27 职场文书
python基础入门之字典和集合
2021/06/13 Python
Python matplotlib绘制雷达图
2022/04/13 Python
MySQL 原理优化之Group By的优化技巧
2022/08/14 MySQL