首页 >> js开发 >> jsvue-router的hooks用法详解js大全
jsvue-router的hooks用法详解js大全
发布时间: 2021年1月13日 | 浏览:
| 分类:js开发
虽然Vue 3还没有正式发布,但是热爱新技术的我早已按捺不住自己的内心,开始尝试在小项目中使用它了。根据这篇《今日凌晨Vue3 beta版震撼发布,竟然公开支持脚手架项目!》我搭建了一个Vue 3的脚手架项目,用这种方式搭建的脚手架项目不仅仅只有vue是新版的,就连vue-router、vuex都是最新的。今日凌晨Vue3 beta版震撼发布,竟然公开支持脚手架项目!给大家截一下package.json的图:可以看到vue-router和vuex都已经开启4.0时代啦!不过其实我并没有去了解过vue-router 4.0的新用法什么的,因为我觉得它不像vue 3.0都已经进行到beta的版本不会有特别大的变动。而vue-router 4.0还是alpha的阶段,所以我认为现在去学习它有些为时尚早。但却就是它!差点酿成了一场惨剧。旧版vue + vue-router的使用方式旧版vue + vue-router的使用方式旧版vue + vue-router的使用方式假如你在路由里面定义了一个动态参数通常都会这么写:
{
path: '/:id'
}
{
path: '/:id'
}然后用编程式导航的时候通常会这样去写:
this.$router.push('/123')
this.$router.push('/123')在组件中是这样获取这个参数的:
this.$route.params.id
this.$route.params.id我以为的新版vue + vue-router的使用方式我以为的新版vue + vue-router的使用方式我以为的新版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)
})
import { defineComponent, getCurrentInstance } from 'vue'
export default defineComponent((props, context) => {
const { ctx } = getCurrentInstance()
console.log(ctx.$route)
})没想到打印出来的居然是undefined!
这是咋回事呢?
于是我又打印了一遍ctx(ctx是当前组件上下文):ctx是当前组件上下文没有$的那些字段是我在组件中自己定义的变量,带$的这些就是vue内置的了,找了半天发现没有$route了,只剩下了一个$router,估计vue-router 4.0把当前路由信息都转移到$router里面去了。带着猜想,我点开了$router:currentRoute! 看名字的话感觉应该就是它了!于是乎我:
import { defineComponent, getCurrentInstance } from 'vue'
export default defineComponent((props, context) => {
const { ctx } = getCurrentInstance()
console.log(ctx.$router.currentRoute.value.params.id)
})
import { defineComponent, getCurrentInstance } from 'vue'
export default defineComponent((props, context) => {
const { ctx } = getCurrentInstance()
console.log(ctx.$router.currentRoute.value.params.id)
})果然获取到了!好开心!实际的新版vue + vue-router用法实际的新版vue + vue-router用法实际的新版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的bug,果然alpha阶段的产物不靠谱,我开始后悔使用新版的vue脚手架项目了。vue-router里的hooksvue-router里的hooksvue-router里的hooks不过这时我突然灵光一现,vue 3不是受到了react hooks的启发才产生了Composition API的吗?那么估计vue-router肯定也会受到react-router的启发了!还好我学过react,果然技多不压身啊!估计里面肯定是有一个useXxx,就像这样:
import
{
useXxx
}
from 'vue-router'
import
{
useXxx
}
from 'vue-router'那么应该是use什么呢?按理来说应该会尽量的和以前的API保持一定的联系,我猜应该是useRoute和useRouter吧!为了验证我的想法,我打开了node_modules找到了vue-router的源码:果不其然,在第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')
})
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-nexthttps://github.com/vuejs/vue-router-next它的示例都放在了playground这个文件夹下,期待你们研究明白后出一篇更加深入的文章!
{
path: '/:id'
}
{
path: '/:id'
}然后用编程式导航的时候通常会这样去写:
this.$router.push('/123')
this.$router.push('/123')在组件中是这样获取这个参数的:
this.$route.params.id
this.$route.params.id我以为的新版vue + vue-router的使用方式我以为的新版vue + vue-router的使用方式我以为的新版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)
})
import { defineComponent, getCurrentInstance } from 'vue'
export default defineComponent((props, context) => {
const { ctx } = getCurrentInstance()
console.log(ctx.$route)
})没想到打印出来的居然是undefined!
这是咋回事呢?
于是我又打印了一遍ctx(ctx是当前组件上下文):ctx是当前组件上下文没有$的那些字段是我在组件中自己定义的变量,带$的这些就是vue内置的了,找了半天发现没有$route了,只剩下了一个$router,估计vue-router 4.0把当前路由信息都转移到$router里面去了。带着猜想,我点开了$router:currentRoute! 看名字的话感觉应该就是它了!于是乎我:
import { defineComponent, getCurrentInstance } from 'vue'
export default defineComponent((props, context) => {
const { ctx } = getCurrentInstance()
console.log(ctx.$router.currentRoute.value.params.id)
})
import { defineComponent, getCurrentInstance } from 'vue'
export default defineComponent((props, context) => {
const { ctx } = getCurrentInstance()
console.log(ctx.$router.currentRoute.value.params.id)
})果然获取到了!好开心!实际的新版vue + vue-router用法实际的新版vue + vue-router用法实际的新版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的bug,果然alpha阶段的产物不靠谱,我开始后悔使用新版的vue脚手架项目了。vue-router里的hooksvue-router里的hooksvue-router里的hooks不过这时我突然灵光一现,vue 3不是受到了react hooks的启发才产生了Composition API的吗?那么估计vue-router肯定也会受到react-router的启发了!还好我学过react,果然技多不压身啊!估计里面肯定是有一个useXxx,就像这样:
import
{
useXxx
}
from 'vue-router'
import
{
useXxx
}
from 'vue-router'那么应该是use什么呢?按理来说应该会尽量的和以前的API保持一定的联系,我猜应该是useRoute和useRouter吧!为了验证我的想法,我打开了node_modules找到了vue-router的源码:果不其然,在第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')
})
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-nexthttps://github.com/vuejs/vue-router-next它的示例都放在了playground这个文件夹下,期待你们研究明白后出一篇更加深入的文章!
相关文章:
- jsvuex中store存储store.commit和store.dispatch的用法js大全
- jsAngular利用HTTP POST下载流文件的步骤记录js大全
- js解决vuex数据页面刷新后初始化操作js大全
- jsvue 页面回退mounted函数不执行的解决方案js大全
- jsvue项目使用$router.go(-1)返回时刷新原来的界面操作js大全
- jsElement Input输入框的使用方法js大全
- js关于angular浏览器兼容性问题的解决方案js大全
- JavaScriptthree.js欧拉角和四元数的使用方法
- js使用React-Router实现前端路由鉴权的示例代码js大全
- jsVue-CLI 3 scp2自动部署项目至服务器的方法js大全