Vue 3 组件生命周期

一、核心定义

Vue 组件的生命周期,指的是 单个.vue文件(组件)从创建、挂载、更新到销毁的完整过程。在这个过程的不同关键节点,Vue 会自动调用对应的「生命周期钩子函数」,允许开发者在特定时机执行自定义逻辑(如发起请求、操作DOM、清理资源等)。

核心逻辑:每个.vue文件就是一个独立组件,浏览器对组件的操作仅3类------加载显示 → 数据更新刷新 → 关闭/切换删除,生命周期就是把这3类操作拆分成精确的时间点,供开发者介入。

二、Vue 3 生命周期钩子(组合式API,官方标准)

Vue 3 采用组合式API(<script setup>),取消了Vue 2中的beforeCreate、created,改用setup替代,其余钩子命名更语义化,核心钩子共7个(含setup),按执行顺序排列如下:

1. 核心钩子详情(含浏览器对应行为)

生命周期钩子 执行时机 浏览器真实行为 肉眼可见状态 常用场景
setup 组件实例刚创建,DOM未生成、数据未挂载 下载组件代码,开始初始化组件实例 页面空白,无任何组件相关内容 初始化响应式数据、定义方法、发起异步请求(替代Vue 2的beforeCreate+created)
onBeforeMount 组件模板编译完成,即将挂载到DOM 已解析组件模板,生成虚拟DOM,未插入页面 页面空白,仍看不到组件 极少使用,可做挂载前最后的准备(如临时数据处理)
onMounted 组件已挂载到页面,真实DOM生成完成 将虚拟DOM渲染为真实DOM,插入页面中 组件正常显示在页面上,可交互 最常用:操作DOM、初始化第三方插件(ECharts/地图)、发起需要DOM的请求
onBeforeUpdate 响应式数据发生变化,DOM即将重新渲染 已检测到数据变化,准备重新计算DOM结构 页面显示旧内容,未更新 获取更新前的DOM状态(极少使用)
onUpdated 数据更新完成,DOM重新渲染完毕 根据新数据,重新渲染真实DOM并更新页面 页面显示新内容,与最新数据一致 操作更新后的DOM(注意:避免在此修改数据,防止死循环)
onBeforeUnmount 组件即将被卸载,实例仍可用 准备将组件的DOM从页面移除,释放相关资源 组件仍显示在页面上,未消失 最常用:清理资源(清除定时器、取消事件监听、销毁第三方实例),防止内存泄漏
onUnmounted 组件已完全卸载,实例不可用 组件DOM彻底从页面移除,实例被销毁 组件从页面消失,无任何痕迹 做最后的资源清理(极少使用)

2. 生命周期完整执行顺序

  • 首次加载(组件创建+挂载):setup → onBeforeMount → onMounted

  • 数据更新(组件刷新):onBeforeUpdate → onUpdated(数据变化时重复执行)

  • 组件销毁(卸载):onBeforeUnmount → onUnmounted

3. Vue 2 与 Vue 3 钩子对应关系(补充)

Vue 2 钩子 Vue 3 对应钩子 说明
beforeCreate setup Vue 3 中 setup 替代了这两个钩子,执行时机包含两者
created setup Vue 3 中 setup 替代了这两个钩子,执行时机包含两者
beforeMount onBeforeMount 执行时机、作用完全一致
mounted onMounted 执行时机、作用完全一致
beforeUpdate onBeforeUpdate 执行时机、作用完全一致
updated onUpdated 执行时机、作用完全一致
beforeDestroy onBeforeUnmount 命名更语义化,作用完全一致
destroyed onUnmounted 命名更语义化,作用完全一致

三、Vue 3 生命周期 完整可执行代码

复制代码
<template>
  <div class="life-cycle">
    <h2>Vue 3 生命周期完整演示</h2>
    <p>当前计数:{{ count }}</p>
    <button @click="addCount">点击更新数据(触发更新生命周期)</button>
  </div>
</template>

<script setup>
// 引入Vue 3生命周期钩子(组合式API)
import { 
  ref, 
  onBeforeMount, 
  onMounted, 
  onBeforeUpdate, 
  onUpdated, 
  onBeforeUnmount, 
  onUnmounted 
} from 'vue'

// setup 执行(替代 beforeCreate + created)
console.log('🔴 1. setup 执行(组件初始化,数据/方法定义)')

// 定义响应式数据
const count = ref(0)

// 定义方法(触发数据更新)
const addCount = () => {
  count.value++
}

// 挂载前
onBeforeMount(() => {
  console.log('🟠 2. onBeforeMount(模板编译完成,即将挂载DOM)')
})

// 挂载完成(最常用)
onMounted(() => {
  console.log('🟢 3. onMounted(组件已挂载,可操作DOM/初始化插件)')
})

// 更新前
onBeforeUpdate(() => {
  console.log('🔵 4. onBeforeUpdate(数据已变,DOM即将刷新)')
})

// 更新完成
onUpdated(() => {
  console.log('🟣 5. onUpdated(DOM已刷新,页面显示新内容)')
})

// 卸载前(最常用,清理资源)
onBeforeUnmount(() => {
  console.log('🟡 6. onBeforeUnmount(组件即将销毁,清理资源)')
  // 示例:清除定时器、取消事件监听等
})

// 卸载完成
onUnmounted(() => {
  console.log('⚫ 7. onUnmounted(组件已完全销毁)')
})
</script>

<style scoped>
.life-cycle {
  padding: 20px;
  font-size: 16px;
}
button {
  padding: 6px 12px;
  margin-top: 10px;
  cursor: pointer;
}
</style>

四、具体来说都有什么场景

1. 发起网络请求

时机:setup 或 onMounted(推荐onMounted,若请求无需依赖DOM,可在setup中发起)

原因:setup中已初始化数据,onMounted中DOM已就绪,可避免请求完成后DOM未渲染的问题。

2. 操作DOM / 初始化第三方插件(ECharts、地图等)

时机:必须在 onMounted 中

原因:只有onMounted触发时,真实DOM才已生成,才能获取DOM元素(如ref引用),避免获取不到DOM的报错。

3. 清理资源(防止内存泄漏)

时机:必须在 onBeforeUnmount 中

常见场景:清除定时器、取消事件监听(如window.scroll、window.resize)、销毁第三方插件实例(如ECharts实例)。

4. 数据更新后操作DOM

时机:onUpdated 中

注意:不可在此钩子中修改响应式数据,否则会反复触发onUpdated,造成死循环。

五、关键注意事项(避坑重点)

  • setup 中不能操作DOM:此时DOM未生成,无法获取ref或真实DOM元素。

  • onUpdated 中避免修改数据:修改数据会再次触发更新,导致死循环。

  • 资源清理必须在 onBeforeUnmount 中:若不清理定时器、事件监听等,组件销毁后仍会占用内存,造成内存泄漏。

  • 父子组件生命周期顺序(面试高频):

    • 挂载:父 setup → 子 setup → 子 onBeforeMount → 子 onMounted → 父 onMounted

    • 销毁:父 onBeforeUnmount → 子 onBeforeUnmount → 子 onUnmounted → 父 onUnmounted

  1. 组件生命周期 = 浏览器对组件"加载 → 更新 → 销毁"的全过程,Vue 钩子只是在关键节点提供的"介入入口"。

  2. 核心重点记3个钩子:setup(初始化)、onMounted(操作DOM/插件)、onBeforeUnmount(清理资源),覆盖90%工作场景。

  3. 组合式API(<script setup>)是Vue 3官方推荐写法,钩子需手动引入,执行顺序固定,逻辑清晰。

课后习题:

vue3中组合式API和选项式API分别都是什么,都有哪些区别?

相关推荐
越甲八千2 小时前
Vue3启动流程和文件结构
前端·javascript·vue.js
独自破碎E2 小时前
Spring Boot + Vue 前后端联调踩坑记录
vue.js·spring boot·后端
榴莲omega2 小时前
第11天:函数组合、记忆化与定时器
开发语言·前端·javascript
小江的记录本2 小时前
【Docker】《 Docker 高频常用命令速查表 》
java·前端·后端·http·docker·容器·eureka
Beginner x_u2 小时前
前端八股整理|Vue|虚拟 DOM、Diff 与 Patch 流程
前端·javascript·vue.js
kaixiang3002 小时前
若依RuoYi实战
java·服务器·前端
NocoBase2 小时前
为 Excel 数据快速构建 Web 应用:4 种方法对比
前端·人工智能·低代码·开源·excel
一 乐2 小时前
智能农田管理|基于springboot + vue智能农田管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·智能农田管理系统
苏瞳儿2 小时前
数据库的增删改查-node.js
前端·javascript·数据库