浅谈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 相关文章推荐
js使用html()或text()方法获取设置p标签的显示的值
Aug 01 Javascript
JavaScript将一个数组插入到另一个数组的方法
Mar 19 Javascript
AngularJS延迟加载html template
Jul 27 Javascript
JS编写函数实现对身份证号码最后一位的验证功能
Dec 29 Javascript
BACKBONE.JS 简单入门范例
Oct 17 Javascript
Vue实现内部组件轮播切换效果的示例代码
Apr 07 Javascript
微信小程序实践之动态控制组件的显示/隐藏功能
Jul 18 Javascript
Angular动态绑定样式及改变UI框架样式的方法小结
Sep 03 Javascript
Vue 组件封装 并使用 NPM 发布的教程
Sep 30 Javascript
javascriptvoid(0)含义以及与&quot;#&quot;的区别讲解
Jan 19 Javascript
Jquery的Ajax技术使用方法
Jan 21 jQuery
JavaScript实现简单贪吃蛇效果
Mar 09 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
Extended CHM PHP 语法手册之 DIY
2006/10/09 PHP
cache_lite试用
2007/02/14 PHP
晋城吧对DiscuzX进行的前端优化要点
2010/09/05 PHP
浅析PHP echo 和 print 语句
2020/06/30 PHP
javascript中parentNode,childNodes,children的应用详解
2013/12/17 Javascript
javascript使用smipleChart实现简单图表
2015/01/02 Javascript
jQuery对指定元素中指定字符串进行替换的方法
2015/03/17 Javascript
jQuery使用经验小技巧(推荐)
2016/05/31 Javascript
Angular 理解module和injector,即依赖注入
2016/09/07 Javascript
浅析location.href跨窗口调用函数
2016/11/22 Javascript
[js高手之路]从原型链开始图解继承到组合继承的产生详解
2017/08/28 Javascript
微信小程序返回多级页面的实现方法
2017/10/27 Javascript
全面介绍vue 全家桶和项目实例
2017/12/27 Javascript
JavaScript实现筛选数组
2021/03/02 Javascript
[47:04]LGD vs infamous Supermajor小组赛D组 BO3 第二场 6.3
2018/06/04 DOTA
python实现支持目录FTP上传下载文件的方法
2015/06/03 Python
Python实现批量下载图片的方法
2015/07/08 Python
python基础教程项目四之新闻聚合
2018/04/02 Python
Python去除字符串前后空格的几种方法
2019/03/04 Python
python爬虫爬取微博评论案例详解
2019/03/27 Python
python实现图片中文字分割效果
2019/07/22 Python
浅析python内置模块collections
2019/11/15 Python
DJango的创建和使用详解(默认数据库sqlite3)
2019/11/18 Python
python3 deque 双向队列创建与使用方法分析
2020/03/24 Python
5款实用的python 工具推荐
2020/10/13 Python
Python web框架(django,flask)实现mysql数据库读写分离的示例
2020/11/18 Python
Daniel Wellington官方海外旗舰店:丹尼尔惠灵顿DW手表
2018/02/22 全球购物
会计职业生涯规划范文
2014/01/04 职场文书
前处理班长职位说明书
2014/03/01 职场文书
目标管理责任书
2014/04/15 职场文书
《美丽的南沙群岛》教学反思
2014/04/27 职场文书
拓展策划方案
2014/06/03 职场文书
学习党代会心得体会
2014/09/05 职场文书
2015年高校辅导员工作总结
2015/04/20 职场文书
债务追讨律师函
2015/06/24 职场文书
银行文明优质服务培训心得体会
2016/01/09 职场文书