当前位置:首页 > VUE

vue如何实现路由守卫

2026-01-23 07:15:53VUE

路由守卫的实现方式

Vue Router 提供了多种路由守卫(Navigation Guards)来控制路由跳转,可以在全局、路由独享或组件内进行设置。以下是常见的实现方法:

全局前置守卫(beforeEach)

在路由跳转前进行权限验证或全局处理:

vue如何实现路由守卫

router.beforeEach((to, from, next) => {
  if (to.matched.some(record => record.meta.requiresAuth)) {
    if (!auth.isLoggedIn()) {
      next({ path: '/login' })
    } else {
      next()
    }
  } else {
    next()
  }
})

全局解析守卫(beforeResolve)

在导航被确认前触发,适合等待异步数据加载:

router.beforeResolve(async (to, from, next) => {
  try {
    await fetchDataBeforeEnter(to)
    next()
  } catch (error) {
    next('/error')
  }
})

全局后置钩子(afterEach)

导航完成后执行,适合日志记录或页面滚动复位:

vue如何实现路由守卫

router.afterEach((to, from) => {
  logPageView(to.fullPath)
  window.scrollTo(0, 0)
})

路由独享守卫(beforeEnter)

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

const routes = [
  {
    path: '/admin',
    component: AdminPanel,
    beforeEnter: (to, from, next) => {
      if (!user.isAdmin) next('/forbidden')
      else next()
    }
  }
]

组件内守卫

在组件内部定义特定生命周期钩子:

export default {
  beforeRouteEnter(to, from, next) {
    // 不能访问组件实例 `this`
    next(vm => {
      // 通过回调参数访问实例
    })
  },

  beforeRouteUpdate(to, from, next) {
    // 当前路由改变但组件复用时调用
    this.fetchData(to.params.id)
    next()
  },

  beforeRouteLeave(to, from, next) {
    if (this.hasUnsavedChanges) {
      if (confirm('确定离开?')) next()
      else next(false)
    } else next()
  }
}

完整的守卫解析流程

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

注意事项

  • 守卫函数必须调用 next() 来继续导航流程
  • next(false) 中断当前导航
  • next('/path')next({ path: '/' }) 可重定向
  • beforeRouteEnter 中无法访问组件实例
  • 异步操作应使用 async/await 或返回 Promise

这些守卫可以组合使用来实现复杂的路由控制逻辑,如权限验证、数据预加载、表单保护等场景。

分享给朋友:

相关文章

vue路由实现原理

vue路由实现原理

Vue 路由实现原理 Vue Router 是 Vue.js 官方的路由管理器,其核心原理基于前端路由的实现方式,主要包括哈希模式(Hash Mode)和历史模式(History Mode)。以下是其…

vue实现路由

vue实现路由

Vue 路由的实现方法 Vue 路由可以通过 Vue Router 库来实现,Vue Router 是 Vue.js 官方的路由管理器,用于构建单页面应用(SPA)。 安装 Vue Router 通…

vue如何实现拖动

vue如何实现拖动

Vue 实现拖动的几种方法 使用 HTML5 原生拖放 API HTML5 提供了原生的拖放 API,通过 draggable 属性和相关事件实现拖动功能。 <template>…

vue如何实现mvvm

vue如何实现mvvm

Vue 实现 MVVM 的核心机制 Vue 的 MVVM(Model-View-ViewModel)实现依赖于数据绑定和响应式系统,通过以下核心机制完成: 数据劫持(响应式系统) Vue 使用 Ob…

vue路由实现思路

vue路由实现思路

Vue 路由实现思路 Vue 路由的核心是通过 Vue Router 库实现的单页面应用(SPA)路由管理。以下是关键实现思路和步骤: 安装 Vue Router 通过 npm 或 yarn 安装…

vue如何实现冒泡

vue如何实现冒泡

Vue 实现冒泡排序的步骤 在 Vue 中实现冒泡排序,可以通过数据绑定和计算属性来动态展示排序过程。以下是一个完整的实现示例。 示例代码 <template> <div&g…