Vue Router 导航守卫全面解析

Vue Router 导航守卫全面解析

vue-router 🚦 The official router for Vue 2 vue-router 项目地址: https://gitcode.com/gh_mirrors/vu/vue-router

什么是导航守卫

导航守卫是 Vue Router 提供的一套路由拦截机制,允许开发者在路由导航过程中插入自定义逻辑。这些守卫就像路由导航过程中的"安检站",可以决定是否允许导航继续、重定向到其他路由或完全取消导航。

导航守卫的类型

Vue Router 提供了三种主要类型的导航守卫:

1. 全局守卫

作用于所有路由导航

2. 路由独享守卫

只作用于特定路由配置

3. 组件内守卫

只作用于特定路由组件

全局守卫详解

beforeEach - 全局前置守卫

router.beforeEach((to, from, next) => {
  // 导航处理逻辑
})

参数说明:

  • to: 即将进入的目标路由对象
  • from: 当前导航正要离开的路由
  • next: 必须调用的函数,决定导航行为

next函数用法:

  • next(): 放行到下一个守卫
  • next(false): 中断当前导航
  • next('/path'): 重定向到指定路径
  • next(error): 导航出错处理

重要提示: 必须调用next函数,否则导航将一直挂起。

beforeResolve - 全局解析守卫(2.5+)

router.beforeResolve((to, from, next) => {
  // 在导航被确认前调用
})

与beforeEach类似,但在所有组件内守卫和异步路由组件解析后调用。

afterEach - 全局后置钩子

router.afterEach((to, from) => {
  // 导航完成后调用
})

注意:没有next参数,不会影响导航本身。

路由独享守卫

可以在路由配置中直接定义beforeEnter守卫:

const router = new VueRouter({
  routes: [
    {
      path: '/admin',
      component: Admin,
      beforeEnter: (to, from, next) => {
        // 管理员权限验证逻辑
      }
    }
  ]
})

组件内守卫

组件内可以定义以下三种导航守卫:

beforeRouteEnter

beforeRouteEnter(to, from, next) {
  // 组件实例还未创建
  next(vm => {
    // 通过vm访问组件实例
  })
}

特点:

  • 在组件创建前调用
  • 无法访问this
  • 支持给next传递回调

beforeRouteUpdate (2.2+)

beforeRouteUpdate(to, from, next) {
  // 当前路由改变但组件被复用时调用
  // 可以访问this
}

典型场景:动态参数路径(如/user/:id)切换时。

beforeRouteLeave

beforeRouteLeave(to, from, next) {
  // 离开该组件对应路由时调用
  // 可以访问this
}

常用场景:防止用户意外离开未保存的页面。

完整的导航解析流程

  1. 导航被触发
  2. 调用失活组件的beforeRouteLeave
  3. 调用全局beforeEach
  4. 调用重用组件的beforeRouteUpdate
  5. 调用路由配置中的beforeEnter
  6. 解析异步路由组件
  7. 调用激活组件的beforeRouteEnter
  8. 调用全局beforeResolve
  9. 导航被确认
  10. 调用全局afterEach
  11. DOM更新
  12. 执行beforeRouteEnter中传给next的回调

最佳实践

  1. 权限控制:在全局守卫中检查用户权限
  2. 数据预加载:在beforeRouteEnter中预加载数据
  3. 表单保护:在beforeRouteLeave中防止未保存数据丢失
  4. 动态标题:在afterEach中更新页面标题
  5. 错误处理:使用next(error)处理导航错误

常见问题

  1. 忘记调用next():会导致导航挂起
  2. 在beforeRouteEnter中访问this:组件实例尚未创建
  3. 参数变化不触发守卫:需要使用beforeRouteUpdate或监听$route
  4. 循环重定向:确保重定向逻辑不会无限循环

总结

Vue Router的导航守卫提供了强大的路由控制能力,理解并合理运用这些守卫可以构建更安全、更灵活的前端路由系统。根据不同的业务场景选择合适的守卫类型,并注意守卫的执行顺序和生命周期,可以大大提高应用的路由管理能力。

vue-router 🚦 The official router for Vue 2 vue-router 项目地址: https://gitcode.com/gh_mirrors/vu/vue-router

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

Vue RouterVue.js 的官方路由器,允许我们构建单页面应用(SPA)。导航守卫Vue Router 中一种非常有用的机制,用来在路由发生变化前后执行一些代码。这些守卫可以全局或局部地定义,也可以在导航的不同阶段定义。 ### 全局守卫 全局守卫主要有三种: 1. `beforeEach`:在路由改变之前进行守卫,这是最常见的全局守卫。 2. `beforeResolve`:在 `beforeRouteEnter` 和 `beforeRouteUpdate` 守卫被调用后被调用。 3. `afterEach`:在路由改变之后进行守卫,不会接受 next 函数,不能改变导航本身。 使用示例: ```javascript router.beforeEach((to, from, next) => { // ... next(); }); router.afterEach((to, from) => { // ... }); ``` ### 路由独享守卫路由配置中直接定义 `beforeEnter` 守卫: ```javascript const router = new VueRouter({ routes: [ { path: '/foo', component: Foo, beforeEnter: (to, from, next) => { // ... next(); } } ] }); ``` ### 组件内守卫 组件内守卫是在路由组件内直接定义的,主要有: 1. `beforeRouteEnter`:在渲染该组件的对应路由被 confirm 前调用。 2. `beforeRouteUpdate`:在当前路由改变,但是该组件被复用时调用。 3. `beforeRouteLeave`:导航离开该组件的对应路由时调用。 使用示例: ```javascript export default { beforeRouteEnter (to, from, next) { next(vm => { // 通过 `vm` 访问组件实例 }) }, beforeRouteUpdate (to, from, next) { // ... next(); }, beforeRouteLeave (to, from, next) { // ... next(); } } ``` ### 完整的导航解析流程 1. 导航被触发。 2. 在失活的组件里调用 `beforeRouteLeave` 守卫。 3. 调用全局的 `beforeEach` 守卫。 4. 在重用的组件里调用 `beforeRouteUpdate` 守卫 (2.2+)。 5. 在路由配置里调用 `beforeEnter`。 6. 解析异步路由组件。 7. 在被激活的组件里调用 `beforeRouteEnter`。 8. 调用全局的 `beforeResolve` 守卫 (2.5+)。 9. 导航被确认。 10. 调用全局的 `afterEach` 钩子。 11. 触发 DOM 更新。 12. 调用 `beforeRouteEnter` 守卫中传给 `next` 的回调函数,创建好的组件实例会作为回调函数的参数传入。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵇习柱Annabelle

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值