当前位置: 首页 > news >正文

vue2 和 vue3 生命周期的区别

在 Vue 2 和 Vue 3 中,生命周期钩子的核心作用一致——用于在组件不同阶段(如初始化、渲染、更新、销毁等)执行特定逻辑,但两者在命名规则组合式 API 中的使用方式以及部分钩子的拆分/调整上存在明显区别。以下从核心区别、具体钩子对应关系和使用示例三方面详细说明:

一、核心区别

维度Vue 2(选项式 API)Vue 3(选项式 API / 组合式 API)
命名规则before/after+动作命名,如beforeCreatemounted选项式 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,需导入调用)作用说明
实例初始化beforeCreatesetup替代setup替代组件实例创建前(未初始化 props、data);Vue 3 中setup在此阶段执行,替代两者功能。
createdsetup替代setup替代组件实例创建后(已初始化 props、data);setup同样覆盖此阶段逻辑。
DOM 挂载beforeMountbeforeMount(不变)onBeforeMount模板编译完成,即将挂载到 DOM 前(此时$el未生成)。
mountedmounted(不变)onMounted组件已挂载到 DOM(可访问 DOM 元素,如document.getElementById)。
数据更新beforeUpdatebeforeUpdate(不变)onBeforeUpdate数据更新后,DOM 重新渲染前(可获取更新前的 DOM 状态)。
updatedupdated(不变)onUpdatedDOM 已完成重新渲染(可获取更新后的 DOM 状态,需避免在此修改数据导致死循环)。
组件卸载beforeDestroybeforeUnmount(重命名)onBeforeUnmount组件即将卸载前(可清理定时器、事件监听等,避免内存泄漏)。
destroyedunmounted(重命名)onUnmounted组件已卸载(所有子组件也已卸载,DOM 元素已移除)。
2. keep-alive 相关生命周期(缓存组件)
Vue 2(选项式 API)Vue 3(选项式 API)Vue 3(组合式 API)作用说明
activatedactivated(不变)onActivated组件被keep-alive缓存后激活时触发(第一次挂载和从缓存中恢复时)。
deactivateddeactivated(不变)onDeactivated组件被keep-alive缓存后失活时触发(离开组件且被缓存时,非卸载)。
3. 错误捕获生命周期
Vue 2(选项式 API)Vue 3(选项式 API)Vue 3(组合式 API)作用说明
无(需通过errorCaptured钩子)errorCaptured(不变)onErrorCaptured捕获子组件抛出的错误(返回false可阻止错误继续向上传播)。
renderTrackedonRenderTracked(调试用)响应式依赖被追踪时触发(仅开发环境有效)。
renderTriggeredonRenderTriggered(调试用)响应式依赖被触发更新时触发(仅开发环境有效)。

三、使用示例(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(); // 可在此调用方法初始化数据},// 挂载阶段: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 一致,降低迁移成本:

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内调用(通过回调函数注册逻辑),更适合按功能拆分代码(而非按生命周期阶段):

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);},
};

四、总结

  1. 核心逻辑不变:无论是 Vue 2 还是 Vue 3,生命周期的核心阶段(初始化、挂载、更新、卸载)和钩子的作用本质一致,只是命名和使用方式调整。
  2. Vue 3 的优化
    • setup统一初始化逻辑,简化代码;
    • 销毁阶段钩子重命名为“卸载”(beforeUnmount/unmounted),语义更清晰;
    • 组合式 API 中通过onXxx函数注册钩子,支持按功能拆分代码(如“数据请求+DOM 操作”可放在同一个onMounted中,无需分散在选项式的不同钩子)。
  3. 迁移建议:若从 Vue 2 迁移到 Vue 3,选项式 API 只需将beforeDestroy/destroyed改为beforeUnmount/unmounted;若使用组合式 API,需习惯在setup中通过导入的钩子函数注册逻辑,更灵活高效。
http://www.xdnf.cn/news/1369531.html

相关文章:

  • 一篇文章拆解Java主流垃圾回收器及其调优方法。
  • LeetCode-22day:多维动态规划
  • 代码随想录Day62:图论(Floyd 算法精讲、A * 算法精讲、最短路算法总结、图论总结)
  • vue2和vue3的对比
  • TensorFlow 深度学习:使用 feature_column 训练心脏病分类模型
  • Day3--HOT100--42. 接雨水,3. 无重复字符的最长子串,438. 找到字符串中所有字母异位词
  • CentOS 7 服务器初始化:从 0 到 1 的安全高效配置指南
  • 肌肉力量训练
  • 木马免杀工具使用
  • 产品经理操作手册(3)——产品需求文档
  • 全链路营销增长引擎闭门会北京站开启倒计时,解码营销破局之道
  • 构建生产级 RAG 系统:从数据处理到智能体(Agent)的全流程深度解析
  • 书生大模型InternLM2:从2.6T数据到200K上下文的开源模型王者
  • word批量修改交叉引用颜色
  • 【SystemUI】新增实体键盘快捷键说明
  • 常用Nginx正则匹配规则
  • ruoyi-vue(十二)——定时任务,缓存监控,服务监控以及系统接口
  • 软件检测报告:XML外部实体(XXE)注入漏洞原因和影响
  • 服务器初始化流程***
  • 在分布式环境下正确使用MyBatis二级缓存
  • 在 UniApp 中,实现下拉刷新
  • Python爬虫: 分布式爬虫架构讲解及实现
  • IjkPlayer 播放 MP4 视频时快进导致进度回退的问题
  • iOS 26 正式版即将发布,Flutter 完成全新 devicectl + lldb 的 Debug JIT 运行支持
  • 深度学习(三):PyTorch 损失函数:按任务分类的实用指南
  • Milvus介绍及多模态检索实践
  • 系统设计中的幂等性
  • 【LeetCode 热题 100】31. 下一个排列
  • 进入docker中mysql容器的方法
  • Linux(二十二)——服务器初始化指南