当前位置: 首页 > 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.dtcms.com/a/351730.html

相关文章:

  • 【Android】不同系统API版本_如何进行兼容性配置
  • 2014-2024高教社杯全国大学生数学建模竞赛赛题汇总预览分析
  • VMDK 文件
  • 软考-系统架构设计师 计算机系统基础知识详细讲解二
  • springcloud篇5-微服务保护(Sentinel)
  • Spring Boot mybatis-plus 多数据源配置
  • 【CVE-2025-5419】(内附EXP) Google Chrome 越界读写漏洞【内附EXP】
  • Kafka面试精讲 Day 1:Kafka核心概念与分布式架构
  • Elasticsearch中的协调节点
  • 详解kafka基础(一)
  • JavaScript常用的算法详解
  • Cherry-pick冲突与Git回滚
  • Oracle跟踪及分析方法
  • 力扣100+补充大完结
  • MySql 事务 锁
  • 推荐系统学习笔记(十四)-粗排三塔模型
  • 庖丁解牛:深入解析Oracle SQL语言的四大分类——DML、DDL、DCL、TCL
  • KubeBlocks for Oracle 容器化之路
  • 高校党建系统设计与实现(代码+数据库+LW)
  • 从零开始的 Docker 之旅
  • HIVE的高频面试UDTF函数
  • 【软考论文】论面向对象建模方法(动态、静态)
  • 无人机倾斜摄影农田航线规划
  • HTML应用指南:利用GET请求获取中国银行人民币存款利率数据
  • SciPy科学计算与应用:SciPy线性代数模块入门-矩阵运算与应用
  • 精确位置定位,AR交互助力高效作业流程​
  • 余承东:鸿蒙智行累计交付突破90万辆
  • 机器人视频感知架构深度解析:7条技术法则,打造低延迟实时感知与交互
  • 【ROS2】 忽略局域网多机通信导致数据接收的bug
  • 天气查询小程序项目报告