Vue Router 路由守卫学习指南
Vue Router 提供了 路由守卫(Navigation Guards)来控制路由导航的行为。这些守卫可以用于在路由跳转之前、跳转之后或路由离开时,执行某些操作,比如验证用户身份、权限控制、数据加载等。
Vue Router 路由守卫的分类
-
全局守卫:
beforeEach
:在每次路由跳转之前触发。afterEach
:在每次路由跳转之后触发。
-
路由独享守卫:
beforeEnter
:用于路由配置时指定的守卫,只有在该路由被访问时才触发。
-
组件内守卫:
beforeRouteEnter
:在路由进入前触发,beforeRouteEnter
不会访问组件实例,因此不能访问this
。beforeRouteUpdate
:当路由参数变化时,组件重渲染之前触发。beforeRouteLeave
:在路由离开前触发,通常用于保存离开前的数据或进行确认。
1. 全局守卫
beforeEach
beforeEach
是一个全局路由守卫,在每次路由跳转之前执行。它接收三个参数:
to
:即将进入的目标路由对象。from
:当前导航即将离开的路由对象。next
:调用该函数来决定路由是否继续。
// 全局守卫 const router = new VueRouter({ routes: [ // 路由配置 ] }); router.beforeEach((to, from, next) => { // 路由跳转前的逻辑,比如验证用户是否登录 if (to.meta.requiresAuth && !isUserLoggedIn()) { next('/login'); // 跳转到登录页面 } else { next(); // 必须调用 next() 才能继续路由跳转 } });
afterEach
afterEach
是全局守卫,在每次路由跳转之后执行,不能更改导航(即不能使用 next()
)。
router.afterEach((to, from) => { // 路由跳转后的逻辑,比如页面统计,日志记录等 console.log(`Navigated from ${from.path} to ${to.path}`); });
2. 路由独享守卫
beforeEnter
beforeEnter
允许你为特定路由设置守卫,只有当该路由被访问时才会执行。它在路由配置对象内定义。
const routes = [ { path: '/protected', component: ProtectedComponent, beforeEnter: (to, from, next) => { if (!isUserLoggedIn()) { next('/login'); // 跳转到登录页面 } else { next(); // 继续导航 } } } ];
3. 组件内守卫
beforeRouteEnter
beforeRouteEnter
在组件被创建之前执行,因此无法访问组件实例 this
,但是可以通过 next
函数的回调访问组件实例。
export default { beforeRouteEnter(to, from, next) { // 进入该路由之前的逻辑 next(vm => { // vm 是组件实例 console.log('Component instance:', vm); }); } }
beforeRouteUpdate
当路由参数变化时(如通过动态路由跳转),beforeRouteUpdate
会在组件重新渲染之前调用。
export default { beforeRouteUpdate(to, from, next) { // 当路由更新时触发 console.log('Route parameters changed'); next(); } }
beforeRouteLeave
beforeRouteLeave
在离开当前路由时触发,通常用于数据保存或用户确认是否离开当前页面(例如表单未保存的情况)。
export default { beforeRouteLeave(to, from, next) { // 离开当前路由前的逻辑,比如提示是否保存 const answer = window.confirm('Do you really want to leave?'); if (answer) { next(); // 允许离开 } else { next(false); // 取消离开 } } }
路由守卫的顺序
- 全局前置守卫 (
beforeEach
) 会先于路由独享守卫和组件内守卫触发。 - 路由独享守卫 (
beforeEnter
) 紧接其后,只对特定路由有效。 - 组件内守卫 (
beforeRouteEnter
,beforeRouteUpdate
,beforeRouteLeave
) 会在组件生命周期的适当时刻触发。 - 全局后置守卫 (
afterEach
) 会在所有的守卫执行完后执行。
总结
- 全局守卫 用于全局处理路由跳转前后的逻辑,如用户认证等。
- 路由独享守卫 在特定路由的配置中定义,可以为某个特定路由添加守卫。
- 组件内守卫 在组件内部定义,适用于处理组件生命周期相关的导航逻辑,如路由参数变化、组件离开时的清理操作等。
路由守卫在控制导航行为、权限校验、数据预加载等方面非常有用。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」