当前位置:首页 > VUE

vue路由拦截怎么实现

2026-01-22 14:33:28VUE

Vue路由拦截的实现方法

在Vue中,可以通过路由守卫(Navigation Guards)来实现路由拦截,主要用于权限控制、登录验证等场景。

全局前置守卫

使用router.beforeEach注册全局前置守卫,在路由跳转前进行拦截:

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

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

路由独享守卫

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

vue路由拦截怎么实现

const router = new VueRouter({
  routes: [
    {
      path: '/dashboard',
      component: Dashboard,
      beforeEnter: (to, from, next) => {
        if (!store.getters.isAuthenticated) {
          next('/login')
        } else {
          next()
        }
      }
    }
  ]
})

组件内守卫

在组件内部使用beforeRouteEnterbeforeRouteUpdatebeforeRouteLeave

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

全局解析守卫

使用router.beforeResolve注册全局守卫,在导航被确认前调用:

vue路由拦截怎么实现

router.beforeResolve((to, from, next) => {
  // 适合获取数据或执行其他异步操作
  next()
})

全局后置钩子

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

router.afterEach((to, from) => {
  // 适合分析、更改页面标题等操作
  document.title = to.meta.title || '默认标题'
})

路由元信息

配合路由元信息meta可以更灵活地控制权限:

const router = new VueRouter({
  routes: [
    {
      path: '/admin',
      component: Admin,
      meta: { requiresAuth: true, roles: ['admin'] }
    }
  ]
})

动态添加路由

通过router.addRoutes动态添加路由实现权限过滤:

// 过滤有权限的路由
const accessedRoutes = filterAsyncRoutes(asyncRoutes, roles)
router.addRoutes(accessedRoutes)

以上方法可以单独使用或组合使用,根据项目需求选择最合适的实现方式。路由守卫的执行顺序为:全局前置守卫→路由独享守卫→组件内守卫→全局解析守卫→全局后置钩子。

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

相关文章

vue 实现tabs

vue 实现tabs

Vue 实现 Tabs 组件的方法 使用动态组件和 v-for 在 Vue 中实现 Tabs 可以通过动态组件和 v-for 指令结合完成。定义一个 tabs 数组,包含每个标签的标题和对应的组件。…

vue实现ajax

vue实现ajax

Vue 中实现 AJAX 的几种方法 在 Vue 中实现 AJAX 请求可以通过原生 JavaScript 的 XMLHttpRequest、第三方库如 axios 或 fetch API 来完成。以…

vue实现增加

vue实现增加

实现 Vue 中的新增功能 在 Vue 中实现新增功能通常涉及数据绑定、表单处理和状态管理。以下是几种常见的实现方式: 数据绑定与列表渲染 通过 v-model 绑定表单输入,使用数组的 push…

vue 实现图片

vue 实现图片

Vue 实现图片加载与展示的方法 在 Vue 中实现图片加载和展示可以通过多种方式完成,以下是一些常见的方法: 使用 v-bind 绑定图片路径 通过 v-bind(或简写为 :)动态绑定图片的…

vue实现伸缩

vue实现伸缩

Vue实现伸缩功能的方法 使用CSS过渡和Vue的v-if或v-show 通过CSS的transition属性结合Vue的条件渲染指令(v-if或v-show)可以实现元素的伸缩效果。定义一个CSS类…

vue实现添加div

vue实现添加div

在 Vue 中动态添加 div 元素 使用 v-for 指令动态渲染 div 通过 v-for 可以基于数组数据动态生成多个 div 元素。在模板中绑定数组数据,Vue 会自动遍历数组并为每个元素创建…