浅谈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 相关文章推荐
Javascript技术技巧大全(五)
Jan 22 Javascript
firefox和IE系列的相关区别整理 以备后用
Dec 28 Javascript
javascript去除字符串中所有标点符号和提取纯文本的正则
Jun 07 Javascript
js的image onload事件使用遇到的问题
Jul 15 Javascript
一个JavaScript去除字符串末尾的空白实例代码
Sep 22 Javascript
使用AngularJS创建自定义的过滤器的方法
Jun 18 Javascript
JavaScript中的return语句简单介绍
Dec 07 Javascript
bootstrap-wysiwyg结合ajax实现图片上传实时刷新功能
May 27 Javascript
React.Js添加与删除onScroll事件的方法详解
Nov 03 Javascript
Angular5给组件本身的标签添加样式class的方法
Apr 07 Javascript
详解vue.js根据不同环境(正式、测试)打包到不同目录
Jul 13 Javascript
在webstorm开发微信小程序之使用阿里自定义字体图标的方法
Nov 15 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
批量修改RAR文件注释的php代码
2010/11/20 PHP
Admin generator, filters and I18n
2011/10/06 PHP
php curl基本操作详解
2013/07/23 PHP
WAMP环境中扩展oracle函数库(oci)
2015/06/26 PHP
php实现word转html的方法
2016/01/22 PHP
功能强大的php分页函数
2016/07/20 PHP
用JavaScript将从数据库中读取出来的日期型格式化为想要的类型。
2009/08/15 Javascript
jQuery UI 应用不同Theme的办法
2010/09/12 Javascript
js 输出内容到新窗口具体实现代码
2013/05/31 Javascript
Jquery 获取对象的几种方式介绍
2014/01/17 Javascript
Node.js实现Excel转JSON
2015/04/24 Javascript
javascript实现根据iphone屏幕方向调用不同样式表的方法
2015/07/13 Javascript
jquery append 动态添加的元素事件on 不起作用的解决方案
2015/07/30 Javascript
vue省市区三联动下拉选择组件的实现
2017/04/28 Javascript
在iframe中使bootstrap的模态框在父页面弹出问题
2017/08/07 Javascript
Angular搜索 过滤 批量删除 添加 表单验证功能集锦(实例代码)
2017/10/25 Javascript
基于JavaScript实现表格滚动分页
2017/11/22 Javascript
Angular学习笔记之集成三方UI框架、控件的示例
2018/03/23 Javascript
Electron 调用命令行(cmd)
2019/09/23 Javascript
JS校验与最终登陆界面功能完整示例
2020/01/13 Javascript
Vue如何循环提取对象数组中的值
2020/11/18 Vue.js
js实现类选择器和name属性选择器的示例步骤
2021/02/07 Javascript
python+opencv实现动态物体追踪
2018/01/09 Python
python操作excel的方法(xlsxwriter包的使用)
2018/06/11 Python
Python 实现某个功能每隔一段时间被执行一次的功能方法
2018/10/14 Python
Django处理多用户类型的方法介绍
2019/05/18 Python
用于ETL的Python数据转换工具详解
2020/07/21 Python
Python常驻任务实现接收外界参数代码解析
2020/07/21 Python
Windows下Sqlmap环境安装教程详解
2020/08/04 Python
Python内存泄漏和内存溢出的解决方案
2020/09/26 Python
Antler英国官网:购买安特丽行李箱、拉杆箱
2019/08/25 全球购物
一家专门经营包包的英国网站:MyBag
2019/09/08 全球购物
建筑工程专业学生的自我评价
2013/12/25 职场文书
魅力教师事迹材料
2014/01/10 职场文书
Redis6.0搭建集群Redis-cluster的方法
2021/05/08 Redis
如何在python中实现ECDSA你知道吗
2021/11/23 Python