浅谈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 相关文章推荐
关于递归运算的顺序测试代码
Nov 30 Javascript
20款非常优秀的 jQuery 工具提示插件 推荐
Jul 15 Javascript
jQuery.lazyload+masonry改良图片瀑布流代码
Jun 20 Javascript
浅谈json取值(对象和数组)
Jun 24 Javascript
用瀑布流的方式在网页上插入图片的简单实现方法
Sep 23 Javascript
AngularJS表单和输入验证实例
Nov 02 Javascript
详解自动生成博客目录案例
Dec 09 Javascript
jQuery实现QQ空间汉字转拼音功能示例
Jul 10 jQuery
React 高阶组件入门介绍
Jan 11 Javascript
tween.js缓动补间动画算法示例
Feb 13 Javascript
详解vue-router 命名路由和命名视图
Jun 01 Javascript
详解VUE自定义组件中用.sync修饰符与v-model的区别
Jun 26 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
[FAQ]PHP中的一些常识:类篇
2006/10/09 PHP
PHP对象转换为数组函数(递归方法)
2012/02/04 PHP
基于AppServ,XAMPP,WAMP配置php.ini去掉警告信息(NOTICE)的方法详解
2013/05/07 PHP
php+xml结合Ajax实现点赞功能完整实例
2015/01/30 PHP
Zend Framework教程之模型Model基本规则和使用方法
2016/03/04 PHP
深入浅出讲解:php的socket通信原理
2016/12/03 PHP
jquery中.add()的使用分析
2013/04/26 Javascript
解析瀑布流布局:JS+绝对定位的实现
2013/05/08 Javascript
解析javascript 实用函数的使用详解
2013/05/10 Javascript
使用ajaxfileupload.js实现ajax上传文件php版
2014/06/26 Javascript
jQuery 自定义下拉框(DropDown)附源码下载
2016/07/22 Javascript
原生和jQuery的ajax用法详解
2017/01/23 Javascript
详解Vue 普通对象数据更新与 file 对象数据更新
2017/04/26 Javascript
jQuery Collapse1.1.0折叠插件简单使用
2017/08/28 jQuery
Vue的Class与Style绑定的方法
2017/09/01 Javascript
JavaScript反射与依赖注入实例详解
2018/05/29 Javascript
解决vue v-for 遍历循环时key值报错的问题
2018/09/06 Javascript
JS实现根据数组对象的某一属性排序操作示例
2019/01/14 Javascript
python实现多线程暴力破解登陆路由器功能代码分享
2015/01/04 Python
Python 读写文件和file对象的方法(推荐)
2016/09/12 Python
浅谈pycharm出现卡顿的解决方法
2018/12/03 Python
Django视图扩展类知识点详解
2019/10/25 Python
Python Print实现在输出中插入变量的例子
2019/12/25 Python
Python 实现将大图切片成小图,将小图组合成大图的例子
2020/03/14 Python
在python中修改.properties文件的操作
2020/04/08 Python
python一些性能分析的技巧
2020/08/30 Python
HTML5本地存储localStorage、sessionStorage基本用法、遍历操作、异常处理等
2014/05/08 HTML / CSS
中国领先的汽车保养服务平台:途虎养车
2019/10/18 全球购物
大学学年自我鉴定
2013/10/28 职场文书
餐饮业的创业计划书范文
2013/12/26 职场文书
四年大学自我鉴定
2014/02/17 职场文书
服装设计师求职信
2014/06/04 职场文书
经理任命书模板
2014/06/06 职场文书
公司内部升职自荐信
2015/03/27 职场文书
Python如何配置环境变量详解
2021/05/18 Python
python小型的音频操作库mp3Play
2022/04/24 Python