当前位置:首页 > VUE

vue如何实现路由拦截

2026-02-20 16:21:25VUE

vue 实现路由拦截的方法

Vue 中可以通过路由守卫(Navigation Guards)实现路由拦截,主要分为全局守卫、路由独享守卫和组件内守卫三种方式。

全局前置守卫

使用 router.beforeEach 可以在路由跳转前进行拦截,常用于权限验证或登录状态检查。

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

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

路由独享守卫

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

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

组件内守卫

在组件内部通过 beforeRouteEnterbeforeRouteUpdatebeforeRouteLeave 实现拦截。

export default {
  beforeRouteEnter(to, from, next) {
    // 组件实例尚未创建,无法访问 `this`
    next(vm => {
      // 通过 `vm` 访问组件实例
    })
  },
  beforeRouteLeave(to, from, next) {
    // 离开路由时触发
    const answer = confirm('确定离开吗?')
    if (answer) next()
    else next(false)
  }
}

拦截逻辑常见场景

登录验证

检查用户是否登录,未登录则跳转到登录页。

router.beforeEach((to, from, next) => {
  const isPublic = to.matched.some(record => record.meta.public)
  const loggedIn = localStorage.getItem('user')

  if (!isPublic && !loggedIn) {
    return next('/login')
  }
  next()
})

权限控制

根据用户角色限制访问权限。

router.beforeEach((to, from, next) => {
  const requiredRole = to.meta.role
  const userRole = getUserRole()

  if (requiredRole && userRole !== requiredRole) {
    next('/forbidden')
  } else {
    next()
  }
})

页面离开确认

防止用户误操作导致数据丢失。

vue如何实现路由拦截

beforeRouteLeave(to, from, next) {
  if (this.formChanged) {
    if (confirm('未保存的更改将丢失,确定离开?')) {
      next()
    } else {
      next(false)
    }
  } else {
    next()
  }
}

注意事项

  • 确保始终调用 next(),否则路由会卡住
  • 异步操作需在完成后再调用 next()
  • 组件内守卫无法访问 this 时,可通过 next(vm => {}) 回调获取实例

通过合理组合这些守卫,可以实现复杂的路由拦截逻辑,满足各种业务场景需求。

分享给朋友:

相关文章

h5响应式布局如何实现

h5响应式布局如何实现

使用媒体查询(Media Queries) 通过CSS媒体查询针对不同屏幕尺寸设置不同的样式规则。例如: @media screen and (max-width: 768px) { .co…

vue如何实现

vue如何实现

Vue 实现方法 Vue 提供了多种方式来实现功能,具体取决于需求。以下是一些常见场景的实现方法: 数据绑定 使用 v-model 指令实现双向数据绑定,适用于表单输入元素。在组件中可以通过 pro…

vue如何实现tap

vue如何实现tap

Vue 中实现类似移动端 tap 事件的方法 在 Vue 中可以通过以下几种方式实现类似移动端 tap(轻触)事件的效果: 使用第三方库 安装 v-tap 指令库可以快速实现 tap 事件: np…

vue如何实现递归

vue如何实现递归

递归组件的实现方法 在Vue中实现递归组件通常用于渲染树形结构或嵌套数据。核心思路是组件在其模板中调用自身,但需注意终止条件以避免无限循环。 定义递归组件 组件需设置name选项,才能在模板中调用自…

vue实现路由动画

vue实现路由动画

路由动画的实现方法 在Vue中实现路由动画通常结合<transition>组件和Vue Router的导航守卫。以下是几种常见实现方式: 基础过渡动画 <template>…

vue如何实现uuid

vue如何实现uuid

生成 UUID 的方法 在 Vue 中生成 UUID 可以通过第三方库或原生 JavaScript 实现。以下是几种常见方法: 使用 uuid 库 安装 uuid 库: npm install u…