Vue.js中的路由导航钩子有哪些?如何使用?
在 Vue Router 中,我们有多种方式可以在路由导航过程中进行拦截和处理,这些方式被称为“导航守卫”(Navigation Guards),也可以理解为路由的钩子函数。这些导航守卫主要包括:
- 全局前置守卫:
router.beforeEach
,这个函数接收三个参数,分别是即将进入的路由对象to
,现在离开的路由对象from
,以及一个必须调用的函数next
。我们可以在这个函数中进行一些全局的导航控制。
例如:
router.beforeEach((to, from, next) => {
// 检查用户是否登录
if (to.meta.requiresAuth && !isAuthenticated) {
next('/login');
} else {
next();
}
});
在这个例子中,我们检查即将进入的路由是否需要登录,如果需要,但是用户没有登录,则导航到登录页面。
- 全局解析守卫:
router.beforeResolve
,它和router.beforeEach
类似,区别在于beforeResolve
是在所有组件内守卫和异步路由组件被解析之后,解析守卫就被调用。 -
全局后置钩子:
router.afterEach
,这个函数接收两个参数,分别是即将进入的路由对象to
和现在离开的路由对象from
。不过,这个函数没有next
函数,也就是说,这个钩子不能改变导航。
例如:
router.afterEach((to, from) => {
// 打印即将进入的路由的路径
console.log(`即将进入的路由路径:${to.path}`);
});
- 路由独享的守卫:在路由配置上直接定义
beforeEnter
,这个函数和beforeEach
接收的参数一样。
例如:
{
path: '/user/:id',
component: User,
beforeEnter: (to, from, next) => {
// 这个钩子只在 /user/:id 路由下生效
next();
}
}
- 组件内的守卫:在 Vue 组件内部直接定义
beforeRouteEnter
,beforeRouteUpdate
,beforeRouteLeave
,这些钩子函数分别在进入、更新、离开路由时被调用。
例如:
export default {
beforeRouteEnter(to, from, next) {
// 这个钩子在路由进入前被调用
next();
},
beforeRouteUpdate(to, from, next) {
// 这个钩子在路由更新时被调用
next();
},
beforeRouteLeave(to, from, next) {
// 这个钩子在路由离开前被调用
next();
}
}
这些导航守卫为我们提供了在路由导航过程中进行各种操作的能力,比如权限控制,页面标题更新,路由取消等。