vue 路由守卫-beforeEach
router.beforeEach 是 Vue Router 中用于实现全局路由守卫的核心方法,主要用于在路由跳转前执行特定逻辑(如权限验证、数据加载等),从而控制导航行为。以下是其使用和原理的清晰说明:
一、核心作用
- 路由拦截:通过
router.beforeEach可以拦截所有路由跳转请求,并在跳转前进行条件判断[4]。- 例如:未登录用户尝试访问受限页面时,强制跳转到登录页[1][4]。
- 权限控制:根据用户角色或权限动态决定是否允许访问目标路由[1][5]。
- 统一逻辑处理:集中管理路由跳转前的公共逻辑(如页面标题修改、埋点统计等)[3][5]。
二、基本用法
-
注册全局守卫
在 Vue Router 实例上调用beforeEach,传入一个包含to、from、next参数的函数:router.beforeEach((to, from, next) => { // 逻辑处理 next(); // 必须调用 next() 才能继续导航 });- 参数说明:
to:目标路由对象(即将进入的路由信息)[2]。from:当前路由对象(正要离开的路由信息)[2]。next:控制导航行为的函数,需显式调用以下之一:next():允许跳转。next(false):中断当前导航。next('/login'):重定向到指定路径[2][4]。
- 参数说明:
-
典型场景示例
- 登录验证:
参考:通过检查用户登录状态和路由元信息实现权限控制[1][4]。if (to.meta.requiresAuth && !isLoggedIn) { next('/login'); // 未登录则跳转 } else { next(); } - 动态权限:结合 Vuex 中的用户角色信息,验证用户是否有访问权限[1][5]。
- 登录验证:
三、工作原理
-
执行时机
beforeEach属于全局前置守卫,在路由跳转被触发时,最先被调用[2]。Vue Router 的导航解析流程如下:触发导航 → 调用全局守卫 → 调用路由独享守卫 → 调用组件内守卫 → 渲染目标组件 -
阻塞式逻辑
- 守卫函数中的代码会阻塞导航,直到
next()被调用。 - 若未调用
next(),页面会处于“悬停”状态,无法跳转[2][5]。
- 守卫函数中的代码会阻塞导航,直到
-
链式调用
支持注册多个beforeEach守卫,按注册顺序依次执行,类似中间件机制[3][5]。
四、应用场景
- 登录状态验证(如未登录跳转至登录页)[1][4]。
- 动态权限控制(如管理员与普通用户的路由隔离)[1][5]。
- 数据预加载:在跳转前预先请求页面所需数据[3]。
- 路由埋点:统计页面访问路径和停留时长[3][5]。
通过合理使用 router.beforeEach,开发者可以高效管理路由跳转的前置逻辑,提升应用的安全性和用户体验[5]。