Vue Router 路由守卫:beforeEach vs beforeRouteEnter

Vue Router 路由守卫:beforeEach vs beforeRouteEnter

一、全局前置守卫 beforeEach

  1. 核心作用
    在所有路由跳转前 执行,用于全局拦截逻辑(如权限校验、登录验证)。
  2. 代码示例
// router/index.js
import Vue from 'vue';
import Router from 'vue-router';

Vue.use(Router);

const router = new Router({
  routes: [
    // 路由配置...
  ]
});

// 全局前置守卫
router.beforeEach((to, from, next) => {
  // 1. 判断目标路由是否需要登录
  if (to.meta.requiresAuth) {
    // 2. 检查用户是否已登录
    const token = localStorage.getItem('token');
    if (!token) {
      // 未登录,重定向到登录页
      next({ path: '/login', query: { redirect: to.fullPath } });
    } else {
      // 已登录,允许访问
      next();
    }
  } else {
    next();
  }
});
  1. 关键特性
特性描述
触发时机所有路由跳转前(包括同一路径的复用)
访问组件实例❌ 无(无法通过 this 访问组件)
典型场景登录校验、权限控制、页面埋点统计

二、组件内守卫 beforeRouteEnter

  1. 核心作用
    在 进入特定组件前 执行,用于组件级数据预加载或状态初始化。
  2. 代码示例
// UserProfile.vue
<template>
  <div>
    <h1>{{ user.name }}</h1>
  </div>
</template>

<script>
import axios from 'axios';

export default {
  data() {
    return {
      user: null
    };
  },
  beforeRouteEnter(to, from, next) {
    // 1. 根据路由参数获取用户ID
    const userId = to.params.id;
    
    // 2. 发起API请求
    axios.get(`/api/users/${userId}`).then(response => {
      // 3. 通过回调函数将数据传递给组件实例
      next(vm => {
        vm.user = response.data;
      });
    }).catch(error => {
      // 4. 请求失败则取消导航
      next(false);
    });
  }
};
</script>
  1. 关键特性
特性描述
触发时机仅首次进入该组件对应的路由时触发(组件复用时不触发)
访问组件实例✅ 通过 next(vm => { … }) 访问组件实例
典型场景数据预加载、动态路由参数初始化、组件状态依赖路由参数

三、两者对比表

对比项beforeEachbeforeRouteEnter
触发时机仅首次进入该组件对应的路由时触发(组件复用时不触发)
访问组件实例✅ 通过 next(vm => { … }) 访问组件实例
典型场景数据预加载、动态路由参数初始化、组件状态依赖路由参数

四、执行流程示意图

全局 beforeEach
目标路由匹配?
重定向/取消导航
组件内 beforeRouteEnter
数据加载完成?
取消导航
全局 beforeResolve
渲染组件

五、最佳实践指南

  1. 选择原则
  • 优先用 beforeEach:处理全局通用逻辑(如登录校验)
  • 使用 beforeRouteEnter:处理组件依赖的路由参数(如用户ID)
  1. 注意事项
  • 必调用 next():否则会导致路由卡死
  • 异步操作处理:
// 正确写法
beforeRouteEnter(to, from, next) {
  setTimeout(() => {
    next();
  }, 1000);
}

// 错误写法(会导致死循环)
beforeRouteEnter(to, from, next) {
  next();
}
  1. 组件复用场景:
  • 复用组件时不会触发 beforeRouteEnter
  • 需要监听参数变化时改用 beforeRouteUpdate

六、延伸学习

  1. Vue Router 官方文档
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值