当前位置:首页 > VUE

vue导航守卫实现使用

2026-02-24 18:39:16VUE

全局前置守卫(beforeEach)

在 Vue Router 中,beforeEach 是最常用的全局前置守卫。它在路由跳转前触发,适用于权限验证、登录状态检查等场景。

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

router.beforeEach((to, from, next) => {
  // to: 即将进入的目标路由对象
  // from: 当前导航正要离开的路由
  // next: 必须调用该方法来 resolve 这个钩子
  if (to.meta.requiresAuth && !isAuthenticated()) {
    next('/login')
  } else {
    next()
  }
})

路由独享守卫(beforeEnter)

可以在路由配置中直接定义 beforeEnter 守卫,仅对该路由生效。

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

组件内守卫

Vue 组件内可以定义以下导航守卫:

  • 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) {
    if (this.hasUnsavedChanges) {
      if (confirm('有未保存的更改,确定离开?')) {
        next()
      } else {
        next(false)
      }
    } else {
      next()
    }
  }
}

全局后置钩子(afterEach)

全局后置钩子不会接受 next 函数,也不会改变导航本身,常用于页面访问统计等场景。

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

导航解析流程

完整的导航解析流程如下:

vue导航守卫实现使用

  1. 导航被触发
  2. 调用失活组件的 beforeRouteLeave
  3. 调用全局的 beforeEach
  4. 在重用的组件里调用 beforeRouteUpdate
  5. 调用路由配置里的 beforeEnter
  6. 解析异步路由组件
  7. 在被激活的组件里调用 beforeRouteEnter
  8. 调用全局的 afterEach
  9. 触发 DOM 更新

注意事项

  • 确保总是调用 next(),否则钩子不会被 resolved
  • beforeRouteEnter 是唯一支持给 next 传递回调的守卫
  • 后置钩子不会改变导航行为,仅用于辅助操作
  • 对于需要鉴权的路由,建议使用路由元信息(meta)配合全局守卫实现

标签: vue
分享给朋友:

相关文章

vue实现走势图

vue实现走势图

Vue 实现走势图的方法 使用 ECharts 库 ECharts 是一个强大的数据可视化库,支持多种图表类型,包括走势图(折线图)。在 Vue 项目中可以通过 vue-echarts 封装库或直接使…

vue实现autocomplete

vue实现autocomplete

Vue 实现 Autocomplete 功能 Vue 中实现 Autocomplete(自动完成)功能可以通过自定义组件或使用现有库完成。以下是几种常见方法: 方法一:使用 Vue 原生实现 创建…

vue实现横滚

vue实现横滚

Vue 实现横滚效果 横滚效果通常指水平滚动内容,常见于轮播图、横向导航栏等场景。以下是几种实现方式: 使用 CSS 和 Vue 结合 通过 CSS 的 overflow-x 和 white-spa…

vue实现keepalive

vue实现keepalive

Vue 中实现 keep-alive 在 Vue 中,keep-alive 是一个内置组件,用于缓存动态组件或组件的状态,避免重复渲染和销毁。以下是实现 keep-alive 的几种方法: 基本用法…

vue导航实现

vue导航实现

Vue 导航实现方法 在 Vue 中实现导航功能通常涉及路由配置、组件设计和状态管理。以下是几种常见的实现方式: 使用 Vue Router 实现基础导航 安装 Vue Router: npm i…

vue实现子表格

vue实现子表格

Vue 实现子表格的方法 在 Vue 中实现子表格可以通过多种方式完成,以下是几种常见的方法: 使用嵌套组件 创建一个父表格组件和一个子表格组件,通过 props 将数据传递给子表格组件。父表格的每…