Vue 2 生命周期全景剖析

生命周期不是营销词汇,而是 Vue 2 运行时内部「可观测的执行链路」。掌握其精确时序,意味着能够在正确的时间点干预响应式系统、DOM 渲染与依赖收集,从而避免性能回退与内存泄漏。下文以源码级视角拆解八个阶段,并给出在大型应用中的工程级实践。

一、生命周期在运行时中的定位

Vue 2 将组件视为「可复用的响应式系统实例」。每个实例在内存中依次经历:

  1. 初始化
  2. 依赖收集与模板编译
  3. 首次渲染
  4. 运行时更新
  5. 销毁与回收

上述五个宏观阶段被细分为八个可注入钩子,允许开发者在不破坏内部状态机的前提下执行自定义逻辑。

二、八阶段钩子及其底层行为

1.beforeCreate

触发时机:initLifecycle 完成后,initEvents 之前。

此时响应式系统尚未建立,datapropsmethods 均不可访问。

用途:注入全局插件或运行时诊断。

2.created

触发时机:initState 完成,响应式追踪就绪,但 DOM 仍为空。

用途:

  • 发起 SSR 安全的异步数据请求
  • 注册非 DOM (WebSocket、定时器)

3.beforeMount

触发时机:render 函数已生成,虚拟 DOM 树就绪,即将执行首次 patch。

用途:在真实 DOM 挂载前修改渲染输出。

4.mounted

触发时机:patch 完成,DOM 已插入文档流,$el 可访问。

用途:

  • 执行原生 DOM 操作(第三方图表、滚动容器初始化)
  • 触发 nextTick 以获取布局信息

注意:子组件 mounted 先于父组件执行,因为 patch 是自下而上的深度优先遍历。

5.beforeUpdate

触发时机:响应式数据变更导致虚拟 DOM 重新渲染之前。

用途:手动记录滚动位置或表单状态,禁止在此发起网络请求。

6.updated

触发时机:虚拟 DOM diff & patch 完成,DOM 已同步。

用途:执行依赖 DOM 尺寸的副作用。

禁止在此钩子内再次修改响应式数据,否则可能触发无限循环更新。

7.beforeDestroy

触发时机:组件实例开始拆解,侦听器、子组件、指令尚未卸载。

用途:移除全局事件总线监听、终止轮询或长连接。

js 复制代码
beforeDestroy() {
  clearInterval(this.pollTimer);
  this.$eventBus.$off('global-event', this.handleEvent);
  if (this.chart) {
    this.chart.dispose(); // 第三方实例需手动销毁
  }
}

确保在 destroyed 之前解除所有外部引用,防止闭包或全局事件导致的游离 DOM 与内存泄漏。

8.destroyed

触发时机:实例、DOM、指令、子组件完全解耦,仅剩空壳 $el

用途:在内存分析工具中标记回收点,通知父级缓存池释放引用。

三、首屏加载时的钩子执行序列

访问应用根路由时,根组件与所有同步子组件按以下顺序触发:

  1. 根 beforeCreate
  2. 根 created
  3. 根 beforeMount
  4. 子树递归 → 各级子组件 beforeCreate → created → beforeMount
  5. 子树 mounted 自底向上
  6. 根 mounted

该序列保证父组件可在 mounted 安全地访问子组件 DOM。

四、父子组件更新时序

  • 父数据变更:父 beforeUpdate → 子 beforeUpdate → 子 updated → 父 updated
  • 子数据变更:子 beforeUpdate → 子 updated(父组件未受影响)

父组件可在 updated 中聚合子组件最新 DOM 状态,而不会被自己无关的更新打断。

五、工程级落地口诀

  • 异步数据预拉取:created
  • DOM 尺寸测量:mounted + nextTick
  • 列表滚动记忆:beforeUpdate
  • 全局事件清理:beforeDestroy

牢记「初始化自上而下、更新自下而上、销毁自上而下」的三条时序规则,便能在任何规模的应用中精准插入副作用、避免冗余渲染、防止内存泄漏。

相关推荐
benbenAItalk7 小时前
数字人口播视频的批量生产实践:素材规范、任务编排与质量验收
java·前端·音视频
2601_962885728 小时前
如何用 Python 扫描 A 股跳空缺口并统计缺口回补概率?
java·前端·python
西瓜太郎12348 小时前
Claude Code、Codex CLI、Gemini CLI 能否共用一枚 Key?先看协议选择矩阵
前端·api 网关·claude code·gemini cli·codex cli
怕浪猫8 小时前
长会话不崩盘:DeepSeek Harness 的上下文压缩与目标管理策略
面试·github·agent
ocean21038 小时前
2025-2026年Python面试高频知识点洞察
开发语言·python·面试·python八股文
陈随易10 小时前
在Finch用了62亿词元,我认为这是新一代Agent工具之神
前端·人工智能·后端
letisgo510 小时前
JAVA 高级进阶07篇《@Transactional失效的8个场景:代理机制到传播行为》
java·面试·transactional·spring事务·aop动态代理
水域安全老周10 小时前
水趣钓鱼救生衣专利拆解:两级锁紧如何解决落水人衣分离
java·前端·网络
计算机魔术师11 小时前
Anthropic CEO突然喊踩刹车,OpenAI罕见力挺:AI这辆车不能只踩油门了
前端
wing9811 小时前
从codex转战workbuddy使用一周的感受
前端·人工智能·后端