在 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)
javascript
复制代码
export default {
// 初始化阶段:实例创建前后
beforeCreate() {
console.log("Vue 2: 实例创建前(props/data未初始化)");
},
created() {
console.log("Vue 2: 实例创建后(可访问props/data)");
this.initData(); // 可在此调用方法初始化数据
},
// 挂载阶段:DOM渲染前后
beforeMount() {
console.log("Vue 2: 即将挂载($el未生成)");
},
mounted() {
console.log("Vue 2: 已挂载(可操作DOM)");
this.$refs.myDiv.textContent = "挂载后更新DOM"; // 访问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 一致,降低迁移成本:
javascript
复制代码
export default {
// 初始化阶段:`setup`替代beforeCreate/created(若用选项式API,仍可写created,但推荐用setup)
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/unmounted)
beforeUnmount() {
console.log("Vue 3选项式: 即将卸载(替代beforeDestroy)");
clearInterval(this.timer);
},
unmounted() {
console.log("Vue 3选项式: 已卸载(替代destroyed)");
},
};
3. Vue 3(组合式 API,setup
中使用)
组合式 API 中,生命周期钩子需先导入 ,再在setup
内调用(通过回调函数注册逻辑),更适合按功能拆分代码(而非按生命周期阶段):
javascript
复制代码
import { onBeforeMount, onMounted, onBeforeUnmount } from "vue";
export default {
// setup执行时机:与Vue 2的beforeCreate/created一致,替代两者
setup() {
console.log("Vue 3组合式: 实例创建前后(替代beforeCreate/created)");
// 挂载前:注册onBeforeMount钩子
onBeforeMount(() => {
console.log("Vue 3组合式: 即将挂载");
});
// 挂载后:注册onMounted钩子
onMounted(() => {
console.log("Vue 3组合式: 已挂载(可操作DOM)");
});
// 卸载前:注册onBeforeUnmount钩子
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
中通过导入的钩子函数注册逻辑,更灵活高效。