在 Vue 2 和 Vue 3 中,生命周期钩子的核心作用一致——用于在组件不同阶段(如初始化、渲染、更新、销毁等)执行特定逻辑,但两者在命名规则、组合式 API 中的使用方式以及部分钩子的拆分/调整上存在明显区别。以下从核心区别、具体钩子对应关系和使用示例三方面详细说明:
一、核心区别
维度 | Vue 2(选项式 API) | Vue 3(选项式 API / 组合式 API) |
---|
命名规则 | 以before /after +动作命名,如beforeCreate 、mounted 。 | 选项式 API 中保留大部分 Vue 2 命名(仅调整 2 个);组合式 API 中需通过on +生命周期名调用(如onMounted )。 |
钩子数量 | 11 个核心钩子(含activated /deactivated 等 keep-alive 相关)。 | 基础钩子逻辑一致,拆分了beforeDestroy /destroyed ,新增setup 替代beforeCreate /created 。 |
组合式 API 支持 | 不支持(仅选项式 API)。 | 组合式 API 中需在setup 内通过导入的钩子函数注册(如onMounted(() => { ... }) ),更灵活。 |
销毁阶段钩子 | beforeDestroy (销毁前)、destroyed (销毁后)。 | 重命名为beforeUnmount (卸载前)、unmounted (卸载后),语义更准确(“卸载”替代“销毁”)。 |
初始化阶段 | beforeCreate (实例创建前)、created (实例创建后)。 | 这两个钩子的逻辑被setup 替代(setup 执行时机与两者一致,且无需手动调用)。 |
二、生命周期钩子对应关系(Vue 2 → Vue 3)
1. 基础生命周期(初始化、渲染、更新、卸载)
阶段 | Vue 2(选项式 API) | Vue 3(选项式 API) | Vue 3(组合式 API,需导入调用) | 作用说明 |
---|
实例初始化 | beforeCreate | 被setup 替代 | 被setup 替代 | 组件实例创建前(未初始化 props、data);Vue 3 中setup 在此阶段执行,替代两者功能。 |
| created | 被setup 替代 | 被setup 替代 | 组件实例创建后(已初始化 props、data);setup 同样覆盖此阶段逻辑。 |
DOM 挂载 | beforeMount | beforeMount (不变) | onBeforeMount | 模板编译完成,即将挂载到 DOM 前(此时$el 未生成)。 |
| mounted | mounted (不变) | onMounted | 组件已挂载到 DOM(可访问 DOM 元素,如document.getElementById )。 |
数据更新 | beforeUpdate | beforeUpdate (不变) | onBeforeUpdate | 数据更新后,DOM 重新渲染前(可获取更新前的 DOM 状态)。 |
| updated | updated (不变) | onUpdated | DOM 已完成重新渲染(可获取更新后的 DOM 状态,需避免在此修改数据导致死循环)。 |
组件卸载 | beforeDestroy | beforeUnmount (重命名) | onBeforeUnmount | 组件即将卸载前(可清理定时器、事件监听等,避免内存泄漏)。 |
| destroyed | unmounted (重命名) | onUnmounted | 组件已卸载(所有子组件也已卸载,DOM 元素已移除)。 |
2. keep-alive 相关生命周期(缓存组件)
Vue 2(选项式 API) | Vue 3(选项式 API) | Vue 3(组合式 API) | 作用说明 |
---|
activated | activated (不变) | onActivated | 组件被keep-alive 缓存后激活时触发(第一次挂载和从缓存中恢复时)。 |
deactivated | deactivated (不变) | onDeactivated | 组件被keep-alive 缓存后失活时触发(离开组件且被缓存时,非卸载)。 |
3. 错误捕获生命周期
Vue 2(选项式 API) | Vue 3(选项式 API) | Vue 3(组合式 API) | 作用说明 |
---|
无(需通过errorCaptured 钩子) | errorCaptured (不变) | onErrorCaptured | 捕获子组件抛出的错误(返回false 可阻止错误继续向上传播)。 |
无 | renderTracked | onRenderTracked | (调试用)响应式依赖被追踪时触发(仅开发环境有效)。 |
无 | renderTriggered | onRenderTriggered | (调试用)响应式依赖被触发更新时触发(仅开发环境有效)。 |
三、使用示例(Vue 2 vs Vue 3)
1. Vue 2(仅选项式 API)
export default {beforeCreate() {console.log("Vue 2: 实例创建前(props/data未初始化)");},created() {console.log("Vue 2: 实例创建后(可访问props/data)");this.initData(); },beforeMount() {console.log("Vue 2: 即将挂载($el未生成)");},mounted() {console.log("Vue 2: 已挂载(可操作DOM)");this.$refs.myDiv.textContent = "挂载后更新DOM"; },beforeUpdate() {console.log("Vue 2: DOM更新前(可获取旧DOM)");},updated() {console.log("Vue 2: DOM更新后(可获取新DOM)");},beforeDestroy() {console.log("Vue 2: 即将销毁(清理定时器/事件)");clearInterval(this.timer); },destroyed() {console.log("Vue 2: 已销毁(组件完全移除)");},methods: {initData() {},},
};
2. Vue 3(选项式 API,兼容 Vue 2 写法)
Vue 3 的选项式 API 对生命周期钩子的改动极小,主要是销毁阶段钩子重命名,其他用法与 Vue 2 一致,降低迁移成本:
export default {created() {console.log("Vue 3选项式: 实例创建后(与Vue 2行为一致)");},beforeMount() {console.log("Vue 3选项式: 即将挂载");},mounted() {console.log("Vue 3选项式: 已挂载(可操作DOM)");},beforeUpdate() {console.log("Vue 3选项式: DOM更新前");},updated() {console.log("Vue 3选项式: DOM更新后");},beforeUnmount() {console.log("Vue 3选项式: 即将卸载(替代beforeDestroy)");clearInterval(this.timer);},unmounted() {console.log("Vue 3选项式: 已卸载(替代destroyed)");},
};
3. Vue 3(组合式 API,setup
中使用)
组合式 API 中,生命周期钩子需先导入,再在setup
内调用(通过回调函数注册逻辑),更适合按功能拆分代码(而非按生命周期阶段):
import { onBeforeMount, onMounted, onBeforeUnmount } from "vue";export default {setup() {console.log("Vue 3组合式: 实例创建前后(替代beforeCreate/created)");onBeforeMount(() => {console.log("Vue 3组合式: 即将挂载");});onMounted(() => {console.log("Vue 3组合式: 已挂载(可操作DOM)");});onBeforeUnmount(() => {console.log("Vue 3组合式: 即将卸载(清理资源)");clearInterval(timer);});const timer = setInterval(() => {console.log("定时器运行中...");}, 1000);},
};
四、总结
- 核心逻辑不变:无论是 Vue 2 还是 Vue 3,生命周期的核心阶段(初始化、挂载、更新、卸载)和钩子的作用本质一致,只是命名和使用方式调整。
- Vue 3 的优化:
- 用
setup
统一初始化逻辑,简化代码; - 销毁阶段钩子重命名为“卸载”(
beforeUnmount
/unmounted
),语义更清晰; - 组合式 API 中通过
onXxx
函数注册钩子,支持按功能拆分代码(如“数据请求+DOM 操作”可放在同一个onMounted
中,无需分散在选项式的不同钩子)。
- 迁移建议:若从 Vue 2 迁移到 Vue 3,选项式 API 只需将
beforeDestroy
/destroyed
改为beforeUnmount
/unmounted
;若使用组合式 API,需习惯在setup
中通过导入的钩子函数注册逻辑,更灵活高效。