Vue 实例生命周期

一、前言

在使用 Vue 开发应用时,我们经常需要在组件加载、更新或销毁时执行一些特定逻辑,例如:

  • 页面初始化时请求数据;
  • 数据变化时更新 DOM 或发送埋点;
  • 组件卸载时清除定时器、取消事件监听等资源释放操作。

Vue 提供了一套完整的生命周期钩子函数(Lifecycle Hooks),允许我们在组件的不同阶段插入自定义逻辑。掌握 Vue 实例的生命周期,是构建可维护、高性能 Vue 应用的关键。

本文将带你深入了解 Vue 实例(包括 Vue 2 和 Vue 3)的完整生命周期流程,并结合实际开发场景讲解每个钩子的作用和使用技巧。

二、什么是生命周期?

生命周期 是指一个 Vue 实例从被创建到最终被销毁的整个过程。在这个过程中,Vue 会自动调用一些钩子函数(Hook),我们可以利用这些钩子来插入自己的逻辑代码。

📌 生命周期本质上是一个状态机模型,不同阶段触发不同回调函数。

三、Vue 2 实例生命周期流程图概览

以下是 Vue 2 实例的生命周期流程图简要概括:

beforeCreate↓
created↓
beforeMount↓
mounted↓
beforeUpdate↓
updated↓
beforeDestroy↓
destroyed

四、Vue 2 各个生命周期钩子详解

1. beforeCreate

  • 触发时机:实例刚被创建,data 和 methods 还未被初始化。
  • 使用场景:极少使用,因为无法访问 data 和 methods。
  • 特点:此时尚未解析选项,不能访问任何响应式数据。
beforeCreate() {console.log('beforeCreate: 尚未访问 data');
}

2. created

  • 触发时机:实例已经创建完成,data 和 methods 已经可以访问。
  • 使用场景:常用于发起异步请求(如 API 请求)、初始化数据。
  • 注意:此时还没有挂载 DOM,不能操作 DOM 元素。
created() {console.log('created: data 已初始化', this.message);
}

3. beforeMount

  • 触发时机:模板编译/渲染函数已准备好,但尚未把虚拟 DOM 渲染成真实 DOM。
  • 使用场景:较少使用,通常用于性能监控或预处理。
beforeMount() {console.log('beforeMount: 模板即将渲染');
}

4. mounted

  • 触发时机:模板已经成功渲染为真实 DOM,此时可以安全地操作 DOM。
  • 使用场景:最常用的钩子之一,用于:
    • 初始化第三方库(如 ECharts 图表)
    • 获取 DOM 节点信息
    • 发送网络请求并绑定数据
    • 注册事件监听
mounted() {console.log('mounted: DOM 已渲染完毕', document.getElementById('myDiv'));
}

5. beforeUpdate

  • 触发时机:响应式数据发生改变,但视图还未更新。
  • 使用场景:可用于获取更新前的 DOM 状态,用于后续对比或动画控制。
beforeUpdate() {console.log('beforeUpdate: 数据已变更,DOM 即将更新');
}

6. updated

  • 触发时机:数据更新导致虚拟 DOM 重新渲染和打补丁后。
  • 使用场景:适用于依赖 DOM 更新后的操作,如重新初始化插件、手动触发动画等。
  • 注意:避免在此修改数据,否则可能导致死循环。
updated() {console.log('updated: DOM 已更新');
}

7. beforeDestroy

  • 触发时机:实例即将被销毁时调用。
  • 使用场景:清理操作,如:
    • 移除事件监听器
    • 清除定时器
    • 取消长连接
    • 解绑全局变量或状态
beforeDestroy() {clearInterval(this.timer); // 假设之前设置了定时器console.log('beforeDestroy: 正在清理资源');
}

8. destroyed

  • 触发时机:实例已经被销毁,所有指令都已解绑,子组件也已被销毁。
  • 使用场景:一般不做复杂操作,仅用于日志记录或调试。
destroyed() {console.log('destroyed: 实例已销毁');
}

五、Vue 3 生命周期的变化(Composition API)

在 Vue 3 的 Composition API 写法中,生命周期钩子发生了变化:

Vue 2 钩子名Vue 3 Composition API
beforeCreate不再需要(setup 代替)
created不再需要(setup 代替)
beforeMountonBeforeMount()
mountedonMounted()
beforeUpdateonBeforeUpdate()
updatedonUpdated()
beforeDestroyonBeforeUnmount()
destroyedonUnmounted()

示例(Vue 3 + Composition API):

<script setup>
import { onMounted, onUnmounted } from 'vue'let timer = nullonMounted(() => {console.log('组件已挂载')timer = setInterval(() => {console.log('每秒打印一次')}, 1000)
})onUnmounted(() => {console.log('组件即将卸载')clearInterval(timer)
})
</script>

六、常见应用场景总结

场景推荐生命周期钩子
初始化数据created / onMounted
请求数据created / onMounted
操作 DOMmounted / onMounted
注册/移除事件监听mounted + beforeDestroy / onMounted + onUnmounted
设置定时器mounted / onMounted
清理定时器、资源beforeDestroy / onUnmounted
响应数据更新updated / onUpdated

七、注意事项与最佳实践

  • ✅ 不要在 created 中操作 DOM,因为此时 DOM 还未生成。
  • ✅ 避免在 updated 中修改数据,可能造成无限循环。
  • ✅ 合理释放资源,尤其是事件监听器和定时器,防止内存泄漏。
  • ✅ Vue 3 推荐使用 Composition API,更符合函数式编程思想,易于复用和测试。
  • ✅ 使用 computed 而不是 watch,除非你需要副作用逻辑。

八、结语

感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/350.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

英一真题阅读单词笔记 17年

2017 年 Text 1 第一段 序号 单词 音标 词义 1 in advance 事先&#xff0c;提前 2 authority [ɔːˈθɒrəti] n. 专家&#xff0c;权威人士&#xff1b;当局&#xff0c;官方 3 recommend [ˌrekəˈmend] v. 建议&#xff0c;劝告 &#xff1b;推荐 4 s…

Prometheus + Grafana 监控常用服务

一、引言 Prometheus监控常见服务的原理主要包括服务暴露指标和Prometheus抓取指标。一方面&#xff0c;被监控服务通过自身提供的监控接口或借助Exporter将服务的性能指标等数据以HTTP协议的方式暴露出来&#xff1b;另一方面&#xff0c;Prometheus根据配置好的采集任务&…

DAY9 热力图和箱线图的绘制

浙大疏锦行 学会了绘制两个图&#xff1a; 热力图&#xff1a;表示每个特征之间的影响&#xff0c;颜色越深数值越大表示这两个特征的关系越紧密 箱线图&#xff1a;表示每个特征的数据分布情况 箱体&#xff08;Box&#xff09;&#xff1a; 箱体的上下边界分别表示第一四分位…

VUE项目部署IIS服务器手册

IIS部署Vue项目完整手册 &#x1f4cb; 目录 基础概念准备工作Vue项目构建web.config详解IIS部署步骤不同场景配置常见问题实用配置模板 基础概念 Vue单页应用&#xff08;SPA&#xff09;工作原理 重要理解&#xff1a;Vue项目是单页应用&#xff0c;这意味着&#xff1a;…

【Day38】

DAY 38 Dataset和Dataloader类 对应5. 27作业 知识点回顾&#xff1a; Dataset类的__getitem__和__len__方法&#xff08;本质是python的特殊方法&#xff09;Dataloader类minist手写数据集的了解 作业&#xff1a;了解下cifar数据集&#xff0c;尝试获取其中一张图片 import …

怎么查找idea插件的下载位置,并更改

长期使用 IntelliJ IDEA 时&#xff0c;默认存储在 C 盘的配置文件会持续生成大量缓存和日志文件&#xff0c;可能导致系统盘空间不足。通过修改默认配置文件存储位置&#xff0c;可以有效释放 C 盘空间并提升系统性能。 1&#xff0c;先找到自己idea的下载目录&#xff0c;再打…

什么是 WPF 技术?什么是 WPF 样式?下载、安装、配置、基本语法简介教程

什么是 WPF 技术&#xff1f;什么是 WPF 样式&#xff1f;下载、安装、配置、基本语法简介教程 摘要 WPF教程、WPF开发、.NET 8 WPF、Visual Studio 2022 WPF、WPF下载、WPF安装、WPF配置、WPF样式、WPF样式详解、XAML语法、XAML基础、MVVM架构、数据绑定、依赖属性、资源字典…

鸿蒙OSUniApp 开发的多图浏览器组件#三方框架 #Uniapp

使用 UniApp 开发的多图浏览器组件 在移动应用开发中&#xff0c;图片浏览器是非常常见且实用的功能&#xff0c;尤其是在社交、资讯、电商等场景下&#xff0c;用户对多图浏览体验的要求越来越高。随着 HarmonyOS&#xff08;鸿蒙&#xff09;生态的不断壮大&#xff0c;开发…

Flink流处理基础概论

文章目录 引言Flink基本概述传统数据架构的不足Dataflow中的几大基本概念Dataflow流式处理宏观流程数据并行和任务并行的区别Flink中几种数据传播策略Flink中事件的延迟和吞吐事件延迟事件的吞吐如何更好的理解事件的延迟和吞吐flink数据流的几种操作输入输出转换操作滚动聚合窗…

华为云Flexus+DeepSeek征文 | Dify-LLM平台一键部署教程及问题解决指南

作者简介 我是摘星&#xff0c;一名专注于云计算和AI技术的开发者。本次通过华为云MaaS平台体验DeepSeek系列模型&#xff0c;将实际使用经验分享给大家&#xff0c;希望能帮助开发者快速掌握华为云AI服务的核心能力。 目录 1. 前言 2. 准备工作 2.1 注册华为云账号 2.2 确…

第九届水动力学与能源电力系统国际学术会议(HEEPS 2025)

水动力学与电力系统融合&#xff1a;全球能源转型的新引擎 随着全球能源转型加速&#xff0c;水动力学与电力系统的融合正成为破解可持续发展难题的关键。 新能源接入的挑战与机遇 传统电力系统像一条单向行驶的高速公路&#xff0c;而风电、光伏等间歇性能源的加入&#xf…

鸿蒙仓颉开发语言实战教程:自定义tabbar

大家周末好呀&#xff0c;今天继续分享仓颉语言开发商城应用的实战教程&#xff0c;今天要做的是tabbar。 大家都知道ArkTs有Tabs和TabContent容器&#xff0c;能够实现上图的样式&#xff0c;满足基本的使用需求。而仓颉就不同了&#xff0c;它虽然也有这两个组件&#xff0c;…