当前位置: 首页 > 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】感知机、全连接层、神经网络

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

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

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

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

【笔记】WSL 中 Rust 安装与测试完整记录

#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

【Linux】Linux 系统默认的目录及作用说明

博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

Xcode 16 集成 cocoapods 报错

基于 Xcode 16 新建工程项目,集成 cocoapods 执行 pod init 报错 ### Error RuntimeError - PBXGroup attempted to initialize an object with unknown ISA PBXFileSystemSynchronizedRootGroup from attributes: {"isa">"PBXFileSystemSynchro…...

[拓扑优化] 1.概述

常见的拓扑优化方法有:均匀化法、变密度法、渐进结构优化法、水平集法、移动可变形组件法等。 常见的数值计算方法有:有限元法、有限差分法、边界元法、离散元法、无网格法、扩展有限元法、等几何分析等。 将上述数值计算方法与拓扑优化方法结合&#…...

DAY 45 超大力王爱学Python

来自超大力王的友情提示:在用tensordoard的时候一定一定要用绝对位置,例如:tensorboard --logdir"D:\代码\archive (1)\runs\cifar10_mlp_experiment_2" 不然读取不了数据 知识点回顾: tensorboard的发展历史和原理tens…...

EasyRTC音视频实时通话功能在WebRTC与智能硬件整合中的应用与优势

一、WebRTC与智能硬件整合趋势​ 随着物联网和实时通信需求的爆发式增长,WebRTC作为开源实时通信技术,为浏览器与移动应用提供免插件的音视频通信能力,在智能硬件领域的融合应用已成必然趋势。智能硬件不再局限于单一功能,对实时…...