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 相关文章推荐
延时重复执行函数 lLoopRun.js
May 08 Javascript
jQuery一步一步实现跨浏览器的可编辑表格,支持IE、Firefox、Safari、Chrome、Opera
Aug 28 Javascript
改变javascript函数内部this指针指向的三种方法
Apr 23 Javascript
javascript适合移动端的日期时间拾取器
Nov 10 Javascript
Vue2路由动画效果的实现代码
Jul 10 Javascript
JavaScript实现的仿新浪微博原生态输入字数即时检查功能【兼容IE6】
Sep 26 Javascript
jQuery实现菜单的显示和隐藏功能示例
Jul 24 jQuery
JavaScript封装的常用工具类库bee.js用法详解【经典类库】
Sep 03 Javascript
记一次vue-webpack项目优化实践详解
Feb 17 Javascript
bootstrap中的导航条实例代码详解
May 20 Javascript
浅谈vue 锚点指令v-anchor的使用
Nov 13 Javascript
详解JavaScript的计时器和按钮效果设置
Feb 18 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
杏林同学录(八)
2006/10/09 PHP
基于PHP选项与信息函数的使用详解
2013/05/10 PHP
慎用preg_replace危险的/e修饰符(一句话后门常用)
2013/06/19 PHP
php字符串截取的简单方法
2013/07/04 PHP
php 防止表单重复提交两种实现方法
2016/11/03 PHP
PHP实现正则匹配所有括号中的内容
2018/06/22 PHP
PHP读取Excel内的图片(phpspreadsheet和PHPExcel扩展库)
2019/11/19 PHP
JavaScript 入门·JavaScript 具有全范围的运算符
2007/10/01 Javascript
在子窗口中关闭父窗口的一句代码
2013/10/21 Javascript
JS控制图片等比例缩放的示例代码
2013/12/24 Javascript
jQuery使用animate创建动画用法实例
2015/08/07 Javascript
Highcharts学习之坐标轴
2016/08/02 Javascript
javascript中mouseenter与mouseover的异同
2017/06/06 Javascript
基于JavaScript实现图片连播和联级菜单实例代码
2017/07/28 Javascript
Vue+mui实现图片的本地缓存示例代码
2018/05/24 Javascript
angularJs中跳转到指定的锚点实例($anchorScroll)
2018/08/31 Javascript
对TypeScript库进行单元测试的方法
2019/07/18 Javascript
ES6中异步对象Promise用法详解
2019/07/31 Javascript
JS模拟浏览器实现全局搜索功能
2019/09/11 Javascript
原生js实现自定义难度的扫雷游戏
2021/01/22 Javascript
深入理解Python中命名空间的查找规则LEGB
2015/08/06 Python
Python2和Python3中urllib库中urlencode的使用注意事项
2018/11/26 Python
python 对类的成员函数开启线程的方法
2019/01/22 Python
Python Opencv提取图片中某种颜色组成的图形的方法
2019/09/19 Python
python3 webp转gif格式的实现示例
2019/12/10 Python
python matplotlib.pyplot.plot()参数用法
2020/04/14 Python
Python多线程thread及模块使用实例
2020/04/28 Python
HTML5 Canvas如何实现纹理填充与描边(Fill And Stroke)
2013/07/15 HTML / CSS
HTML5 video进入全屏和退出全屏的实现方法
2020/07/28 HTML / CSS
CAT鞋加拿大官网:CAT Footwear加拿大
2020/08/05 全球购物
计算机应届毕业生自荐信范文
2014/02/23 职场文书
2014年社区党建工作汇报材料
2014/11/02 职场文书
小学班主任评语
2014/12/29 职场文书
大班下学期幼儿评语
2014/12/30 职场文书
暑期实践个人总结
2015/03/06 职场文书
如何判断微信付款码和支付宝付款码
2021/04/01 PHP