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

devtools/2024/12/27 1:17:43/

1、概述

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

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

2、写法

javascript">useEffect(fnc, dependencies)

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

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

2.1、依赖项不传

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

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

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

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

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

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

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

javascript">useEffect(() => {return () => {console.log('====组件将要卸载了=')}
}, [name])
2.5、清除定时任务
javascript">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、清除事件监听
javascript">useEffect(() => {// 组件挂载 监听视图窗口变化const resize = () => console.log('窗口大小变化');window.addEventListener('resize', resize);return() => {window.removeEventListener('resize', resize)}
}, [])
2.7、死循环

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

javascript"> 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 的依赖数组用于控制何时运行副作用函数


http://www.ppmy.cn/devtools/145672.html

相关文章

【漏洞复现】F5 BIG-IP Next Central Manager SQL注入漏洞(CVE-2024-26026)

🏘️个人主页: 点燃银河尽头的篝火(●’◡’●) 如果文章有帮到你的话记得点赞👍+收藏💗支持一下哦 一、漏洞概述 1.1漏洞简介 漏洞名称:F5 BIG-IP Next Central Manager SQL注入漏洞漏洞编号:CVE-2024-26026漏洞威胁等级:超危影响范围:BIG-IP Next Central Manage…

基于CNN-BiLSTM-selfAttention混合神经网络的多分类预测【MATLAB】

在深度学习中&#xff0c;不同神经网络架构的组合往往可以实现更强大的表现。将卷积神经网络&#xff08;CNN&#xff09;、双向长短期记忆网络&#xff08;BiLSTM&#xff09;和自注意力机制&#xff08;Self-Attention&#xff09;结合在一起&#xff0c;可以充分发挥三者的优…

springBoot发布https服务及调用

一、服务端发布https服务 1、准备SSL证书 &#xff08;1&#xff09;自签名证书&#xff1a;如果你只是用于开发或测试环境&#xff0c;可以生成一个自签名证书。 &#xff08;2&#xff09;CA 签名证书&#xff1a;对于生产环境&#xff0c;应该使用由受信任的证书颁发机构 …

【微信小程序】微信小程序中的异步函数是如何实现同步功能的

在微信小程序中&#xff0c;虽然很多 API 都是异步的&#xff0c;但可以通过一些方法来实现类似同步的功能。以下是几种常见的方法&#xff1a; 1. 使用 async/await async/await 是 ES2017 引入的语法糖&#xff0c;它基于 Promise 来实现异步操作的同步化写法。 示例代码 …

基于谱聚类的多模态多目标浣熊优化算法(MMOCOA-SC)求解ZDT1-ZDT4,ZDT6和工程应用--盘式制动器优化,MATLAB代码

一、MMOCOA-SC介绍 基于谱聚类的多模态多目标浣熊优化算法&#xff08;Multimodal Multi-Objective Coati Optimization Algorithm Based on Spectral Clustering&#xff0c;MMOCOA-SC&#xff09;是2024年提出的一种多模态多目标优化算法&#xff0c;该算法的核心在于使用谱…

FFmpeg音频解码详解

FFmpeg 探索之旅 一、FFmpeg 简介与环境搭建 二、FFmpeg 主要结构体剖析 三、FFmpeg 视频解码详解 FFmpeg音频解码详解 FFmpeg 探索之旅前言一、音频编码与解码基础&#xff08;一&#xff09;音频编码简述&#xff08;二&#xff09;音频解码本质 二、音频解码关键 API 深度剖…

TCP/IP 邮件

TCP/IP邮件是互联网通信中非常重要的应用之一。当我们发送电子邮件时&#xff0c;我们实际上并没有直接使用TCP/IP协议&#xff0c;而是通过电子邮件程序&#xff0c;例如微软的Outlook、莲花软件的Notes或Netscape Communicator等来实现。这些电子邮件程序背后使用了不同的TCP…

Redis 集群架构:高可用与扩展性

一、引言 在当今数字化时代&#xff0c;数据量呈爆炸式增长&#xff0c;对数据存储和处理的要求也越来越高。Redis作为一款高性能的键值对存储数据库&#xff0c;其集群架构在应对高并发、大数据量场景时展现出了独特的优势&#xff0c;成为众多企业构建高效、稳定系统的关键技…