当前位置: 首页 > news >正文

React Hooks 中的 useEffect(副作用)

useEffect 是什么?

useEffect 是一个 React Hook,它允许你将组件与外部系统同步

当我们在 React 中使用 useEffect 这个 Hook 时,实际上是在告诉 React 在特定情况下执行我们定义的副作用函数。这种副作用函数可以处理一些与组件渲染结果无关的操作,例如数据获取、订阅事件、手动操作 DOM 等。

副作用函数作为 useEffect 的第一个参数传入。每当组件更新并重新渲染时,React 都会检查是否有副作用函数需要执行。但是,如果你想控制副作用函数的执行时机,可以传入第二个参数,这个参数是一个依赖数组。只有当依赖数组中的值发生变化时,副作用函数才会执行。

  • 如果将依赖数组设置为空数组:[],副作用函数将仅在组件第一次渲染时执行。这对于只需要执行一次的副作用操作非常有用,比如进行初始化的数据获取或订阅事件。
 // 挂载时执行,页面创建时只执行一次useEffect(() => {console.log("建立游戏连接");}, []);
  • 如果依赖数组中包含某个值:[value],副作用函数将在组件首次渲染时执行,以及该值发生变化时执行。这对于根据特定值来执行操作非常有用,比如根据输入值来查询数据。
 // 更新时,当监听的依赖项变动时触发useEffect(() => {console.log("当前游戏为:", optionValue);}, [optionValue]);
  • 如果不传递依赖数组,副作用函数将在每次组件重新渲染时都会执行。这可以用来处理具备实时更新需求的副作用操作,比如实时订阅数据或通过 WebSocket 接收数据。

  • 销毁时执行

 // 销毁时useEffect(() => {return () => {console.log("已断开连接");};}, []);

生命周期钩子函数为主执行:分别在每个钩子函数中,实现一个完整功能的部分效果

以功能为主执行:一个功能的所有效果放在一起实现

在开发中更常用的是 【以功能为主执行】,将代码整合,放在一起

 useEffect(() => {console.log("1 建立游戏连接:", optionValue, num, str);return () => {console.log("2 断开游戏连接:", optionValue);};}, [optionValue, num, str]);

它的执行流程为:1挂载:1 2更新:21 3卸载:2

  • 需要作为依赖项的值:Effect 中用到的可变的值,比如:prpos/state/组件内创建的变量等

  • 不需要则作为依赖项的值:组件外创建或导入的变量、函数的等

总的来说 useEffect 是 React 提供的一个 Hook,用于处理副作用操作。它的主要功能可以总结如下:

  1. 定义副作用函数:通过 useEffect,我们可以定义一个副作用函数,用于执行与渲染无关的操作。副作用函数可以包含任意代码,比如数据获取、订阅事件、手动操作 DOM 等。

  2. 控制副作用函数的执行时机:useEffect 的第一个参数是副作用函数。每当组件完成渲染后,React 就会检查是否需要执行副作用函数。通过传递一个依赖数组作为 useEffect 的第二个参数,可以控制副作用函数的执行时机。

  3. 组件挂载时执行副作用函数:当组件首次渲染时,副作用函数会被执行一次。这对于一些初始化操作非常有用,比如进行数据获取、订阅事件等。

  4. 组件更新时重新执行副作用函数:如果依赖数组中的任何依赖项发生变化,副作用函数会被重新执行。这使得我们可以根据特定的值或状态来更新副作用操作,以保持与组件的同步。

  5. 组件卸载时执行清理操作:如果我们在副作用函数中返回一个清理函数,它将在组件卸载时被调用。这可以用来取消订阅、清除定时器或执行其他必要的清理操作。

通过使用 useEffect,我们可以在函数式组件中处理副作用操作,并且能够灵活地控制这些操作的执行时机和清理。这为我们提供了一种方便的方式来管理组件的副作用,使得代码更简洁、可维护。

在使用它的依赖项时应注意 当使用 useEffect 时,我们应该根据具体开发场景来注意依赖项的设置。以下是一些常见开发场景和相应的依赖项注意事项:

  1. 数据获取和异步操作:

    • 如果副作用函数需要使用组件内部的状态或属性来触发数据获取,那么在依赖项中包含这些相关的状态或属性。
    • 如果数据获取是通过网络请求等异步操作进行的,需要确保依赖项不会在每次数据更新时重新触发数据获取。可以使用 useEffect 的清理函数来取消之前的请求。
  2. 监听事件或订阅:

    • 如果副作用函数需要监听全局事件或进行订阅,需要在依赖项中包含相关的事件或订阅源。
    • 在清理函数中,需要取消事件监听或取消订阅,以避免内存泄漏。
  3. 使用第三方库或外部资源:

    • 如果副作用函数使用了第三方库或外部资源(比如地图、音频等),需要根据文档或库提供的使用方式设置依赖项。
    • 在清理函数中,需要进行资源释放或销毁操作,以确保不会出现资源泄漏或内存溢出。
  4. 组件内部状态更新:

    • 如果副作用函数中使用了组件内部的状态,并且希望在状态更新时重新执行副作用函数,需要在依赖项中包含这些状态。
    • 需要注意避免创建闭包陷阱,可以使用 useCallback 或函数式更新来确保正确的依赖项设置。
  5. 优化性能:

    • 如果副作用函数不依赖任何值或状态,且其效果可以被忽略,可以省略依赖项,以避免不必要的重复执行。
    • 如果副作用函数只需要在组件挂载和卸载时执行一次,可以将依赖项设置为空数组 []

根据具体的开发场景和需求,我们需要仔细考虑哪些值和状态对副作用函数的正确执行起到关键作用,并相应地设置依赖项,以保证正确性和性能。

相关文章:

React Hooks 中的 useEffect(副作用)

useEffect 是什么? useEffect 是一个 React Hook,它允许你将组件与外部系统同步 当我们在 React 中使用 useEffect 这个 Hook 时,实际上是在告诉 React 在特定情况下执行我们定义的副作用函数。这种副作用函数可以处理一些与组件渲染结果无关…...

[CKA]考试之持久化存储卷PersistentVolume

由于最新的CKA考试改版,不允许存储书签,本博客致力怎么一步步从官网把答案找到,如何修改把题做对,下面开始我们的 CKA之旅 题目为: Task 创建一个pv,名字为app-config,大小为2Gi,…...

基于LLM的SQL应用程序开发实战(一)

基于LLM的SQL应用程序开发实战(一) 16.1 SQL on LLMs应用程序初始化 本节主要从案例代码的角度切入,探索ChatGPT以及大模型,尤其是从生产环境的视角,来思考具体的最佳实践。本节主要跟大家谈的是,在LangChain这样一个框架下,我们使用GPT-3.5或者GPT-4大模型,同时使用第…...

如何批量实现多行合并后居中

思路: 1.先填充数据 2.数据分类统计制作格式 3.格式刷刷制作出的格式 1.填充数据 思路:选中,F5定位空值,,⬆(键盘上的上下左右哪里的上键),按住Ctrl然后按Enter。 2.数据分类统计…...

【深度学习_TensorFlow】手写数字识别

写在前面 到这里为止,我们已经学习完张量的常用操作方法,已具备实现大部分神经网络技术的基础储备了。这一章节我们将开启神经网络的学习,然而并不需要像学习前面那样了解大量的张量操作,而是将重点转向理解概念知识,…...

antv/l7地图,鼠标滚动,页面正常滑动-- 我们忽略的deltaY

背景 在官网项目中,需要使用一个地图,展示产品的分布区域及数量。希望的交互是,鼠标放上标点,tooltip展示地点和数量等信息。鼠标滚动,则页面随着滚动。但是鼠标事件是被地图代理了的,鼠标滚动意味着地图的…...

再续AM335x经典,米尔TI AM62x核心板上市,赋能新一代HMI

近十年来,AM335x芯片作为TI经典工业MPU产品,在工业处理器市场占据主流地位,其凭借GPMC高速并口、PRU协处理器等个性化硬件资源,在工业控制、能源电力、轨道交通、智慧医疗等领域广受用户欢迎。随着信息技术的快速发展,…...

springboot和Django哪一个做web服务器框架更好

目录 一、两者特点 二、各自优势 一、两者特点 编程语言: Spring Boot:使用 Java 编程语言。Django:使用 Python 编程语言。 生态系统和社区支持: Spring Boot:具有庞大的 Java 生态系统和强大的社区支持。适用于大型…...

C#核心知识回顾——21.归并排序

理解递归逻辑 一开始不会执行sort函数的 要先找到最小容量数组时 才会回头递归调用Sort进行排序 基本原理 归并 递归 合并 数组分左右 左右元素相比较 一侧用完放对面 不停放入新数组 递归不停分 分…...

基于netty的rpc远程调用

QPRC 🚀🚀🚀这是一个手写RPC项目,用于实现远程过程调用(RPC)通信🚀🚀🚀 欢迎star串门:https://github.com/red-velet/ 🚀Q-PRC 一、功能特性 …...

RabbitMQ输出日志配置

参考地址rabbitmq启用日志功能记录消息队列收发情况_rabbitmq开启日志_普通网友的博客-CSDN博客 启用日志插件命令 # 设置用户权限 rabbitmqctl set_user_tags mqtt-user administrator rabbitmqctl set_permissions -p / mqtt-user ".*" ".*" ".*&…...

解决一个Sqoop抽数慢的问题,yarn的ATSv2嵌入式HBASE崩溃引起

新搭建的一个Hadoop环境,用Sqoop批量抽数的时候发现特别慢,我们正常情况下是一个表一分钟左右,批量抽十几个表,也就是10分钟的样子,结果发现用了2个小时: 查看yarn日志 发现有如下情况: 主要有两…...

为Android构建现代应用——应用导航设计

在前一章节的实现中,Skeleton: Main structure,我们留下了几个 Jetpack 架构组件,这些组件将在本章中使用,例如 Composables、ViewModels、Navigation 和 Hilt。此外,我们还通过 Scaffold 集成了 TopAppBar 和 BottomA…...

聊聊 Docker 和 Dockerfile

目录 一、前言 二、了解Dockerfile 三、Dockerfile 指令 四、多阶段构建 五、Dockerfile 高级用法 六、小结 一、前言 对于开发人员来说,会Docker而不知道Dockerfile等于不会Docker,上一篇文章带大家学习了Docker的基本使用方法:《一文…...

element表格+表单+表单验证结合u

一、结果展示 1、图片 2、描述 table中放form表单,放输入框或下拉框或多选框等; 点击添加按钮,首先验证表单,如果存在没填的就验证提醒,都填了就向下添加一行表单表格; 点击当前行删除按钮,…...

数据库:MYSQL参数max_allowed_packet 介绍

1、参数作用 max_allowed_packet参数是指mysql服务器端和客户端在一次传送数据包的过程当中最大允许的数据包大小。如果超过了设置的最大长度,则会数据库保持数据失败。 2、问题场景 ● 有时候业务的需要,可能会存在某些字段数据长度非常大(比如富文本编辑器里面的内容),…...

基于DiscordMidjourney API接口实现文生图

https://discord.com/api/v9/interactions 请求头: authorization:取自 浏览器中discord 文生图请求头中的 authorization 的值 Content-Type:application/json 请求体: {“type”:2,“application_id”:“93692956130267xxxx”,“guild_id”:“1135900…...

springboot+vue农产品特产商城销售平台_50kf2 多商家

随着我国经济的高速发展与人们生活水平的日益提高,人们对生活质量的追求也多种多样。尤其在人们生活节奏不断加快的当下,人们更趋向于足不出户解决生活上的问题,南阳特产销售平台展现了其蓬勃生命力和广阔的前景。与此同时,为解决…...

【深度学习_TensorFlow】感知机、全连接层、神经网络

写在前面 感知机、全连接层、神经网络是什么意思? 感知机: 是最简单的神经网络结构,可以对线性可分的数据进行分类。 全连接层: 是神经网络中的一种层结构,每个神经元与上一层的所有神经元相连接,实现全连接。 神经…...

软件测试(功能、接口、性能、自动化)详解

一、软件测试功能测试 测试用例编写是软件测试的基本技能;也有很多人认为测试用例是软件测试的核心;软件测试中最重要的是设计和生成有效的测试用例;测试用例是测试工作的指导,是软件测试的必须遵守的准则。 黑盒测试常见测试用…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

HTML 列表、表格、表单

1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

Java线上CPU飙高问题排查全指南

一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...

快刀集(1): 一刀斩断视频片头广告

一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)

题目 做法 启动靶机,点进去 点进去 查看URL,有 ?fileflag.php说明存在文件包含,原理是php://filter 协议 当它与包含函数结合时,php://filter流会被当作php文件执行。 用php://filter加编码,能让PHP把文件内容…...