一、生命周期概述

Vue 组件从创建到销毁的整个过程称为生命周期,在这个过程中,Vue 会自动触发一系列的函数,这些函数被称为生命周期钩子。通过生命周期钩子,我们可以在组件的不同阶段执行特定的操作,例如初始化数据、发送请求、操作 DOM 等。

Vue 3 的生命周期钩子与 Vue 2 相比,在命名和使用方式上有一些变化,同时支持选项式 API 和组合式 API 两种风格。

二、选项式 API 中的生命周期钩子

选项式 API 中的生命周期钩子以选项的形式定义在组件中,无需导入即可直接使用。

2.1 常用生命周期钩子及执行时机

  • beforeCreate:在实例初始化之后、数据观测 (data observer) 和 event/watcher 事件配置之前被调用。此时组件实例的属性和方法尚未初始化,无法访问 data、methods 等。
  • created:在实例创建完成后被立即调用。此时组件实例已完成数据观测、属性和方法的运算,但尚未开始 DOM 编译,即未挂载到 DOM 上,无法访问 $el。通常在此钩子中进行数据初始化、发送初始化请求等操作。
  • beforeMount:在挂载开始之前被调用。此时模板已编译完成,但尚未将编译好的模板挂载到页面中,$el 属性已存在但未挂载。
  • mounted:在实例挂载完成后被调用。此时组件已挂载到 DOM 上,可以访问和操作 DOM 元素,通常在此钩子中执行需要 DOM 支持的操作,如初始化第三方插件。
  • beforeUpdate:在数据更新之前被调用,发生在虚拟 DOM 重新渲染和打补丁之前。可以在此时访问到更新前的 DOM 状态。
  • updated:在数据更新之后被调用,此时虚拟 DOM 已重新渲染并应用了补丁,组件 DOM 已更新。应避免在此钩子中修改数据,以免陷入无限循环。
  • beforeUnmount:在组件实例卸载之前调用。此时组件实例仍然完全可用,可以在这里执行一些清理操作,如清除定时器、取消事件监听等。
  • unmounted:在组件实例卸载之后调用。此时组件的所有指令和事件监听器都已被移除,DOM 元素也已从页面中移除。

2.2 选项式 API 生命周期钩子使用案例

<template><div><p>{{ message }}</p><button @click="updateMessage">更新消息</button></div></template><script>export default {data() {return {message: '初始消息',timer: null}},beforeCreate() {console.log('beforeCreate 钩子执行')console.log('此时 data 中的 message:', this.message) // undefined},created() {console.log('created 钩子执行')console.log('此时 data 中的 message:', this.message) // 初始消息// 发送初始化请求示例console.log('发送初始化数据请求...')},beforeMount() {console.log('beforeMount 钩子执行')console.log('此时的 $el:', this.$el) // 已存在但未挂载},mounted() {console.log('mounted 钩子执行')console.log('此时的 $el:', this.$el) // 已挂载到 DOM// 启动定时器示例this.timer = setInterval(() => {console.log('定时器执行中...')}, 1000)},beforeUpdate() {console.log('beforeUpdate 钩子执行')console.log('更新前的 message:', this.message)},updated() {console.log('updated 钩子执行')console.log('更新后的 message:', this.message)},beforeUnmount() {console.log('beforeUnmount 钩子执行')// 清除定时器clearInterval(this.timer)console.log('定时器已清除')},unmounted() {console.log('unmounted 钩子执行')console.log('组件已卸载')},methods: {updateMessage() {this.message = '更新后的消息'}}}</script>

在上述案例中,通过在组件选项中定义各个生命周期钩子,我们可以清晰地看到每个钩子的执行时机和可执行的操作。

三、组合式 API 中的生命周期钩子

组合式 API 中的生命周期钩子需要从 vue 中导入后才能使用,且命名以 on 开头,例如 onMounted、onUpdated 等。

3.1 常用生命周期钩子及对应关系

组合式 API 中的生命周期钩子与选项式 API 中的钩子一一对应,具体对应关系如下:

  • onBeforeMount:对应选项式 API 的 beforeMount
  • onMounted:对应选项式 API 的 mounted
  • onBeforeUpdate:对应选项式 API 的 beforeUpdate
  • onUpdated:对应选项式 API 的 updated
  • onBeforeUnmount:对应选项式 API 的 beforeUnmount
  • onUnmounted:对应选项式 API 的 unmounted

此外,组合式 API 中没有直接对应 beforeCreate 和 created 的钩子,因为在 setup 函数中,代码的执行时机介于 beforeCreate 和 created 之间,因此可以将原本在 beforeCreate 和 created 中执行的操作直接写在 setup 函数中。

3.2 组合式 API 生命周期钩子使用案例

<template><div><p>{{ count }}</p><button @click="count++">增加计数</button></div></template><script setup>import { ref, onBeforeMount, onMounted, onBeforeUpdate, onUpdated, onBeforeUnmount, onUnmounted } from 'vue'const count = ref(0)let timer = null// 相当于 beforeCreate 和 created 钩子console.log('setup 中执行(相当于 beforeCreate 和 created)')console.log('count 的初始值:', count.value)onBeforeMount(() => {console.log('onBeforeMount 钩子执行')})onMounted(() => {console.log('onMounted 钩子执行')// 启动定时器timer = setInterval(() => {count.value++}, 2000)})onBeforeUpdate(() => {console.log('onBeforeUpdate 钩子执行,更新前的 count:', count.value)})onUpdated(() => {console.log('onUpdated 钩子执行,更新后的 count:', count.value)})onBeforeUnmount(() => {console.log('onBeforeUnmount 钩子执行')// 清除定时器clearInterval(timer)console.log('定时器已清除')})onUnmounted(() => {console.log('onUnmounted 钩子执行')})</script>

在组合式 API 中,生命周期钩子以函数的形式使用,需要先导入再调用,每个钩子函数接收一个回调函数,回调函数中包含该钩子需要执行的操作。

四、生命周期钩子的实际应用场景

  • 数据初始化:在 created(选项式)或 setup(组合式)中初始化组件所需的数据,例如从本地存储中读取数据。
  • 发送请求:在 created 或 mounted 中发送异步请求获取后端数据,mounted 中可以结合 DOM 操作处理请求结果。
  • 初始化插件:在 mounted 中初始化需要 DOM 支持的第三方插件,如图表插件、富文本编辑器等。
  • 监听事件:在 mounted 中为 DOM 元素添加事件监听器,在 beforeUnmount 中移除监听器,避免内存泄漏。
  • 清理操作:在 beforeUnmount 中清除定时器、取消未完成的请求、解绑自定义事件等,确保组件卸载后不会留下副作用。

五、选项式 API 与组合式 API 生命周期对比

选项式 API 钩子

组合式 API 钩子

执行时机

beforeCreate

-

组件实例初始化前

created

-

组件实例创建后

beforeMount

onBeforeMount

组件挂载前

mounted

onMounted

组件挂载后

beforeUpdate

onBeforeUpdate

数据更新前

updated

onUpdated

数据更新后

beforeUnmount

onBeforeUnmount

组件卸载前

unmounted

onUnmounted

组件卸载后

通过对比可以看出,组合式 API 中的生命周期钩子与选项式 API 中的钩子功能一致,只是命名和使用方式不同。在实际开发中,可根据项目风格和个人习惯选择合适的 API 风格。

结语:

接下来我会讲解 Vue 3 中组件通信的更多方式,除了之前提到的父传子,还会介绍子传父、兄弟组件通信以及跨级组件通信等,并结合案例说明每种方式的实现方法和适用场景。 

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

负载均衡Haproxy

简介 HAProxy是一款高性能、开源的负载均衡器与反向代理服务器&#xff0c;主要用于 HTTP、TCP等协议的流量分发&#xff0c;广泛应用于高并发、高可用的网络架构中 HAProxy是法国威利塔罗&#xff08;Willy Tarreau&#xff09;使用C语言开发的一个开源软件 企业版&#xff1a…

PostgreSQL锁机制详解:从并发控制到死锁检测

PostgreSQL锁详解 ————向逍xiangxiaohighgo.com 首先要讲锁的话&#xff0c;必须得先了解并发控制。数据库中的对象都是共享的&#xff0c;如果同时间不同的用户对同一个对象进行修改&#xff0c;就会出现数据不一致的情况。所以如果要实现并发访问&#xff0c;就需要对这…

【启发式算法】RRT*算法详细介绍(Python)

&#x1f4e2;本篇文章是博主人工智能&#xff08;AI&#xff09;领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对相关等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅…

Docker架构深度解析:从核心概念到企业级实践

Docker架构深度解析&#xff1a;从核心概念到企业级实践一、Docker架构全景图1.1 整体架构示意图二、核心组件深度解析2.1 Docker Daemon工作机制三、镜像与容器原理3.1 镜像分层结构3.2 容器生命周期四、网络架构详解4.1 网络模式对比4.2 Bridge网络实现原理五、存储架构与实践…

PPT自动化 python-pptx - 8: 文本(text)

在使用 python-pptx 库操作 PowerPoint 文档时&#xff0c;理解文本的结构和处理方式至关重要。本文将深入探讨文本在形状中的组织层级、访问方式以及各级别的格式化选项。文本容器与层级结构可容纳文本的形状&#xff1a; 只有自动形状 (Auto shapes) 和表格单元格 (table cel…

使用realsense进行目标检测并标识目标深度

涉及知识点都在代码中注释了&#xff0c;直接看代码 // This example is derived from the ssd_mobilenet_object_detection opencv demo // and adapted to be used with Intel RealSense Cameras // Please see https://github.com/opencv/opencv/blob/master/LICENSE#includ…

OpenWrt Network configuration

OpenWrt Network configuration device 和 interface 关系device device 表示底层的网络设备&#xff0c;如物理网卡、桥接设备&#xff08;bridge&#xff09;、VLAN 设备等。 通过 config device 定义&#xff0c;描述设备类型、端口成员、VLAN 等属性。 例如&#xff1a;br…

VuePress 使用详解

一、核心概念 VuePress 是 Vue.js 团队开发的静态网站生成器&#xff0c;专为技术文档优化&#xff0c;具备以下特性&#xff1a; Markdown 优先&#xff1a;原生支持 Markdown 语法扩展Vue 驱动&#xff1a;可在 Markdown 中使用 Vue 组件默认主题优化&#xff1a;内置响应式…

AI大模型前沿:Muyan-TTS开源零样本语音合成技术解析

AI大模型前沿&#xff1a;Muyan-TTS开源零样本语音合成技术解析引言&#xff1a;语音合成技术的演进与Muyan-TTS的突破性意义语音合成&#xff08;Text-to-Speech, TTS&#xff09;技术作为人机交互的核心接口之一&#xff0c;自20世纪30年代贝尔实验室首次尝试电子语音合成以来…

c# everthing.exe 通信

1 获取everthing进程 调用 Everything 搜索创建SearchWithEverything函数using Microsoft.Win32; using System; using System.Diagnostics; using System.IO; using System.Management; using System.Text;class EverythingHelper {// 方法 1&#xff1a;从进程获取路径publi…

Gitee:中国企业级DevOps平台的本土化突围之路

Gitee&#xff1a;中国企业级DevOps平台的本土化突围之路 在国内数字化转型浪潮下&#xff0c;DevOps平台作为企业研发效能提升的核心引擎&#xff0c;正在经历从工具到生态的全面升级。作为国内领先的一站式DevOps解决方案&#xff0c;Gitee凭借其本土化优势与全链路服务能力&…

C++法则22:运算符 ::* 和 ->* 和 ::* 是独特的整体运算符,是不可分的。

C法则22&#xff1a;运算符 ::* 和 ->* 和 ::* 是独特的整体运算符&#xff0c;是不可分的。1. ::*&#xff08;成员指针声明符&#xff09;作用&#xff1a;用于声明一个指向类成员的指针。语法&#xff1a;ReturnType (ClassName::*pointerName) &ClassName::MemberN…

Linux系统管理习题

Linux 系统管理练习题 1.请为此虚拟机配置以下网络参数&#xff1a; 1&#xff09;主机名&#xff1a;chenyu.example.com &#xff08;将chenyu改成自己名字的全拼&#xff09; 2&#xff09;IP 地址&#xff1a;192.168.100.100/24 3&#xff09;默认网关&#xff1a;192.168…

SQL166 每天的日活数及新用户占比

SQL166 每天的日活数及新用户占比 题目理解 本SQL查询旨在分析用户活跃数据&#xff0c;计算两个关键指标&#xff1a; 每日活跃用户数(DAU)每日新增用户占比(新用户占活跃用户的比例) 解题思路 1. 数据准备阶段 首先我们需要获取所有用户的活跃记录&#xff0c;包括&…

【33】C# WinForm入门到精通 ——表格布局器TableLayoutPanel【属性、方法、事件、实例、源码】

WinForm 是 Windows Form 的简称&#xff0c;是基于 .NET Framework 平台的客户端&#xff08;PC软件&#xff09;开发技术&#xff0c;是 C# 语言中的一个重要应用。 .NET 提供了大量 Windows 风格的控件和事件&#xff0c;可以直接拿来使用。 本专栏内容是按照标题序号逐渐…

uv使用教程

以下是使用 Python 包管理工具 uv 的常见命令指南。uv 是由 Astral&#xff08;Ruff 的开发者&#xff09;开发的高性能 Python 包安装器和解析器&#xff0c;旨在替代 pip 和 pip-tools&#xff1a; 1. 安装 uv uv官网仓库 # Linux/macOS curl -Ls https://astral.sh/uv/in…

SpringBoot3.x入门到精通系列:1.1 简介与新特性

SpringBoot 3.x 简介与新特性 &#x1f4d6; 什么是SpringBoot SpringBoot是由Pivotal团队提供的全新框架&#xff0c;其设计目的是用来简化Spring应用的初始搭建以及开发过程。SpringBoot集成了大量常用的第三方库配置&#xff0c;SpringBoot应用中这些第三方库几乎可以零配…

二、搭建springCloudAlibaba2021.1版本分布式微服务-Nacos搭建及服务注册和配置中心

nacos介绍 1、Nacos简介 Nacos 是阿里巴巴推出来的一个新开源项目&#xff0c;这是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集&#xff0c;帮助您快速实现动态服务发现、…

浅谈物联网嵌入式程序开发源码技术方案

在物联网蓬勃发展的时代&#xff0c;嵌入式程序作为连接硬件与软件的桥梁&#xff0c;发挥着至关重要的作用。以“边缘智能 云协同”为核心&#xff0c;为工业、医疗、家居、农业、智慧城市五大场景提供稳定、低功耗、可扩展的物联网终端与平台一体化解决方案。以下董技叔软件…

【笔记】重学单片机(51)

为学习嵌入式做准备&#xff0c;重新拿起51单片机学习。此贴为学习笔记&#xff0c;仅记录易忘点&#xff0c;实用理论基础&#xff0c;并不是0基础。 资料参考&#xff1a;清翔零基础教你学51单片机 51单片机学习笔记1. C语言中的易忘点1.1 数据类型1.2 位运算符1.3 常用控制语…