当前位置: 首页 > web >正文

Vue Router 钩子函数与组件生命周期执行顺序详解

Vue Router 钩子函数与组件生命周期执行顺序详解

一、Vue Router 核心钩子函数分类

Vue Router 提供了三类路由守卫(钩子函数),用于控制导航流程:

1. 全局守卫

  • router.beforeEach(to, from, next):全局前置守卫,导航触发前全局执行(所有路由跳转都会触发)
  • router.beforeResolve(to, from, next):全局解析守卫,所有组件内守卫和异步路由组件加载完成后执行
  • router.afterEach(to, from):全局后置钩子,导航完成后执行(无 next 参数,不影响导航流程)

2. 路由独享守卫

  • beforeEnter(to, from, next):配置在路由对象中的守卫,仅当进入该路由时触发(优先级高于组件内守卫)

3. 组件内守卫

  • beforeRouteEnter(to, from, next)进入当前组件对应路由前触发(此时组件实例未创建,无法访问 this
  • beforeRouteUpdate(to, from, next)当前组件路由参数变化时触发(如从 /user/123 跳转到 /user/456
  • beforeRouteLeave(to, from, next)离开当前组件对应路由前触发(常用于阻止用户未保存时离开)

二、Vue 组件生命周期钩子(关键阶段)

组件生命周期与路由导航强相关的钩子如下(按执行顺序):

  • beforeCreate:实例初始化前(数据观测和事件配置之前)
  • created:实例初始化完成(数据观测和事件配置完成,未挂载 DOM)
  • beforeMount:挂载开始前($el 为虚拟 DOM)
  • mounted:挂载完成(真实 DOM 渲染完毕)
  • beforeUpdate:数据更新前(虚拟 DOM 重新渲染前)
  • updated:数据更新后(虚拟 DOM 重新渲染完成)
  • beforeUnmount:实例卸载前(清理定时器、事件监听器等)
  • unmounted:实例卸载完成(所有子组件已卸载)

三、完整执行顺序流程(场景化说明)

场景 1:首次进入新路由(从 A 路由跳转到 B 路由,B 组件未加载过)

执行顺序:

  1. 全局前置守卫 router.beforeEach(导航开始)
  2. 路由独享守卫 B路由.beforeEnter(若配置)
  3. 组件内守卫 B组件.beforeRouteEnter(进入 B 前)
  4. 解析守卫 router.beforeResolve(B 组件及依赖加载完成)
  5. 全局后置钩子 router.afterEach(导航完成)
  6. B 组件生命周期beforeCreatecreatedbeforeMountmounted(组件挂载)

场景 2:路由更新(当前组件不变,参数变化,如 /user/123/user/456

执行顺序:

  1. 全局前置守卫 router.beforeEach(导航开始)
  2. 路由独享守卫 当前路由.beforeEnter(若配置)
  3. 组件内守卫 当前组件.beforeRouteUpdate(参数变化时)
  4. 解析守卫 router.beforeResolve(确认导航)
  5. 全局后置钩子 router.afterEach(导航完成)
  6. 组件生命周期beforeUpdateupdated(组件更新)

场景 3:离开当前路由(从 B 路由跳转到 C 路由)

执行顺序:

  1. 组件内守卫 B组件.beforeRouteLeave(离开 B 前,常用于阻止未保存操作)
  2. 全局前置守卫 router.beforeEach(导航开始)
  3. C 路由相关守卫(重复场景 1 流程)
  4. B 组件生命周期beforeUnmountunmounted(B 组件卸载)

四、总结表格

阶段钩子函数/生命周期触发时机
导航开始router.beforeEach所有路由跳转前
进入目标路由前目标路由 beforeEnter仅目标路由配置时触发
组件加载前目标组件 beforeRouteEnter组件实例创建前
依赖解析完成router.beforeResolve所有组件和异步资源加载完成后
导航完成router.afterEach路由跳转成功后
组件挂载beforeCreatemounted首次进入路由时组件初始化
路由参数更新组件 beforeRouteUpdate同组件路由参数变化时
组件更新beforeUpdateupdated数据变化导致重新渲染时
离开当前路由当前组件 beforeRouteLeave离开前(可阻止导航)
组件卸载beforeUnmountunmounted路由跳转后原组件销毁时

http://www.xdnf.cn/news/9515.html

相关文章:

  • Ubuntu 系统grub日志级别设置
  • C#与 Prism 框架:构建模块化的 WPF 应用程序
  • 毫秒级数据采集的极致优化:如何用C#实现高性能、无冗余的实时文件写入?
  • 文档整合自动化
  • ASP.NET MVC添加新控制器示例
  • Android 缓存应用冻结器(Cached Apps Freezer)
  • 交换机环路故障分析以及解决方案
  • 模型自学推理:自信驱动进化
  • 使用JavaSDK简单上传文件到阿里云OSS服务中
  • GitHub开源|AI顶会论文中文翻译PDF合集(gpt-translated-pdf-zh)
  • 【AGI】Qwen3模型高效微调
  • Python生成ppt(python-pptx)N问N答(如何绘制一个没有背景的矩形框;如何绘制一个没有背景的矩形框)
  • 小提琴图绘制-Graph prism
  • 打破网络次元壁:NAT 穿透与内网打洞的 “Matrix 式” 通信革命
  • micromamba安装 配置 pythonocc安装
  • 智慧充电桩数字化管理平台:环境监测与动态数据可视化技术有哪些作用?
  • CentOS 7 如何安装libsndfile?
  • D2000平台上Centos使用mmap函数遇到的陷阱
  • 【机器学习基础】机器学习入门核心算法:隐马尔可夫模型 (HMM)
  • 【赵渝强老师】OceanBase的部署架构
  • 基于Qt的MCP LLM代理服务开发实战:从0到1扩展大语言模型
  • 本地(Linux)编译 MySQL 源码
  • Java高频面试之并发编程-23
  • FPGA实现CNN卷积层:高效窗口生成模块设计与验证
  • Transformer 通关秘籍11:Word2Vec 及工具的使用
  • 智能嗅探AJAX触发:机器学习在动态渲染中的创新应用
  • js中后台框架的增删改查要点
  • 影响沉金价格的因素如何体现在多层电路板制造上?
  • Eclipse 插件开发 5.2 编辑器 获取当前编辑器
  • C语言循环结构实战:while和for到底用哪个?