vue-router 钩子函数(路由拦截)
有的时候,当路由跳转前或跳转后、进入、离开某一个路由前、后,需要做某些操作,就可以使用路由钩子来监听路由的变化,比如最常见的登录权限验证,当用户满足条件时,才让其进入导航,否则就取消跳转,并跳到登录页面让其登录
全局路由钩子
beforeEach, afterEach, beforeResolve
router.beforeResolve
全局解析守卫(2.5.0+) 在beforeRouteEnter调用之后调用
1 | router.beforeEach((to, from, next) => { |
- to, from, 路由对象指的是平时通过this.$route获取到的路由对象
- next()
- next(false) url 不跳转
- next 跳转新路由,当前的导航被中断,重新开始一个新的导航
1
2
3我们可以这样跳转:next('path地址')或者next({path:''})或者next({name:''})
且允许设置诸如 replace: true、name: 'home' 之类的选项
以及你用在router-link或router.push的对象选项。
单个路由钩子
只有
beforeEnter
,在进入前执行,to参数就是当前路由
1 | routes: [ |
组件内路由钩子
beforeRouteEnter, beforeRouteUpdate(2.2), beforeRouteLeave
beforeRouteEnter 不能获取组件实例 this,因为当守卫执行前,组件实例被没有被创建出来,剩下两个钩子则可以正常获取组件实例 this
- beforeRouteEnter获取到this实例, 可以通过传一个回调给next来访问组件实例
1
2
3
4
5beforeRouteEnter (to, from, next) {
next(vm => {
// 通过 `vm` 访问组件实例
})
}
1 | beforeRouteEnter (to, from, next) { |
完整的路由导航解析流程(不包括其他生命周期)
- 触发进入其他路由。
- 调用要离开路由的组件守卫beforeRouteLeave
- 调用局前置守卫:beforeEach
- 在重用的组件里调用 beforeRouteUpdate
- 调用路由独享守卫 beforeEnter。
- 解析异步路由组件。
- 在将要进入的路由组件中调用beforeRouteEnter
- 调用全局解析守卫 beforeResolve
- 导航被确认。
- 调用全局后置钩子的 afterEach 钩子。
- 触发DOM更新(mounted)。
- 执行beforeRouteEnter 守卫中传给 next 的回调函数
欢迎访问我的博客 地址
https://blog.afacode.top