浅谈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 相关文章推荐
关于取不到由location.href提交而来的上级页面地址的解决办法
Jul 30 Javascript
js下写一个事件队列操作函数
Jul 19 Javascript
JQuery中关于jquery.js与jquery.min.js的比较探讨
May 15 Javascript
javascript实现动态导入js与css等静态资源文件的方法
Jul 25 Javascript
Jquery ajax基础教程
Nov 20 Javascript
利用JS轻松实现获取表单数据
Dec 06 Javascript
xmlplus组件设计系列之图标(ICON)(1)
May 05 Javascript
JavaScript设置名字输入不合法的实现方法
May 23 Javascript
vue-cli3 karma单元测试的实现
Jan 18 Javascript
vue插槽slot的理解和使用方法
Apr 03 Javascript
JavaScript实现简单动态表格
Dec 02 Javascript
Vue ECharts实现机舱座位选择展示功能
May 15 Vue.js
浅析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
用PHP将数据导入到Foxmail
2006/10/09 PHP
用PHP和ACCESS写聊天室(九)
2006/10/09 PHP
openPNE常用方法分享
2011/11/29 PHP
php强制更新图片缓存的方法
2015/02/11 PHP
php基于双向循环队列实现历史记录的前进后退等功能
2015/08/08 PHP
yii2中结合gridview如何使用modal弹窗实例代码详解
2016/06/12 PHP
PHP实现微信商户支付企业付款到零钱功能
2018/09/30 PHP
使用TextRange获取输入框中光标的位置的代码
2007/03/08 Javascript
jquery post方式传递多个参数值后台以数组的方式进行接收
2013/01/11 Javascript
jquery通过visible来判断标签是否显示或隐藏
2014/05/08 Javascript
jQuery实现页面评论栏中访客信息自动填写功能的方法
2016/05/23 Javascript
gulp安装以及打包合并的方法教程
2017/11/19 Javascript
vue实现的微信机器人聊天功能案例【附源码下载】
2019/02/18 Javascript
VUE table表格动态添加一列数据,新增的这些数据不可以编辑(v-model绑定的数据不能实时更新)
2020/04/03 Javascript
解决Vue中使用keepAlive不缓存问题
2020/08/04 Javascript
antd vue 刷新保留当前页面路由,保留选中菜单,保留menu选中操作
2020/08/06 Javascript
vue 获取url参数、get参数返回数组的操作
2020/11/12 Javascript
利用python解决mysql视图导入导出依赖的问题
2017/12/17 Python
使用Python监控文件内容变化代码实例
2018/06/04 Python
基于python实现删除指定文件类型
2020/07/21 Python
python在linux环境下安装skimage的示例代码
2020/10/14 Python
python利用xpath爬取网上数据并存储到django模型中
2021/02/26 Python
canvas因为图片资源不在同一域名下而导致的跨域污染画布的解决办法
2019/01/18 HTML / CSS
英国虚拟主机服务商:eUKhost
2016/08/16 全球购物
Trunki英国官网:儿童坐骑式行李箱
2017/05/30 全球购物
英国家居装饰品、户外家具和玻璃器皿购物网站:Rinkit.com
2019/11/04 全球购物
医务人员竞聘职务自我评价分享
2013/11/08 职场文书
岗位职责的定义
2013/11/10 职场文书
志愿者活动总结范文
2014/04/26 职场文书
赔偿协议书怎么写
2015/01/28 职场文书
2015年国际护士节演讲稿
2015/03/18 职场文书
2015婚礼主持词开场白
2015/05/28 职场文书
解析原生JS getComputedStyle
2021/05/25 Javascript
Vue.js中v-bind指令的用法介绍
2022/03/13 Vue.js
索尼ICF-5900W收音机测评
2022/04/24 无线电
Go语言编译原理之变量捕获
2022/08/05 Golang