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,需导入调用) 作用说明
实例初始化 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);
  },
};

四、总结

  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中通过导入的钩子函数注册逻辑,更灵活高效。
相关推荐
阿黎啊啊啊1 分钟前
避免 node_modules 修改被覆盖:用 patch-package 轻松搞定
前端
纯JS甘特图_MZGantt2 分钟前
五分钟集成一个高颜值甘特图?这个国产开源库让你告别繁琐!
前端
用户3379044802173 分钟前
通过兵马俑排列讲清Flex、Grid布局
前端
ruokkk5 分钟前
AI 编程真香!我用 Next.js + AI 助手,给孩子们做了个专属绘本网站
前端·后端·ai编程
兮漫天8 分钟前
bun + vite7 的结合,孕育的 Robot Admin 【靓仔出道】(二十)终章
前端·javascript·vue.js
失忆爆表症15 分钟前
基于 MediaPipe + Three.js 的实时姿态可视化前端
前端·webgl
乘风破浪酱5243615 分钟前
Bearer Token介绍
前端·后端
li理15 分钟前
鸿蒙应用开发深度解析:从基础列表到瀑布流,全面掌握界面布局艺术
前端·前端框架·harmonyos
百锦再16 分钟前
.NET + Vue 基于 WebSocket 的聊天室全面实现
vue.js·websocket·rabbitmq·.net·chat·message
coding随想43 分钟前
掌控右键宇宙!HTML5 contextmenu事件的终极使用指南,支持自定义右键菜单
前端