当前位置:首页 > 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方案 使用WebRTC技术结合Vue框架可以构建多人视频通话应用。以下是核心实现方法: 技术栈选择 Vue 2/3作为前端框架 WebRTC用于实时通信 Socket.io…

vue实现防抖节流

vue实现防抖节流

Vue 中实现防抖(Debounce) 防抖的核心是延迟执行函数,在连续触发时取消前一次的调用,只执行最后一次。适用于输入框搜索、窗口大小调整等场景。 方法1:使用 Lodash 的 _.debou…

vue 实现简单登陆

vue 实现简单登陆

以下是一个使用 Vue 3 实现的简单登录功能示例,包含表单验证和基础交互逻辑: 创建 Vue 组件 <template> <div class="login-containe…

vue实现签约合作弹窗

vue实现签约合作弹窗

实现签约合作弹窗的步骤 使用Vue实现签约合作弹窗可以通过组件化方式完成,结合模态框和表单交互逻辑。以下是具体实现方法: 1. 创建弹窗组件 新建一个Vue组件文件(如SignContractDia…

vue实现3d宇宙

vue实现3d宇宙

Vue实现3D宇宙效果 使用Three.js库 Three.js是一个强大的JavaScript 3D库,可以轻松集成到Vue项目中。安装Three.js依赖: npm install three…

vue实现上移下移插件

vue实现上移下移插件

实现上移下移功能的 Vue 插件 在 Vue 中实现列表项的上移和下移功能,可以通过自定义指令或组件封装的方式完成。以下是两种常见实现方式: 基于数组操作的通用方法 通过操作数组索引实现元素位置交换…