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

news/2024/12/26 21:06:16/

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/news/1558350.html

相关文章

使用 Docker 打包和运行 Vue 应用

在现代开发中&#xff0c;Docker 是一个强大的工具&#xff0c;可以帮助开发者将应用及其依赖打包到一个轻量级的容器中。本文将基于你提供的 Dockerfile 示例&#xff0c;指导你如何使用 Docker 打包和运行一个 Vue 应用。 1. 项目准备 首先&#xff0c;确保你已经安装了 No…

Nginx配置:如何在一个域名下运行两个网站

在现代的Web应用开发中&#xff0c;网站的数量和复杂性越来越高&#xff0c;多个网站使用同一个域名的情况也越来越常见。通过Nginx配置&#xff0c;我们可以轻松实现两个网站共用一个域名&#xff0c;并根据特定的路径、子域名或其他规则对流量进行分发。本文将详细介绍如何使…

【学习总结|DAY020】Java FIle、字符集、IO流

今天学习了Java中存储和读写数据的重要工具&#xff1a;File和IO流。这两者相辅相成&#xff0c;共同构成了Java处理文件和数据的基石。 File&#xff1a;文件操作利器 File类代表文件和目录路径名&#xff0c;可以用来获取文件信息、创建/删除文件/目录、判断文件类型等。 …

STM32-笔记9-电动车报警器

1、项目前期准备 接线如图所示&#xff1a; 2、这里主要用到07、08、09项目工程文件&#xff0c;复制09项目工程文件&#xff0c;重命名为10-电动车报警器项目 把08-继电器定时开闭项目中的alarm文件夹复制到10项目中 将alarm文件夹中的内容加载到项目文件中 3、代码&#x…

vscode写python,遇到问题:ModuleNotFoundError: No module named ‘pillow‘(已解决 避坑)

1 问题&#xff1a; ModuleNotFoundError: No module named pillow 2 原因&#xff1a; 原因1&#xff1a;安装Pillow的pip命令所处的python版本与vscode调用的python解释器版本不同。 如&#xff1a; 原因2&#xff1a;虽然用的是pillow&#xff0c;但是写代码的时候只能用…

谷歌浏览器的网络安全检测工具介绍

作为全球最受欢迎的浏览器之一&#xff0c;谷歌浏览器不仅提供了快速、便捷的浏览体验&#xff0c;还内置了一系列强大的网络安全检测工具&#xff0c;帮助用户识别潜在的网络威胁&#xff0c;保护个人隐私和数据安全。本文将详细介绍谷歌浏览器中的几项关键网络安全检测功能&a…

CUDA11.4版本的Pytorch下载

由于CUDA11.4版本找不到对应的pip下载&#xff0c;可以用CUDA11.3版本 解决方案&#xff1a; 可以在对应环境输入&#xff1a; pip install torch1.11.0cu113 torchvision0.12.0cu113 torchaudio0.11.0 --extra-index-url https://download.pytorch.org/whl/cu113

spring boot的配置文件属性注入到类的静态属性

假设我们有一个名为some.property的属性&#xff0c;它在Spring配置文件中定义了值&#xff0c;例如application.properties或application.yml。 1. 非静态字段 为什么推荐&#xff1f; 简单直接&#xff1a;不需要额外的配置或复杂的逻辑。符合Spring的设计理念&#xff1a…