vue-router的hooks用法详解


Posted in Javascript onJune 08, 2020

虽然Vue 3还没有正式发布,但是热爱新技术的我早已按捺不住自己的内心,开始尝试在小项目中使用它了。

根据这篇《今日凌晨Vue3 beta版震撼发布,竟然公开支持脚手架项目!》我搭建了一个Vue 3的脚手架项目,用这种方式搭建的脚手架项目不仅仅只有vue是新版的,就连vue-router、vuex都是最新的。

给大家截一下package.json的图:

vue-router的hooks用法详解

可以看到vue-router和vuex都已经开启4.0时代啦!

不过其实我并没有去了解过vue-router 4.0的新用法什么的,因为我觉得它不像vue 3.0都已经进行到beta的版本不会有特别大的变动。

而vue-router 4.0还是alpha的阶段,所以我认为现在去学习它有些为时尚早。但却就是它!差点酿成了一场惨剧。

旧版vue + vue-router的使用方式

假如你在路由里面定义了一个动态参数通常都会这么写:

{
 path: '/:id'
}

然后用编程式导航的时候通常会这样去写:

this.$router.push('/123')

在组件中是这样获取这个参数的:

this.$route.params.id

我以为的新版vue + vue-router的使用方式

由于vue 3.0的Composition API中没有this了,所以我想到了通过获取组件实例的方式来获取$route:

import { defineComponent, getCurrentInstance } from 'vue'

export default defineComponent((props, context) => {
 const { ctx } = getCurrentInstance()
 
 console.log(ctx.$route)
})

没想到打印出来的居然是undefined!
这是咋回事呢?
于是我又打印了一遍ctx(ctx是当前组件上下文):

vue-router的hooks用法详解

没有$的那些字段是我在组件中自己定义的变量,带$的这些就是vue内置的了,找了半天发现没有$route了,只剩下了一个$router,估计vue-router 4.0把当前路由信息都转移到$router里面去了。

带着猜想,我点开了$router:

vue-router的hooks用法详解

currentRoute! 看名字的话感觉应该就是它了!于是乎我:

import { defineComponent, getCurrentInstance } from 'vue'

export default defineComponent((props, context) => {
 const { ctx } = getCurrentInstance()
 
 console.log(ctx.$router.currentRoute.value.params.id)
})

果然获取到了!好开心!

实际的新版vue + vue-router用法

在接下来的过程中我用ctx.$router代替了原来的this.$router、用ctx.$router.currentRoute.value代替了原先的this.$route。

尽管在接下来的进度中并没有出现任何的bug,程序一直都是按照我所设想的那样去运行的。

但在项目打包后却出现了意想不到的bug:在跳转路由的时候报了一个在undefined上面没有push的错误。

奇了怪了,在开发阶段程序都没有任何的报错怎么一打包就不行了呢?依靠多年的开发经验,我很快就定位到了是vue-router的错误。

难道这样写是错的吗?可是我打印了ctx,它里面明明有一个$router、$router里面明明就有currentRoute、currentRoute里面明明就有一个value、value里面明明就有params、params里面我一点开明明就看到了传过来的参数啊:

vue-router的hooks用法详解

估计可能是vue-router的bug,果然alpha阶段的产物不靠谱,我开始后悔使用新版的vue脚手架项目了。

vue-router里的hooks

不过这时我突然灵光一现,vue 3不是受到了react hooks的启发才产生了Composition API的吗?

那么估计vue-router肯定也会受到react-router的启发了!

还好我学过react,果然技多不压身啊!估计里面肯定是有一个useXxx,就像这样:

import 
{ 
useXxx 
}
 from 'vue-router'

那么应该是use什么呢?按理来说应该会尽量的和以前的API保持一定的联系,我猜应该是useRoute和useRouter吧!

为了验证我的想法,我打开了node_modules找到了vue-router的源码:

vue-router的hooks用法详解

果不其然,在第2454和第2455行我发现它导出了useRoute和useRouter,那么就是它了:

import { defineComponent } from 'vue'
import { useRoute, useRouter } from 'vue-router'

export default defineComponent(_ => {
 const route = useRoute()
 const router = useRouter()

 console.log(route.params.id)
 router.push('/xxx/xxx')
})

使用这种方式不但可以成功跳转路由,也同样可以获取到路由传过来的参数,这次再打包试了一下,果然就没有之前的那个报错了。

结语

估计以后的vue全家桶要开启全民hooks的时代了,在翻看源码的同时我发现他们把一些示例都写在了vue-router/playground文件夹下了,在里面我发现了一些有趣的用法。

如果有时间的话我会仔细研究一下然后出一篇更加深入的文章给大家,当然如果已经有小伙伴等不及我出新文章的话可以直接进入vue-router-next的github地址:

https://github.com/vuejs/vue-router-next

它的示例都放在了playground这个文件夹下,期待你们研究明白后出一篇更加深入的文章!

到此这篇关于vue-router的hooks用法的文章就介绍到这了,更多相关vue-router hooks用法内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
jquery选择器(常用选择器说明)
Sep 28 Javascript
使用javascript实现ListBox左右全选,单选,多选,全请
Nov 07 Javascript
js函数与php函数的区别实例浅析
Jan 12 Javascript
扒一扒JavaScript 预解释
Jan 28 Javascript
JavaScript中constructor()方法的使用简介
Jun 05 Javascript
基于JS实现横线提示输入验证码随验证码输入消失(js验证码的实现)
Oct 27 Javascript
Kotlin学习第一步 kotlin语法特性
May 25 Javascript
Vue 2.5.2下axios + express 本地请求404的解决方法
Feb 21 Javascript
jQuery实现遍历XML节点和属性的方法示例
Apr 29 jQuery
vue用BMap百度地图实现即时搜索功能
Sep 26 Javascript
Vue 中使用富文本编译器wangEditor3的方法
Sep 26 Javascript
react基本安装与测试示例
Apr 27 Javascript
Vue自定义render统一项目组弹框功能
Jun 07 #Javascript
用云开发Cloudbase实现小程序多图片内容安全监测的代码详解
Jun 07 #Javascript
Electron整合React使用搭建开发环境的步骤详解
Jun 07 #Javascript
vue路由权限校验功能的实现代码
Jun 07 #Javascript
Vue使用自定义指令实现拖拽行为实例分析
Jun 06 #Javascript
JS原型对象操作实例分析
Jun 06 #Javascript
JS中的继承操作实例总结
Jun 06 #Javascript
You might like
玛琪朵 Macchiato
2021/03/03 咖啡文化
3种平台下安装php4经验点滴
2006/10/09 PHP
PHP中Date获取时间不正确怎么办
2008/06/05 PHP
snoopy 强大的PHP采集类使用实例代码
2010/12/09 PHP
php学习笔记 类的声明与对象实例化
2011/06/13 PHP
php验证手机号码(支持归属地查询及编码为UTF8)
2013/02/01 PHP
php中substr()函数参数说明及用法实例
2014/11/15 PHP
PHP中new static() 和 new self() 的区别介绍
2015/01/09 PHP
WordPress中对访客评论功能的一些优化方法
2015/11/24 PHP
thinkphp框架下404页面设置 仅三步
2016/05/14 PHP
浅谈php中curl、fsockopen的应用
2016/12/10 PHP
JavaScript 拖拉缩放效果
2008/12/10 Javascript
JS如何判断json是否为空
2016/07/06 Javascript
js判断浏览器是否支持严格模式的方法
2016/10/04 Javascript
原生js实现类似fullpage的单页/全屏滚动
2017/01/22 Javascript
jQuery插件zTree实现的多选树效果示例
2017/03/08 Javascript
详解JavaScript作用域和作用域链
2019/03/19 Javascript
Node.js API详解之 tty功能与用法实例分析
2020/04/27 Javascript
vue中组件通信详解(父子组件, 爷孙组件, 兄弟组件)
2020/07/27 Javascript
python益智游戏计算汉诺塔问题示例
2014/03/05 Python
答题辅助python代码实现
2018/01/16 Python
使用Python正则表达式操作文本数据的方法
2019/05/14 Python
Python单元测试与测试用例简析
2019/11/09 Python
pytorch中交叉熵损失(nn.CrossEntropyLoss())的计算过程详解
2020/01/02 Python
python实现用类读取文件数据并计算矩形面积
2020/01/18 Python
关于tf.matmul() 和tf.multiply() 的区别说明
2020/06/18 Python
Python常用base64 md5 aes des crc32加密解密方法汇总
2020/11/06 Python
中国综合网上购物商城:苏宁易购
2016/08/09 全球购物
YSL圣罗兰美妆美国官网:Yves Saint Lauret US
2016/11/21 全球购物
国际鲜花速递专家:Floraqueen
2016/11/24 全球购物
优衣库英国官网:UNIQLO英国
2016/12/25 全球购物
企划专员岗位职责
2013/12/09 职场文书
yy司仪主持词
2014/03/22 职场文书
大学本科生职业生涯规划书范文
2014/09/14 职场文书
高校师德师风自我剖析材料
2014/09/29 职场文书
科学家研发出新型速效酶,可在 24 小时内降解塑料制品
2022/04/29 数码科技