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

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

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

相关文章

Linux高并发服务器开发 第六天(rwx 对于目录和文件的区别 gcc编译器 动态库静态库)

目录 1.rwx 对于目录和文件的区别 2.gcc 编译器 2.1编译过程 2.2gcc 的其他参数 3.动态库和静态库 3.1函数库 1.rwx 对于目录和文件的区别 r 文件的内容可以被查看。支持cat、more、head...vim &#xff1b;目录的内容可以被查看。ls、tree …

腾讯云云开发 Copilot 深度探索与实战分享

个人主页&#xff1a;♡喜欢做梦 欢迎 &#x1f44d;点赞 ➕关注 ❤️收藏 &#x1f4ac;评论 目录 一、引言 二、产品介绍 三、产品体验过程 四、整体总结 五、给开发者的复用建议 六、对 AI 辅助开发的前景展望 一、引言 在当今数字化转型加速的时代&#xff0c;…

潮玩设备AI语音交互方案,ESP32-S3芯片模组物联网通信技术

在智能化的世界里&#xff0c;每一个设备都是一个节点&#xff0c;它们通过无线网络相互连接&#xff0c;形成一个庞大的智能网络。这些设备能够相互通信&#xff0c;理解并判断用户的需求&#xff0c;从而提供更加个性化的服务。 而这一切的背后&#xff0c;是强大的处理器和…

Jensen-Shannon Divergence:定义、性质与应用

一、定义 Jensen-Shannon Divergence&#xff08;JS散度&#xff09;是一种衡量两个概率分布之间差异的方法&#xff0c;它是Kullback-Leibler Divergence&#xff08;KL散度&#xff09;的一种对称形式。JS散度在信息论、机器学习和统计学等领域中具有广泛的应用。 给定两个概…

使用 Three.js 创建烟花粒子特效教程

使用 Three.js 创建烟花粒子特效教程 今天&#xff0c;我们将使用 Three.js 来实现一个简单而美观的烟花粒子效果。烟花会在屏幕随机位置生成&#xff0c;粒子在爆炸后呈现出散射、下降、逐渐消散的动态效果。先来看一下效果。 第一步&#xff1a;搭建基础场景 在正式实现烟花…

神经网络-VggNet

2014年VggNet被推出&#xff0c;获取了ILSVRC2014比赛分类项目的第二名&#xff0c;第一名是GoogleNet&#xff0c;该网络在下节介绍&#xff0c;本节主要介绍VggNet。 VggNet可以称为是一个家族&#xff0c;根据层数的不同包括了A、A-LRN、B、C、D等网络结构&#xff0c;其中…

docker-compose搭建sfpt服务器

1. 搭建 创建sftp目录&#xff0c;进入该目录创建docker-compose.yml文件内容如下&#xff1a; version: 3.7services:sftp:image: atmoz/sftpcontainer_name: sftpports:- "122:22"volumes:- ./sftp-data:/homeenvironment:SFTP_USERS: "liubei:liubei161:10…

计算机视觉目标检测-1

文章目录 摘要Abstract1.目标检测任务描述1.1 目标检测分类算法1.2 目标定位的简单实现思路1.2.1 回归位置 2.R-CNN2.1 目标检测-Overfeat模型2.1.1 滑动窗口 2.2 目标检测-RCNN模型2.2.1 非极大抑制&#xff08;NMS&#xff09; 2.3 目标检测评价指标 3.SPPNet3.1 spatial pyr…

减速机润滑油的选用原则

减速机在投入运行前必须加入适当粘度的润滑油&#xff0c;须使齿轮间摩擦减小&#xff0c;遇高负荷及冲击负荷时&#xff0c;减速机才能充分发挥其机能。那么&#xff0c;应该如何选择减速机的润滑油呢&#xff1f; 1、粘度选择&#xff1a;粘度是齿轮油的一个重要理化指标&…

解线性方程组

直接三角分解&#xff08;LU分解&#xff0c;Doolittle分解&#xff09; ATM分解&#xff08;追赶法&#xff0c;Crout分解&#xff0c;克劳特分解&#xff09; 平方根法&#xff08;Cholesky分解&#xff0c;乔列斯基分解&#xff09; 矩阵的范数

使用 OpenCV 在图像中添加文字

在图像处理任务中&#xff0c;我们经常需要将文本添加到图像中。OpenCV 提供了 cv2.putText() 函数&#xff0c;可以很方便地在图像上绘制文本&#xff0c;支持多种字体、颜色、大小和位置等参数。 本文将详细介绍如何使用 OpenCV 在图像中添加文字&#xff0c;介绍 cv2.putTe…

如何高效学习PHP框架源码

为什么学习php框架源码 学习PHP框架源码是软件开发领域中的一个重要环节&#xff0c;它带来了诸多益处&#xff0c;无论是对于个人技能的提升&#xff0c;还是对于实际项目开发的优化&#xff0c;都有着不可忽视的作用。以下是一些具体的原因&#xff0c;解释了为什么学习PHP框…

HAL库STM32硬件IIC驱动数字电位器MCP4017

目录 一、芯片特性 二、硬件电路 三、工程搭建 四、IIC硬件地址 五、驱动程序 项目需要&#xff0c;最近用到了一个IIC接口的数字电位器&#xff0c;型号&#xff1a;MCP4017T-502E。对应阻值5K&#xff0c;使用STM32G030F6的硬件IIC驱动&#xff0c;发现简单的不得了&…

git设置项目远程仓库指向github的一个仓库

要将你的Git项目设置为指向GitHub上的远程仓库&#xff0c;你需要执行以下步骤&#xff1a; 创建GitHub仓库&#xff1a; 登录到你的GitHub账户。点击右上角的 “” 号&#xff0c;选择 “New repository” 创建一个新的仓库。填写仓库的名称&#xff0c;可以添加描述&#xff…

Vim 编辑器详细教程

Vim 编辑器详细教程 Vim 是一个强大的文本编辑器&#xff0c;以其高效的编辑能力和强大的功能著称&#xff0c;特别适合程序员和文字处理工作者。以下是一个详细的 Vim 教程&#xff0c;从基础操作到高级用法。 1. Vim 基础操作 1.1 Vim 的三种模式 正常模式&#xff08;Nor…

uni-app 中使用微信小程序第三方 SDK 及资源汇总

&#x1f380;&#x1f380;&#x1f380;uni-app 跨端开发系列 &#x1f380;&#x1f380;&#x1f380; 一、uni-app 组成和跨端原理 二、uni-app 各端差异注意事项 三、uni-app 离线本地存储方案 四、uni-app UI库、框架、组件选型指南 五、uni-app 蓝牙开发 六、uni-app …

17.2、应急事件场景与处理流程

目录 常见网络安全应急事件场景网络安全应急处理流程应急演练类型 常见网络安全应急事件场景 应急事件的处理场景&#xff0c;分成四类场景&#xff0c;恶意程序事件&#xff0c;网络攻击事件&#xff0c;还有网站相关的一些安全事件&#xff0c;最后是拒绝服务事件 恶意程序…

PostgreSQL表达式的类型

PostgreSQL表达式是数据库查询和操作中非常重要的组成部分。它们由一个或多个值、运算符和PostgreSQL函数组合而成,用于求值或执行特定的操作。PostgreSQL表达式类似于公式,是用查询语言编写的。它们可以用于查询数据库中的特定数据集,或者在进行数据操作时执行计算和逻辑判…

.NET能做什么?全面解析.NET的应用领域

.NET 是由微软开发的一个开源、跨平台的开发框架。它不仅支持构建各种应用程序&#xff0c;还能运行在不同的操作系统上&#xff0c;包括 Windows、Linux 和 macOS。自从 .NET Core 的推出&#xff0c;.NET 成为了一个现代化的开发平台&#xff0c;能够满足企业和开发者日益多样…

19_HTML5 Web Workers --[HTML5 API 学习之旅]

HTML5 Web Workers 是一种允许 JavaScript 在后台线程中运行的技术&#xff0c;从而不会阻塞用户界面或其他脚本的执行。通过使用 Web Workers&#xff0c;你可以执行复杂的计算任务而不影响页面的响应速度&#xff0c;提升用户体验。 Web Workers 的特点 Web Workers 是 HTM…