Vue 的生命周期是指 Vue 实例从创建到销毁的整个过程。在这个过程中,Vue 提供了一系列的生命周期钩子函数,允许开发者在特定的阶段执行自定义逻辑。这些钩子函数可以帮助我们更好地控制组件的行为,例如初始化数据、操作 DOM、发送网络请求等。
以下是 Vue 2 和 Vue 3 中的生命周期钩子及其对应的执行顺序和用途:
Vue 生命周期的阶段
Vue 的生命周期可以分为以下几个主要阶段:
- 实例初始化:Vue 实例被创建。
- 模板编译:Vue 解析模板并生成虚拟 DOM。
- 挂载:将虚拟 DOM 渲染为真实 DOM 并插入到页面中。
- 更新:当数据发生变化时,重新渲染视图。
- 销毁:Vue 实例被销毁,清理相关资源。
Vue 2 生命周期钩子
1. 创建阶段
beforeCreate
:
-
- 在实例初始化之后、数据观测 (data observer) 和事件/生命周期配置之前调用。
- 此时无法访问
data
、methods
和computed
等属性。 - 适用场景:通常用于初始化非响应式的数据或第三方库。
created
:
-
- 在实例创建完成后调用,此时已完成数据观测、属性和方法的初始化。
- 可以访问
data
、methods
和computed
,但尚未挂载到 DOM。 - 适用场景:适合发起 API 请求、初始化数据等操作。
2. 挂载阶段
beforeMount
:
-
- 在挂载开始之前调用,此时模板已编译完成,但尚未将虚拟 DOM 渲染到页面上。
- 适用场景:可以在挂载前对模板进行最后的修改。
mounted
:
-
- 在实例挂载完成后调用,此时真实的 DOM 已经渲染到页面上。
- 可以通过
this.$el
访问真实的 DOM 元素。 - 适用场景:适合操作 DOM、初始化第三方插件(如图表、地图等)。
3. 更新阶段
beforeUpdate
:
-
- 在数据更新导致 DOM 重新渲染之前调用。
- 此时数据已经更新,但 DOM 尚未重新渲染。
- 适用场景:可以在更新前对数据进行额外处理。
updated
:
-
- 在数据更新导致 DOM 重新渲染完成后调用。
- 此时 DOM 已经更新为最新的状态。
- 适用场景:适合在 DOM 更新后执行某些操作,但要避免在此处修改数据,否则可能导致无限循环。
4. 销毁阶段
beforeDestroy
:
-
- 在实例销毁之前调用,此时实例仍然完全可用。
- 适用场景:适合清理定时器、事件监听器等资源。
destroyed
:
-
- 在实例销毁完成后调用,此时所有的绑定和事件监听器已被移除。
- 适用场景:确保所有资源都已释放。
Vue 3 生命周期钩子
Vue 3 对生命周期钩子进行了简化,并引入了组合式 API (setup
),但选项式 API 的生命周期钩子依然可用。以下是 Vue 3 的生命周期钩子名称及其与 Vue 2 的对应关系:
Vue 2 钩子 | Vue 3 钩子 | 组合式 API |
| - | 在 |
| - | 在 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
组合式 API 示例
在 Vue 3 中,可以使用组合式 API 来注册生命周期钩子。例如:
import { onMounted, onUnmounted } from 'vue';
export default {
setup() {
onMounted(() => {
console.log('组件已挂载');
});
onUnmounted(() => {
console.log('组件已卸载');
});
}
};
生命周期钩子的执行顺序
以下是 Vue 实例的生命周期钩子执行顺序(以 Vue 2 为例):
- 创建阶段:
-
beforeCreate
created
- 挂载阶段:
-
beforeMount
mounted
- 更新阶段(当数据变化时):
-
beforeUpdate
updated
- 销毁阶段:
-
beforeDestroy
destroyed
适用场景总结
钩子 | 适用场景 |
| 初始化非响应式数据或第三方库。 |
| 发起 API 请求、初始化数据、设置事件监听器等。 |
| 在挂载前对模板进行最后的修改。 |
| 操作 DOM、初始化第三方插件(如图表、地图等)。 |
| 在数据更新前对数据进行额外处理。 |
| 在 DOM 更新后执行某些操作,但避免修改数据。 |
| 清理定时器、事件监听器等资源。 |
| 确保所有资源都已释放。 |
注意事项
- 避免在
updated
中修改数据:
-
- 如果在
updated
中修改数据,可能会导致无限循环的更新。
- 如果在
- 异步操作的时机:
-
- 在
mounted
中执行异步操作(如 API 请求)时,确保组件的状态能够正确更新。
- 在
- 性能优化:
-
- 在
beforeDestroy
或onBeforeUnmount
中清理不必要的资源,避免内存泄漏。
- 在
通过理解 Vue 的生命周期,你可以更高效地组织代码,确保组件在每个阶段都能正确运行。如果有其他问题,请随时告诉我!