vue3之生命周期钩子

news2024/11/24 18:23:08

Vue 组件实例生命周期

每个 Vue 组件实例在创建时都需要经历一系列的初始化步骤,比如设置好数据侦听,编译模板,挂载实例到 DOM,以及在数据改变时更新 DOM。在此过程中,它也会运行被称为生命周期钩子的函数,让开发者有机会在特定阶段运行自己的代码。
在这里插入图片描述

调用生命周期钩子API 都应该在组件的 setup() 阶段被同步调用。

这并不意味着对生命周期钩子API 的调用必须放在 setup() 或 <script setup> 内的词法上下文中。也可以在一个外部函数中调用,只要调用栈是同步的,且最终起源自 setup() 就可以。

生命周期钩子概述

在 Vue 3 中,组合式 API 提供了一系列的生命周期钩子函数,这些函数可以在组件的不同生命周期阶段执行特定的逻辑。

  1. onBeforeMount:在组件挂载到 DOM 之前调用。
  2. onMounted:在组件挂载到 DOM 之后调用。
  3. onBeforeUpdate:在组件更新之前调用。
  4. onUpdated:在组件更新之后调用。
  5. onBeforeUnmount:在组件卸载之前调用。
  6. onUnmounted:在组件卸载之后调用。

生命周期钩子的使用

1. onBeforeMount

onBeforeMount 钩子在组件挂载到 DOM 之前调用。可以在这个钩子中执行一些初始化逻辑,但此时 DOM 还没有被渲染。

<script setup>
import { onBeforeMount } from 'vue';

onBeforeMount(() => {
  console.log('Component is about to be mounted');
});
</script>
2. onMounted

onMounted 钩子在组件挂载到 DOM 之后调用。此时,DOM 已经被渲染,可以在这个钩子中执行与 DOM 相关的操作,例如获取 DOM 元素、添加事件监听等。

<script setup>
import { onMounted } from 'vue';

onMounted(() => {
  console.log('Component has been mounted');
  const element = document.getElementById('my-element');
  console.log(element);
});
</script>
3. onBeforeUpdate

onBeforeUpdate 钩子在组件更新之前调用。可以在这个钩子中执行一些准备工作,例如保存当前状态,以便在更新后进行比较。

<script setup>
import { onBeforeUpdate } from 'vue';

onBeforeUpdate(() => {
  console.log('Component is about to be updated');
});
</script>
4. onUpdated

onUpdated 钩子在组件更新之后调用。此时,DOM 已经被更新,可以在这个钩子中执行与更新后的 DOM 相关的操作。

<script setup>
import { onUpdated } from 'vue';

onUpdated(() => {
  console.log('Component has been updated');
});
</script>
5. onBeforeUnmount

onBeforeUnmount 钩子在组件卸载之前调用。可以在这个钩子中执行一些清理工作,例如移除事件监听、取消订阅等。

<script setup>
import { onBeforeUnmount } from 'vue';

onBeforeUnmount(() => {
  console.log('Component is about to be unmounted');
});
</script>
6. onUnmounted

onUnmounted 钩子在组件卸载之后调用。此时,组件已经从 DOM 中移除,可以在这个钩子中执行一些最终的清理工作。

<script setup>
import { onUnmounted } from 'vue';

onUnmounted(() => {
  console.log('Component has been unmounted');
});
</script>

示例

以下是一个综合示例,展示了如何在一个组件中使用多个生命周期钩子:

<template>
  <div>
    <p>{{ message }}</p>
    <button @click="updateMessage">Update Message</button>
  </div>

  <div>
    <button @click="toggleComponent">Toggle Component</button>
    <component :is="currentComponent" />
  </div>
</template>

<script setup>
import { shallowRef, onBeforeMount, onMounted, onBeforeUpdate, onUpdated, onBeforeUnmount, onUnmounted } from 'vue';
import ComponentA from './components/ComponentA.vue';
import ComponentB from './components/ComponentB.vue';

const currentComponent = shallowRef(ComponentA);

const toggleComponent = () => {
  currentComponent.value = currentComponent.value === ComponentA ? ComponentB : ComponentA;
};

const message = shallowRef('Hello, World!');

const updateMessage = () => {
  message.value = 'Hello, Vue 3!';
};

// 在组件挂载之前调用
onBeforeMount(() => {
  console.log('Component is about to be mounted');
});

// 在组件挂载之后调用
onMounted(() => {
  console.log('Component has been mounted');
});

// 在组件更新之前调用
onBeforeUpdate(() => {
  console.log('Component is about to be updated');
});

// 在组件更新之后调用
onUpdated(() => {
  console.log('Component has been updated');
});

// 在组件卸载之前调用
onBeforeUnmount(() => {
  console.log('Component is about to be unmounted');
});

// 在组件卸载之后调用
onUnmounted(() => {
  console.log('Component has been unmounted');
});
</script>

<style scoped>
.logo {
  height: 6em;
  padding: 1.5em;
  will-change: filter;
  transition: filter 300ms;
}
.logo:hover {
  filter: drop-shadow(0 0 2em #646cffaa);
}
.logo.vue:hover {
  filter: drop-shadow(0 0 2em #42b883aa);
}
</style>

ComponentA.vue

<template>
  <div>
    <p>Component A</p>
  </div>
</template>

<script setup>
import { onBeforeUnmount, onUnmounted } from 'vue';

onBeforeUnmount(() => {
  console.log('Component A is about to be unmounted');
});

onUnmounted(() => {
  console.log('Component A has been unmounted');
});
</script>

ComponentB.vue

<template>
  <div>
    <p>Component B</p>
  </div>
</template>

<script setup>
import { onBeforeUnmount, onUnmounted } from 'vue';

onBeforeUnmount(() => {
  console.log('Component B is about to be unmounted');
});

onUnmounted(() => {
  console.log('Component B has been unmounted');
});
</script>

初始状态下,ComponentA 被渲染。
点击按钮切换到 ComponentB,此时 ComponentA 将被卸载,触发 onBeforeUnmountonUnmounted 钩子。
再次点击按钮切换回 ComponentA,此时 ComponentB 将被卸载,触发 onBeforeUnmountonUnmounted 钩子。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Arduino的燃气泄漏检测系统与自动切断调节器

Arduino LPG燃气泄漏检测系统与自动切断调节器 引言 大家好&#xff0c;今天我要分享一个非常实用的项目——Arduino LPG燃气泄漏检测系统与自动切断调节器。这个项目的重要性不言而喻&#xff0c;因为燃气泄漏是一个严重的安全隐患。在厨房烹饪时&#xff0c;我们可能会忘记…

望繁信科技成功签约国显科技 流程挖掘助力制造业智造未来

近日&#xff0c;上海望繁信科技有限公司&#xff08;简称“望繁信科技”&#xff09;成功与深圳市国显科技有限公司&#xff08;简称“国显科技”&#xff09;达成合作。国显科技作为全球领先的TFT-LCD液晶显示及Mini/Micro LED显示产品供应商&#xff0c;致力于为笔记本、手机…

设计模式02-桥接模式(Java)

4.2 桥接模式 **1.定义&#xff1a;**将抽象与实现分离&#xff0c;使它们可以独立变化。它是用组合关系代替继承关系来实现&#xff0c;从而降低了抽象和实现这两个可变维度的耦合度。 2.结构&#xff1a; 抽象化角色 &#xff1a;定义抽象类&#xff0c;并包含一个对实现化…

Spring Security无脑使用

步骤1&#xff1a;添加Spring Security依赖 在你的Spring Boot项目的pom.xml文件中&#xff0c;添加Spring Security的依赖&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</art…

数据库的特点

数据库是有组织的&#xff0c;规范的把数据保存起来的。 怎么个组织的&#xff0c;规范的&#xff1f; 数据库的特点&#xff1a; 1.将数据放到数据表格&#xff08;二维表&#xff09;中&#xff0c;在将表格放到库中。 2.一个数据库中可以有多张表&#xff0c;每个表都有一…

【OpenCV】(四)—— 边界填充

在OpenCV的图像处理中&#xff0c;边界填充主要用于在图像边缘添加额外的像素。这项技术在多种图像处理任务中都有重要的应用&#xff0c;包括但不限于卷积操作、图像缩放、形态学操作等。 opencv中边界填充的主要方法为copyMakeBorder&#xff0c;其函数原型如下&#xff1a;…

分享一道逻辑题

1、有一个水无限多的是水塘.只有两个水瓶.一个5升一个6升.如何从水塘里用这两个水瓶取出3升水?

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-13

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-13 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-13目录1. The Cognitive Capabilities of Generative AI: A Comparative Analysis with Human Benchmarks2. WALL-E: World Alig…

Postman 如何测试入参是文件类型(File)参数接口

Postman 如何测试 File 类型参数 前提背景测试步骤1、打开 Postman 选择 POST 方法输入调用地址2、参数选择 Body 下的 form-data3、KEY 选择 File 选项&#xff0c;并填写 file 前提背景 springboot 项目&#xff0c;接口的参数是 File 类型&#xff0c;需要通过 Postman 测试…

链表题, 反转链表 , 链表的中间结点 , 删除链表的倒数第 N 个结点 , 移除链表元素

文章目录 206. 反转链表203. 移除链表元素876. 链表的中间结点LCR 021. 删除链表的倒数第 N 个结点 206. 反转链表 题目链接 思路&#xff1a; 将原链表的结点&#xff0c;从头到尾一个个地拿下来头插到一个新链表中&#xff0c;这个新链表起始时为一个空链表。 class Solutio…

同三维T80001HK4 四路4K30HDMI H.264编码器

4路同时编码&#xff0c;带4路3.5外置音频 同三维T80001HK4四路4K30HDMI H.264编码器 同三维T80001HK4用于高清视频信号&#xff08;4K30Hz&#xff09;编码及网络传输的硬件设备&#xff0c;采用最新高效H.264高清数字视频压缩技术&#xff0c;具备稳定可靠、高清晰度、低码率…

408 14——42题

题目&#xff1a; 某网络中的路由器运行OSPF路由协议&#xff0c;题42表是路由器R1维护的主要链路状态信息(LSI)&#xff0c;题42图是根据题42表及R1的接口名构造出来的网络拓扑。 请回答下列问题。 1)本题中的网络可抽象为数据结构中的哪种逻辑结构? 2)针对题42表中的内容&am…

C++ 类和对象-改

在C中&#xff0c;类&#xff08;Class&#xff09;是用户自定义的数据类型&#xff0c;用来封装数据和功能的结合。而对&#xff08;Object&#xff09;是类的实例&#xff0c;通过类的定义可以创建多个对象。C是一种面向对象编程语言&#xff0c;类和对象是其核心概念。 1. …

前端开发基础NodeJS+NPM基本使用(零基础入门)

文章目录 1、Nodejs基础1.1、NodeJs简介1.2、下载安装文件1.3、安装NodeJS1.4、验证安装2、Node.js 创建第一个应用2.1、说明2.2、创建服务脚本2.3、执行运行代码2.4、测试访问3、npm 基本使用3.1、测试安装3.2、配置淘宝npm镜像3.3.1、本地安装3.3.2、全局安装3.4、查看安装信…

项目总思路

一、模型选择 高性能服务器一般用到的是 Reactor 模型&#xff0c;即事件驱动模型。 1、模型一&#xff1a;单 Reactor 单线程模型 只有一个线程会造成性能瓶颈。 适用场景&#xff1a;客户端少&#xff0c;业务处理快速。 2、模型二&#xff1a;单 Reactor 多线程模型 即…

栈——单调栈

题目描述 给定一个长度为 N 的整数数列&#xff0c;输出每个数左边第一个比它小的数&#xff0c;如果不存在则输出 −1。 输入格式 第一行包含整数 N (1≤N≤10^5)&#xff0c;表示数列长度。 第二行包含 N 个整数&#xff0c;表示整数数列。1≤ai≤10^9。 输出格式 共一…

git规范化开发

特性分支开发 以前使用git基本都是随心所欲的用&#xff0c;commit的信息比较随便&#xff0c;所以有时git分支结构有时显得混乱&#xff0c;最近标准化开发的过程中接触了特性分支开发。 何为特性分支&#xff0c;按我的理解&#xff0c;就是每一次代码的修改提交&am…

Linux操作系统学习——常见指令集合

本篇博客是对于linux系统学习的初步认识&#xff0c;了解一些常见指令以及基础知识 ls指令 ls/ls -l :只显示文件名/显示更多文件的属性&#xff0c;此时注意最后一行开头位置字母为d就代表显示的是目录的文件属性&#xff0c;还有一点就是&#xff1a;ls -l 默认查看当前目录…

解锁5 大无水印热门短视频素材库

想让你的抖音视频更出彩吗&#xff1f;想知道那些爆款视频的素材源头吗&#xff1f;快来了解以下 5 个超棒的视频素材下载平台。 蛙学网 国内的视频素材佼佼者&#xff0c;有大量 4K 高清且无水印的素材&#xff0c;自然风光、情感生活等类别任你选&#xff0c;不少还免费&…

利用 NIM 平台上的生成式 AI模型,根据描述生成图片

以下是一个使用 NIM 平台的生成式 AI模型构建的简单 demo。这个 demo 实现了文生图&#xff0c;通过解析用户需求来判断是否需要进行画图。这里使用 Python 和 FastAPI框架来搭建一个简单的 web 应用。 项目结构 work/ │ ├── images/ ├── chat.py └── chat.html 安…