当前位置:首页 > VUE

vue实现路由守卫

2026-02-11 02:38:49VUE

Vue 路由守卫的实现方法

Vue Router 提供了多种路由守卫,可以在路由导航过程中进行控制。以下是常见的几种实现方式:

全局前置守卫 使用 router.beforeEach 可以注册全局前置守卫,在路由跳转前执行:

router.beforeEach((to, from, next) => {
  // 检查用户是否登录
  if (to.meta.requiresAuth && !isAuthenticated()) {
    next('/login')
  } else {
    next()
  }
})

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

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

组件内守卫 在组件内部可以使用以下守卫:

export default {
  beforeRouteEnter(to, from, next) {
    // 在渲染该组件的对应路由被验证前调用
    next(vm => {
      // 通过 `vm` 访问组件实例
    })
  },
  beforeRouteUpdate(to, from, next) {
    // 当前路由改变但组件被复用时调用
    next()
  },
  beforeRouteLeave(to, from, next) {
    // 导航离开该组件的对应路由时调用
    if (unsavedChanges()) {
      if (confirm('有未保存的更改,确定离开吗?')) {
        next()
      } else {
        next(false)
      }
    } else {
      next()
    }
  }
}

全局解析守卫 使用 router.beforeResolve 注册全局守卫,在导航被确认前,所有组件内守卫和异步路由组件被解析后调用:

router.beforeResolve(async to => {
  if (to.meta.requiresFetch) {
    await fetchData()
  }
})

全局后置钩子 使用 router.afterEach 注册全局后置钩子,不会改变导航本身:

vue实现路由守卫

router.afterEach((to, from) => {
  sendToAnalytics(to.fullPath)
})

路由守卫执行顺序

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

注意事项

  • 确保总是调用 next() 方法,否则钩子不会被解析
  • beforeRouteEnter 中无法访问 this,因为组件实例还未创建
  • 路由守卫可以返回 Promise 来实现异步控制
  • 使用 next(false) 可以中断当前导航
  • 使用 next('/path')next({ path: '/' }) 可以跳转到不同位置

标签: 路由vue
分享给朋友:

相关文章

vue如何实现冒泡

vue如何实现冒泡

Vue 实现冒泡排序 在 Vue 中实现冒泡排序,可以通过数据绑定和响应式特性动态展示排序过程。以下是一个完整的实现示例,包含代码和详细说明。 数据准备 在 Vue 的 data 中定义一个数组作为…

vue怎么实现

vue怎么实现

Vue 实现方法 Vue 是一个流行的前端框架,用于构建用户界面。以下是几种常见的实现方法: 数据绑定 使用 v-model 指令实现双向数据绑定,适用于表单输入元素。 <input v-m…

vue实现模块

vue实现模块

Vue 实现模块化的方法 Vue 支持多种模块化开发方式,可以根据项目需求选择适合的方案。 使用单文件组件(SFC) 单文件组件是 Vue 最常用的模块化方式,将模板、脚本和样式封装在一个 .vue…

vue实现树

vue实现树

Vue 实现树形结构的方法 使用递归组件实现树形结构 递归组件是Vue中实现树形结构的常见方式。通过组件调用自身,可以轻松构建多层嵌套的树形数据。 <template> <ul…

vue实现分栏

vue实现分栏

Vue实现分栏的常见方法 使用CSS Flexbox布局 通过Flexbox可以快速实现分栏效果,适合大多数响应式布局场景 <template> <div class="con…

vue toast实现

vue toast实现

Vue Toast 实现方法 使用第三方库(推荐) 安装 vue-toastification 库,这是一个功能丰富且轻量级的 Vue Toast 插件。 npm install vue-toast…