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

React第十八节 useEffect 用法使用技巧注意事项详解

1、概述

useEffectReact中一个用于 将组件与外部系统同步的 Hook;在函数式组件中处理副作用函数的 Hook,用于替代类式组件中的生命周期函数
可以在副作用函数中 实现以下操作:
a、请求接口,获取后台提供数据
b、操作DOM
c、事件监听window.addEventListener()
d、清理任务; clearInterval()

如果没有与外部系统链接,或许可以不使用 useEffect

2、写法

useEffect(fnc, dependencies)

第一个参数fnc 是一个副作用函数,即在执行的过程中会影响组件的其他属性,而不是纯函数,纯函数是没有参数,输入相同的时候,输出也是相同的;
第二个参数可选参数:dependencies 是副作用函数执行的依赖项数组,可以是空数组,a/当为空数组时候,组件只会在初次渲染的时候,触发副作用函数执行;b/当不传依赖项时候,每次组件渲染都会触发副作用函数执行;c/依赖项可以是 props、state

当:fnc 中 return () => {} 时,这里执行的是组件卸载时候的逻辑;

2.1、依赖项不传

每次渲染都会触发副作用函数, 类似于类式组件中的 componentDidUpdate 钩子

useEffect(() => {console.log('==视图更新了=')
})
2.2、依赖项传入空数组

只有在第一次挂载时候才会触发副作用函数,类似于类式组件componentDidMount 钩子

useEffect(() => {console.log('=只有挂载=更新了=')
}, [])
2.3、依赖指定属性时

当属性 name 变化时候,就会触发副作用函数,类似于类式组件中的 componentDidUpdate 钩子

const [name, setName] = useState('Andy')
useEffect(() => {console.log('=只有name 属性变化时=更新了=')
},[name])
2.4、副作用函数中传入 回调函数时

此时,类似于 类式组件componentWillUnmount 钩子
可以在这里清除定时任务,销毁DOM结构、移除事件监听

useEffect(() => {return () => {console.log('====组件将要卸载了=')}
}, [name])
2.5、清除定时任务
import { useEffect, useState } from 'react'
export default function index() {const [count, setCount] = useState(0)const [name, setName] = useState('Andy')const handleChangeName = () => {setName(`${name} + &`)}let timer = nullconst handleChangeTime = () => {console.log('==开始计数了=')timer = setInterval(() => {setCount((count) => count + 1)}, 500)}useEffect(() => {return () => {// 清除定时任务clearInterval(timer)console.log('==计数结束了=')}}, [name])
return (<div><h3>useEffect text demo .</h3><p>名称:{name}</p><button onClick={handleChangeName}>清除定时任务</button><hr /><p>计数器:{count}</p><button onClick={handleChangeTime}>计时开始</button></div>)
}
2.6、清除事件监听
useEffect(() => {// 组件挂载 监听视图窗口变化const resize = () => console.log('窗口大小变化');window.addEventListener('resize', resize);return() => {window.removeEventListener('resize', resize)}
}, [])
2.7、死循环

禁止useEffect 中使用 useState 的SetXxx 函数, 更新useEffect 中的依赖项
否则会导致进入死循环

 useEffect(() => {// 死循环const timer = setInterval(() => {console.log('==计数进行中=', count, count)setCount(count + 1)}, 500)return () => {clearInterval(timer)console.log('==计数结束了=')}
},[count, name])

3、注意事项:

1、依赖项为引用类型时,React 会对比前后地址(引用指针)是否一致,如果一致 Effect 则不会重新渲染
2、避免使用更新依赖时产生死循环
3、组件中使用的定时任务,需要在组件卸载时候清除,避免导致内存溢出
4、依赖项避免过多,会导致追踪复杂化,或者出现意向不到的问题,尽量简化依赖项;

4、useEffectuseMemo 的区域

useMemo 主要用于计算和缓存值,以减少重复昂贵的计算,它返回一个 memoized 值。
useEffect 主要用于处理副作用,例如订阅、数据获取、DOM 操作等,它不返回值,但可以在组件渲染后执行操作。
useMemo 的作用是优化性能,减少不必要的计算,即使没有useMemo 组件同样可以正常执行
useEffect 的目标是处理副作用,管理组件的生命周期
useMemo 的依赖数组用于控制何时重新计算值
useEffect 的依赖数组用于控制何时运行副作用函数

相关文章:

React第十八节 useEffect 用法使用技巧注意事项详解

1、概述 useEffect 是React中一个用于 将组件与外部系统同步的 Hook&#xff1b;在函数式组件中处理副作用函数的 Hook&#xff0c;用于替代类式组件中的生命周期函数&#xff1b; 可以在副作用函数中 实现以下操作&#xff1a; a、请求接口&#xff0c;获取后台提供数据 b、操…...

C++ 指针基础:开启内存操控之门

1. 指针为何如此重要 在 C 编程领域&#xff0c;指针堪称一项极为关键的特性。它赋予了程序员直接访问和操控内存的能力&#xff0c;这使得程序在处理复杂数据结构与优化性能时具有更高的灵活性。想象一下&#xff0c;在编写大型程序时&#xff0c;高效地管理内存资源是多么重要…...

Nginx的stream模块代理四层协议TCP的流量转发

Nginx的stream模块是一个功能强大的工具&#xff0c;专门用于处理四层协议&#xff08;即网络层和传输层&#xff0c;如TCP和UDP&#xff09;的流量。以下是对Nginx stream模块的详细解析&#xff1a; 一、基本功能 Nginx的stream模块主要用于实现TCP和UDP数据流的代理、转发…...

UE5 渲染管线 学习笔记

兰伯特 SSS为散射的意思 带Bias的可以根据距离自动切换mip的卷积值 而带Level的值mipmaps的定值 #define A8_SAMPLE_MASK .a 这样应该就很好理解了 这个只采样a通道 带Level的参考上面的 朝左上和右下进行模糊 带Bias参考上面 随机数 4D 3D 2D 1D...

Echarts连接数据库,实时绘制图表详解

文章目录 Echarts连接数据库&#xff0c;实时绘制图表详解一、引言二、步骤一&#xff1a;环境准备与数据库连接1、环境搭建2、数据库连接 三、步骤二&#xff1a;数据获取与处理1、查询数据库2、数据处理 四、步骤三&#xff1a;ECharts图表配置与渲染1、配置ECharts选项2、动…...

Electron 学习笔记

目录 一、安装和启动electron 1. 官网链接 2. 根据文档在控制台输入 3. 打包必填 4. 安装electron开发依赖 5. 在开发的情况下打开应用 6. 修改main为main.js&#xff0c;然后创建main.js 7.启动 二、启动一个窗口 1. main.js 2. index.html 3. 隐藏菜单栏 三、其他…...

Debian 12 安装配置 fail2ban 保护 SSH 访问

背景介绍 双十一的时候薅羊毛租了台腾讯云的虚机, 是真便宜, 只是没想到才跑了一个月, 系统里面就收集到了巨多的 SSH 恶意登录失败记录. 只能说, 互联网真的是太不安全了. 之前有用过 fail2ban 在 CentOS 7 上面做过防护, 不过那已经是好久好久之前的故事了, 好多方法已经不…...

http反向代理

通过反向代理实现访问biying,目前访问一些网站需要绕过cloudfare还没有解决,代码如下: from fastapi import FastAPI, Request from fastapi.responses import StreamingResponse import httpx import uvicorn import logging# 设置日志 logging.basicConfig(level=logging.…...

java12.24日记

运算符&#xff1a; 算术运算符&#xff1a; 顾名思义进行算数运算的 多为&#xff1a;四则运算&#xff0c;加一个取余 &#xff0c;-&#xff0c;*&#xff0c;/以及 %&#xff08;取余&#xff09; 而外的&#xff1a;自增 以及自减--&#xff0c;对原数进行1或者-1 i…...

vue中proxy代理配置(测试一)

接口地址&#xff1a;http://jsonplaceholder.typicode.com/posts 1、配置一&#xff08;代理没起作用&#xff09; &#xff08;1&#xff09;设置baseURL为http://jsonplaceholder.typicode.com &#xff08;2&#xff09;proxy为 ‘/api’&#xff1a;’ ’ &#xff08;3&a…...

[OpenGL]使用TransformFeedback实现粒子效果

一、简介 本文介绍了如何使用 OpenGL 中的 Transform Feedback 实现粒子效果&#xff0c;最终可以实现下图的效果&#xff1a; 本文的粒子系统实现参考了modern-opengl-tutorial, ogldev-tutorial28 和 粒子系统–喷泉 [OpenGL-Transformfeedback]。 二、使用 TransformFeed…...

GitCode 光引计划投稿 | GoIoT:开源分布式物联网开发平台

GoIoT 是基于Gin 的开源分布式物联网&#xff08;IoT&#xff09;开发平台&#xff0c;用于快速开发&#xff0c;部署物联设备接入项目&#xff0c;是一套涵盖数据生产、数据使用和数据展示的解决方案。 GoIoT 开发平台&#xff0c;它是一个企业级物联网平台解决方案&#xff…...

用 gdbserver 调试 arm-linux 上的 AWTK 应用程序

很多嵌入式 linux 开发者都能熟练的使用 gdb/lldb 调试应用程序&#xff0c;但是还有不少朋友在调试开发板上的程序时&#xff0c;仍然在使用原始的 printf。本文介绍一下使用 gdbserver 通过网络调试开发板上的 AWTK 应用程序的方法&#xff0c;供有需要的朋友参考。 1. 下载 …...

攻防世界web第一题

最近开始学习网络安全的相关知识&#xff0c;开启刷题&#xff0c;当前第一题 题目为攻防世界web新手题 这是题目 翻译&#xff1a;在这个训练挑战中&#xff0c;您将了解 Robots_exclusion_standard。网络爬虫使用 robots.txt 文件来检查是否允许它们对您的网站或仅网站的一部…...

轮播图带详情插件,插件

超级好用的轮播图 介绍访问地址参数介绍使用方法&#xff08;简单使用&#xff0c;参数结构点击链接查看详情&#xff09;图片展示 介绍 video(15) 带有底部物品介绍以及价格的轮播图组件&#xff0c;持续维护&#xff0c;uniApp插件&#xff0c;直接下载填充数据就可以在项目里…...

gesp(三级)(14)洛谷:B4039:[GESP202409 三级] 回文拼接

gesp(三级)(14)洛谷:B4039:[GESP202409 三级] 回文拼接 题目描述 一个字符串是回文串,当且仅当该字符串从前往后读和从后往前读是一样的,例如, aabaa \texttt{aabaa} aabaa 和...

ISO17025最新认证消息

ISO17025认证是国际上广泛认可的实验室管理标准&#xff0c;全称为《检测和校准实验室能力的通用要求》&#xff0c;由国际标准化组织&#xff08;ISO&#xff09;和国际电工委员会&#xff08;IEC&#xff09;联合发布。以下是对ISO17025最新认证消息及相关内容的归纳&#xf…...

ASP.NET Core Web API 控制器

文章目录 一、基类&#xff1a;ControllerBase二、API 控制器类属性三、使用 Get() 方法提供天气预报结果 在深入探讨如何编写自己的 PizzaController 类之前&#xff0c;让我们先看一下 WeatherController 示例中的代码&#xff0c;了解它的工作原理。 在本单元中&#xff0c…...

RAID5原理简介和相关问题

1、RAID5工作原理 2、RAID5单块硬盘的数据连续吗&#xff1f; 3、RAID5单块硬盘存储的是原始数据&#xff0c;还是异或后的数据&#xff1f; 4、RAID5的分块大小 ‌RAID5的分块大小一般选择4KB到64KB之间较为合适‌。选择合适的分块大小主要取决于以下几个考量因素&#xff1…...

Axure RP 8安装(内带安装包)

通过网盘分享的文件&#xff1a;Axure8.0.zip 链接: https://pan.baidu.com/s/195_qy2iiDIcYG4puAudScA 提取码: 6xt8 --来自百度网盘超级会员v1的分享 勾选I Agree 安装完成...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件&#xff1a; 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

pam_env.so模块配置解析

在PAM&#xff08;Pluggable Authentication Modules&#xff09;配置中&#xff0c; /etc/pam.d/su 文件相关配置含义如下&#xff1a; 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块&#xff0c;负责验证用户身份&am…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

uniapp中使用aixos 报错

问题&#xff1a; 在uniapp中使用aixos&#xff0c;运行后报如下错误&#xff1a; AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...