vue路由导航守卫及前置后置钩子函数参数详解

本文详细介绍了Vue.js中路由守卫的使用方法,包括beforeEach和afterEach钩子函数的应用场景,展示了如何通过路由守卫实现页面跳转前后的权限验证及页面标题更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先构建一个测试demo如下图:

接着来探讨路由配置界面

import Vue from 'vue'
import Router from 'vue-router'
// import HelloWorld from '@/components/HelloWorld'

Vue.use(Router)

const router = new Router({
  routes: [{
    path: '/',
    name: 'HelloWorld',
    component: resolve => require(['@/components/HelloWorld'], resolve)
  }, {
    path: '/login',
    name: 'login',
    component: resolve => require(['@/components/login'], resolve)
  }, {
    path: '/navmenu',
    name: 'navMenu',
    component: resolve => require(['@/components/navMenu'], resolve),
    meta: {
      title: '查看钩子beforeEach作用',
      index: 2,
      login: true
    }
  }]
})

// 进入路由前方法勾子
router.beforeEach((to, from, next) => {
  console.log(to, '前置第一个参数')
  console.log(from, '前置第二个参数')
  console.log(next, '前置第三个参数')
  /
    to 目标路由
    from 源路由
    next 跳转到下一个路由
  */
  if (to.meta.login) {
    // 如果需要,则跳转到登录页
    next('/login');
  } else {
    // 如果不需要,则直接跳转到对应路由
    next();
  }
});
// 进入路由后方法勾子
router.afterEach((to, from) => {
  console.log(to, '后置第一个参数')
  console.log(from, '后置第二个参数')
  /*
    to 目标路由
    from 源路由
  */
  if (to.meta.title) {
    console.log(to.meta.title);
  } else {
    console.log('暂无名称');
  }
});


export default router

 可以见到控制台

当点击事件发生后(也就是第一个页面向第二个页面跳转后)

 

由此看出从第一个页面点击跳转后触发了两次前置钩子函数并且点击后校验是否需要登入直接进入login页面可用于后台管理权限控制页面是否需要登入权限,一次后置钩子函数;可以清楚看到里面的参数变化;

转载于:https://www.cnblogs.com/lhl66/p/9195787.html

<think>嗯,用户想了解Vue3中导航守卫的工作原理及用法,特别是beforeRouteEnter和beforeEach。首先,我需要回忆Vue3路由守卫的相关知识。记得导航守卫分为全局的、路由独享的和组件内的几种类型。用户提到的beforeEach是全局前置守卫,而beforeRouteEnter是组件内的守卫。 先得确定Vue3和Vue2在路由守卫上的区别。Vue3的Composition API可能会影响守卫的使用,但基本的钩子函数应该变化不大。比如,beforeEach仍然在全局使用,而beforeRouteEnter属于组件内的导航守卫,不过在Vue3中组件内守卫可能需要结合setup函数来使用吗?可能需要查证一下。 根据用户提供的引用内容,引用[3]提到Vue3路由守卫的六个核心钩子,包括全局前置守卫、解析守卫后置钩子路由独享守卫,以及组件进入、更新、离开守卫。这应该覆盖了用户的问题。beforeEach用于全局前置处理,比如权限验证,而beforeRouteEnter则是在组件被激活前执行,但无法访问组件实例,因为此时组件还没创建。 用户可能关心的是具体如何使用这些守卫。例如,全局守卫通过router.beforeEach注册,而组件内守卫则需要直接在组件的选项中定义。在Vue3的组合式API中,可能需要使用onBeforeRouteUpdate等函数,但用户的问题里没有提到组合式API,可能暂时不需要深入,除非用户有后续问题。 另外,需要注意beforeRouteEnter的特殊性,它支持给next传递回调来访问组件实例。这在Vue3中是否有所改变?根据引用[3]中的说明,Vue3的组件进入守卫用法类似,仍然可以通过next(vm => {})来访问实例。 还需要解释导航守卫的执行顺序。比如,当导航触发时,先调用全局的beforeEach,然后是路由配置中的beforeEnter,接着是组件内的beforeRouteEnter,最后是全局的beforeResolve和后置钩子afterEach。这样的顺序对用户理解流程很重要。 用户可能遇到的常见问题包括如何正确使用next函数,比如忘记调用next()导致导航挂起,或者在异步操作中如何处理。例如,在beforeEach中执行异步检查,必须确保调用next(),否则导航不会继续。 此外,权限验证导航守卫的典型应用场景,可以通过在全局前置守卫中检查用户登录状态,决定跳转到登录页还是允许进入。需要给出一个代码示例,展示router.beforeEach的基本用法,以及如何处理重定向。 对于beforeRouteEnter,由于在组件实例创建前调用,无法使用this,但可以通过next的回调获取实例。这在需要基于组件数据做处理时很有用,比如获取初始数据。 可能还需要提到导航守卫中的取消导航,例如在beforeEach中调用next(false),或者传递一个新的路由路径来重定向。 最后,总结注意事项,比如确保调用next,避免死循环,以及守卫的执行顺序。同时,生成相关问题,帮助用户进一步学习,比如性能优化、组件守卫Vue3的组合式API结合使用等。</think>### Vue3导航守卫工作原理及用法详解 #### 一、导航守卫核心作用 导航守卫Vue Router提供的**路由拦截机制**,可在路由跳转前后执行自定义逻辑,例如权限验证、数据预加载或埋点统计。其核心控制流程分为三个阶段: 1. **全局守卫**(影响所有路由) 2. **路由独享守卫**(特定路由配置) 3. **组件级守卫**(绑定在组件内) #### 二、核心守卫类型及用法 ##### 1. 全局前置守卫 `beforeEach` ```javascript const router = createRouter({...}) router.beforeEach((to, from, next) => { if (to.meta.requiresAuth && !isAuthenticated()) { next('/login') // 重定向到登录页 } else { next() // 放行导航 } }) ``` - **执行时机**:路由跳转**开始前** - **典型场景**:全局权限验证、登录状态检查 - **参数说明**: - `to`: 即将进入的目标路由对象 - `from`: 当前导航正要离开的路由 - `next`: 必须调用的**放行函数**,否则会阻塞导航[^3][^4] ##### 2. 组件内守卫 `beforeRouteEnter` ```javascript const UserDetails = { template: `...`, async beforeRouteEnter(to, from, next) { const data = await fetchUserData(to.params.id) next(vm => { vm.userData = data // 通过回调访问组件实例 }) } } ``` - **特殊限制**:此时组件实例**尚未创建**,无法使用`this` - **实例访问**:通过`next(callback)`访问创建后的实例 - **执行顺序**:在全局守卫之后、组件渲染前执行 #### 三、守卫执行流程示意图 $$ \begin{array}{ccc} \text{导航触发} & \rightarrow & \text{调用失活组件的} \\ & & \text{beforeRouteLeave} \\ & \downarrow & \\ \text{全局} & \rightarrow & \text{路由配置的} \\ \text{beforeEach} & \rightarrow & \text{beforeEnter} \\ & \downarrow & \\ \text{组件内} & \rightarrow & \text{全局} \\ \text{beforeRouteEnter} & \rightarrow & \text{beforeResolve} \\ & \downarrow & \\ \text{导航确认} & \rightarrow & \text{调用全局afterEach} \end{array} $$ #### 四、组合式API用法(Vue3特性) ```javascript import { onBeforeRouteLeave } from 'vue-router' export default { setup() { onBeforeRouteLeave((to, from) => { if (formDataChanged.value) { return confirm('确认离开?未保存数据将丢失') } }) } } ``` - **优势**:在`setup()`中使用更灵活 - **可用钩子**: - `onBeforeRouteUpdate` - `onBeforeRouteLeave` #### 五、注意事项 1. **next()必须调用**:漏写会导致导航卡死 2. **异步处理规范**: ```javascript router.beforeEach(async (to, from) => { await checkPermissions() // 正确写法 return true // 隐式调用next() }) ``` 3. **循环重定向检测**:避免在守卫中创建无限跳转循环
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值