当前位置:首页 > VUE

vue实现路由守卫

2026-01-14 23:37:39VUE

路由守卫的基本概念

路由守卫是Vue Router提供的一种机制,用于在路由跳转前后执行特定的逻辑。它可以用于权限控制、页面访问限制、数据预加载等场景。Vue Router提供了多种路由守卫,包括全局守卫、路由独享守卫和组件内守卫。

全局前置守卫

全局前置守卫通过router.beforeEach注册,会在路由跳转前执行。适合用于权限验证或全局拦截。

const router = new VueRouter({ ... })

router.beforeEach((to, from, next) => {
  if (to.meta.requiresAuth && !isAuthenticated()) {
    next('/login')
  } else {
    next()
  }
})

全局解析守卫

router.beforeResolvebeforeEach类似,但在导航被确认之前调用,同时在所有组件内守卫和异步路由组件被解析之后调用。

router.beforeResolve((to, from, next) => {
  // 确保异步组件已加载
  next()
})

全局后置钩子

router.afterEach在路由跳转完成后执行,没有next参数,常用于日志记录或页面标题设置。

router.afterEach((to, from) => {
  document.title = to.meta.title || 'Default Title'
})

路由独享守卫

在路由配置中直接定义beforeEnter守卫,只对当前路由生效。

const router = new VueRouter({
  routes: [
    {
      path: '/admin',
      component: Admin,
      beforeEnter: (to, from, next) => {
        if (!isAdmin()) {
          next('/')
        } else {
          next()
        }
      }
    }
  ]
})

组件内守卫

在组件内部可以定义以下守卫:

  • beforeRouteEnter
  • beforeRouteUpdate
  • beforeRouteLeave
export default {
  beforeRouteEnter(to, from, next) {
    // 不能访问组件实例`this`
    next(vm => {
      // 通过`vm`访问组件实例
    })
  },
  beforeRouteUpdate(to, from, next) {
    // 当前路由改变但组件复用时调用
    this.name = to.params.name
    next()
  },
  beforeRouteLeave(to, from, next) {
    // 导航离开该组件时调用
    const answer = confirm('确定要离开吗?')
    if (answer) {
      next()
    } else {
      next(false)
    }
  }
}

守卫执行顺序

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

常见应用场景

登录验证

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

权限控制

router.beforeEach((to, from, next) => {
  const requiredRole = to.meta.role
  if (requiredRole && !hasRole(requiredRole)) {
    next('/403')
  } else {
    next()
  }
})

页面离开确认

beforeRouteLeave(to, from, next) {
  if (this.unsavedChanges) {
    if (confirm('有未保存的更改,确定要离开吗?')) {
      next()
    } else {
      next(false)
    }
  } else {
    next()
  }
}

注意事项

  • 确保始终调用next(),否则路由跳转会卡住
  • beforeRouteEnter中无法访问this,因为组件实例尚未创建
  • 守卫可以是异步函数,支持async/await
  • 对于复杂的权限系统,建议将权限逻辑集中管理

vue实现路由守卫

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

相关文章

vue实现列表显示

vue实现列表显示

Vue 实现列表显示的方法 在 Vue 中实现列表显示通常使用 v-for 指令,结合数组或对象数据渲染动态列表。以下是几种常见的实现方式。 基本列表渲染 通过 v-for 指令遍历数组,动态生成列…

vue实现关键词轮播

vue实现关键词轮播

Vue 实现关键词轮播 基础实现方案 使用 Vue 的 v-for 和 setInterval 实现基础轮播效果: <template> <div class="keywor…

vue实现绑卡的原理

vue实现绑卡的原理

Vue 实现绑卡的原理 Vue 实现绑卡功能通常涉及前端表单处理、数据绑定、验证以及和后端 API 的交互。以下是实现绑卡功能的核心原理和步骤: 数据绑定与表单处理 Vue 通过 v-model…

vue实现用户信息删除

vue实现用户信息删除

Vue 实现用户信息删除功能 在 Vue 中实现用户信息删除功能通常涉及前端界面交互和后端 API 调用。以下是实现步骤: 前端界面设计 创建删除按钮或操作项,通常使用 @click 事件触发删除…

vue实现一个标签选择

vue实现一个标签选择

Vue 标签选择组件实现 基础实现 使用 Vue 的 v-for 和 v-model 指令可以快速实现标签选择功能: <template> <div class="tag-se…

vue 实现

vue 实现

Vue 实现的基本步骤 安装 Vue.js 可以通过 npm 或 CDN 引入。使用 npm 安装适合大型项目,CDN 适合快速原型开发。 npm install vue 在 HTML 文件中引入…