1. 项目概述与核心价值
聊到Vue2,生命周期绝对是一个绕不开的核心话题。无论你是刚入门的新手,还是已经写过几个项目的中级开发者,对生命周期的理解深度,直接决定了你能否写出健壮、高效、易于维护的Vue组件。很多人觉得生命周期就是几个钩子函数,照着文档调用就行,但真正在复杂业务场景里踩过坑的都知道,这里面门道可不少。比如,为什么我 created 里拿不到DOM? mounted 就一定安全吗?父子组件嵌套时,生命周期到底谁先谁后?数据更新时, beforeUpdate 和 updated 该怎么用才不踩坑?这些问题,光看API文档那几句描述,是很难彻底搞明白的。
这个内容,就是要把Vue2的生命周期掰开了、揉碎了讲清楚。我们不只停留在“是什么”,更要深挖“为什么”和“怎么用”。我会结合一张经典的周期图示,带你从宏观上把握整个流程;然后,我们会深入到每一个钩子函数内部,用实际的代码演示数据、DOM、组件实例在不同阶段的具体状态和变化;最后,也是最重要的,我会分享大量在实际项目中总结出来的使用技巧、常见陷阱以及性能优化点。无论你是想夯实基础,还是希望解决项目中遇到的具体难题,相信都能从这里找到答案。
2. Vue2生命周期全景图与核心阶段划分
要理解生命周期,首先得有一张全局地图。Vue2的生命周期可以清晰地划分为四个核心阶段: 创建(Creation) 、 挂载(Mounting) 、 更新(Updating) 和 销毁(Destruction) 。每个阶段都包含了一个或多个特定的“钩子函数”(Lifecycle Hooks),Vue会在运行到对应节点时自动调用它们,为我们提供了介入组件关键过程的时机。
2.1 生命周期全景图示解析
下面这张图是理解Vue2生命周期的基石,它描绘了一个组件从诞生到消亡的完整旅程:
(图示说明:一个从`new Vue()`开始的流程图)
初始化事件 & 生命周期
|
v
beforeCreate
|
v
初始化注入 & 响应性 (init injections & reactivity)
|
v
created
|
v
(判断是否有`el`选项或调用`$mount`)
|
v
(判断是否有`template`选项)
|
v
编译模板/渲染函数 (compile template/render function)
|
v
beforeMount
|
v
创建`vm.$el`并用其替换`el` (create vm.$el and replace “el” with it)
|
v
mounted
|
v
┌─────────┐
│ │
v │ (当数据变化时)
beforeUpdate │
| │
v │
updated │
| │
└─────────┘
|
v (当调用`vm.$destroy()`时)
beforeDestroy
|
v
拆卸观察者、子组件和事件监听器 (teardown watchers, child components, event listeners)
|
v
destroyed
这张图需要你重点关注几条关键路径和节点:
- 响应式数据何时就绪? 注意
init injections & reactivity这一步发生在beforeCreate之后,created之前。这意味着在beforeCreate里,你 还无法访问 到data、computed、methods等选项。而到了created,这些都已经初始化完毕,但DOM还未生成。 - DOM何时可用?
mounted钩子被调用时,Vue已经将编译好的模板替换了指定的el元素,所以在这里你 可以安全地操作DOM 。beforeMount则在DOM挂载之前,此时模板已编译,但尚未转化为真实的DOM节点并插入页面。 - 更新循环如何触发? 当组件依赖的响应式数据发生变化时,会进入更新阶段。
beforeUpdate在虚拟DOM重新渲染和打补丁 之前 调用,此时数据已更新,但视图还未同步。updated则在虚拟DOM重新渲染和打补丁 之后 调用,此时视图已与数据同步。 - 清理工作何时进行?
beforeDestroy是组件销毁前的最后机会,你可以在这里移除定时器、取消网络请求、解绑自定义事件等。destroyed调用时,组件实例的所有指令都已解绑,所有事件监听器都已移除,所有子实例也已被销毁。
2.2 八大钩子函数的核心职责速览
根据图示,我们把八个主要的生命周期钩子按阶段归类,并明确其核心职责:
| 阶段 | 钩子函数 | 调用时机 | 核心职责与常见操作 |
|---|---|---|---|
| 创建 | beforeCreate |
实例初始化之后,数据观测和事件配置之前。 | 此时 data 、 methods 等均未初始化。可用于一些不依赖数据的插件初始化。 |
created |
实例创建完成,数据观测、属性和方法的运算已完成。 | 数据已可访问 ,但DOM未生成。常用于发起异步请求、初始化非响应式变量。 | |
| 挂载 | beforeMount |
挂载开始之前,相关的 render 函数首次被调用。 |
在此钩子中,模板已编译为渲染函数,但尚未将虚拟DOM转为真实DOM并挂载。 |
mounted |
实例被挂载到DOM后调用。 | DOM已可用 。常用于操作DOM、集成第三方库(如图表、地图)、发送依赖于DOM的请求。 | |
| 更新 | beforeUpdate |
数据更新时,虚拟DOM重新渲染和打补丁之前。 | 数据已改变,但视图未更新。可用于在更新前访问现有的DOM状态(如滚动位置)。 |


1387

被折叠的 条评论
为什么被折叠?



