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

13 React useEffect 详解

useEffect 是 React 中用于处理副作用操作的 Hook。副作用包括数据获取、订阅操作、手动修改 DOM 等。以下是一些 useEffect 的示例以及需要注意的知识:

1. 数据获取

import React, { useState, useEffect } from 'react';function DataFetching() {const [data, setData] = useState(null);useEffect(() => {const fetchData = async () => {const response = await fetch('https://api.example.com/data');const result = await response.json();setData(result);};fetchData();}, []); // 空数组作为依赖表示只在组件挂载时执行一次return (<div>{data && <p>Data: {data}</p>}</div>);
}
  • 需要注意的知识:
    • 异步操作应当在 useEffect 内部进行,以确保在组件渲染完成后执行。
    • 使用空依赖数组 [] 可以确保 useEffect 仅在组件挂载时执行一次。

2. 订阅操作

import React, { useState, useEffect } from 'react';function Subscription() {const [count, setCount] = useState(0);useEffect(() => {const intervalId = setInterval(() => {setCount(prevCount => prevCount + 1);}, 1000);return () => {clearInterval(intervalId);};}, []); // 空数组作为依赖表示只在组件挂载时执行一次return (<div><p>Count: {count}</p></div>);
}
  • 需要注意的知识:
    • useEffect 可以返回一个清理函数,在组件销毁时执行,用于清除副作用,比如取消订阅、清除定时器等。

3. 监听属性变化

import React, { useState, useEffect } from 'react';function PropChanges({ prop }) {const [count, setCount] = useState(0);useEffect(() => {setCount(count + 1);}, [prop]); // 当 prop 变化时触发 useEffectreturn (<div><p>Count: {count}</p></div>);
}
  • 需要注意的知识:
    • 通过传递一个包含变量的数组作为 useEffect 的依赖,可以监听该变量的变化并执行相应的副作用操作。

4. 手动修改 DOM

import React, { useEffect } from 'react';function DOMManipulation() {useEffect(() => {document.title = 'New Title';return () => {document.title = 'Original Title';};}, []); // 空数组作为依赖表示只在组件挂载时执行一次return (<div><p>DOM Manipulation Example</p></div>);
}
  • 需要注意的知识:
    • useEffect 内部可以进行一些 DOM 操作,但是需要确保操作不会导致 React 和 DOM 同步问题。
    • 返回的清理函数可以用来恢复原始状态,以避免内存泄漏或者其他副作用。

5. 使用多个 useEffect

import React, { useState, useEffect } from 'react';function MultipleEffects() {const [count, setCount] = useState(0);const [data, setData] = useState(null);useEffect(() => {// effect for countdocument.title = `Count: ${count}`;return () => {document.title = 'Original Title';};}, [count]); // 当 count 变化时触发 useEffectuseEffect(() => {// effect for dataconst fetchData = async () => {const response = await fetch('https://api.example.com/data');const result = await response.json();setData(result);};fetchData();return () => {// cleanup for data};}, []); // 空数组作为依赖表示只在组件挂载时执行一次return (<div><p>Count: {count}</p>{data && <p>Data: {data}</p>}<button onClick={() => setCount(count + 1)}>Increment</button></div>);
}
  • 需要注意的知识:
    • 可以在同一个组件中使用多个 useEffect,每个 useEffect 之间相互独立。
    • 每个 useEffect 可以有自己的清理函数。

useEffect 的依赖可以分为三种情况:

  1. 空依赖数组:表示 useEffect 仅在组件挂载时执行一次。
  2. 包含具体依赖的数组:表示 useEffect 会在指定依赖发生变化时执行。
  3. 没有依赖数组:表示 useEffect 在每次组件渲染时都会执行。

下面是针对每种情况的详细示例以及注意知识:

1. 空依赖数组

import React, { useState, useEffect } from 'react';function EmptyDependencyExample() {const [count, setCount] = useState(0);useEffect(() => {console.log("Component mounted");return () => {console.log("Component unmounted");};}, []); // 空依赖数组表示仅在组件挂载和卸载时执行return (<div><p>Count: {count}</p><button onClick={() => setCount(count + 1)}>Increment</button></div>);
}export default EmptyDependencyExample;
  • 注意知识:
    • 使用空依赖数组 [] 可以确保 useEffect 仅在组件挂载时执行一次。
    • 清理函数用于执行清理工作,比如取消订阅、清除定时器等。

2. 具体依赖的数组

import React, { useState, useEffect } from 'react';function DependencyArrayExample({ prop }) {const [count, setCount] = useState(0);useEffect(() => {console.log("Component mounted or prop changed");// 每次 prop 或 count 变化时都会触发 useEffectreturn () => {console.log("Component unmounted or prop changed");};}, [prop, count]); // 传入依赖数组表示当其中任一依赖变化时执行return (<div><p>Count: {count}</p><button onClick={() => setCount(count + 1)}>Increment</button></div>);
}export default DependencyArrayExample;
  • 注意知识:
    • 通过传递一个包含变量的数组作为 useEffect 的依赖,可以监听该变量的变化并执行相应的副作用操作。
    • 当数组中的任一依赖变化时,useEffect 将会重新执行。

3. 没有依赖数组

import React, { useState, useEffect } from 'react';function NoDependencyExample() {const [count, setCount] = useState(0);useEffect(() => {console.log("Component rendered");return () => {console.log("Component re-rendered");};}); // 没有依赖数组表示在每次组件渲染时执行return (<div><p>Count: {count}</p><button onClick={() => setCount(count + 1)}>Increment</button></div>);
}export default NoDependencyExample;
  • 注意知识:
    • 没有传递依赖数组时,useEffect 在每次组件渲染时都会执行。
    • 当需要在组件渲染时执行某些操作,而不是依赖于特定的变量时,可以使用没有依赖数组的 useEffect

一个函数组件中可以包含多个 useEffect。每个 useEffect 都可以处理不同的副作用,使代码更模块化和可维护。下面是一个示例:

import React, { useState, useEffect } from 'react';function MultipleEffectsExample() {const [count, setCount] = useState(0);const [data, setData] = useState(null);// 第一个 useEffect 处理 count 的副作用useEffect(() => {document.title = `Count: ${count}`;return () => {document.title = 'Original Title';};}, [count]); // 依赖于 count 的变化// 第二个 useEffect 处理 data 的副作用useEffect(() => {const fetchData = async () => {const response = await fetch('https://api.example.com/data');const result = await response.json();setData(result);};fetchData();return () => {// 在组件卸载或者 data 更新时执行清理操作// 比如取消请求等};}, [data]); // 依赖于 data 的变化return (<div><p>Count: {count}</p><p>Data: {data}</p><button onClick={() => setCount(count + 1)}>Increment</button></div>);
}export default MultipleEffectsExample;

相关文章:

  • uniapp先显示提示消息再返回上一页
  • 数据结构刷题篇 之 【力扣二叉树基础OJ】详细讲解(含每道题链接及递归图解)
  • Python 进阶教程
  • 算法部署总结
  • math模块篇(七)
  • 【笔试】美团2023年秋招第1场笔试(后端数开软件方向)
  • Java基础语法(二)
  • 骗子查询系统源码
  • 在vue中使用echarts饼图示例
  • C++——vector类及其模拟实现
  • 微信小程序第四章总结
  • 前端 JS 压缩图片的思路(附源码)
  • Android-AR眼镜屏幕显示
  • 数字后端概念——FinFET/Nanosheet FET
  • 数据结构进阶篇 之 【二叉树链序存储】的整体实现讲解
  • Android系统模拟器绘制实现概述
  • C++11: atomic 头文件
  • docker容器内的网络抓包
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • Invalidate和postInvalidate的区别
  • Linux中的硬链接与软链接
  • VuePress 静态网站生成
  • 番外篇1:在Windows环境下安装JDK
  • 服务器从安装到部署全过程(二)
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (一)80c52学习之旅-起始篇
  • (转)linux下的时间函数使用
  • ./configure,make,make install的作用
  • .NET DataGridView数据绑定说明
  • .NET Framework 服务实现监控可观测性最佳实践
  • .NET Micro Framework 4.2 beta 源码探析
  • .NET/C# 编译期能确定的字符串会在字符串暂存池中不会被 GC 垃圾回收掉
  • .NET的微型Web框架 Nancy
  • .NET轻量级ORM组件Dapper葵花宝典
  • .NET实现之(自动更新)
  • /usr/bin/python: can't decompress data; zlib not available 的异常处理
  • @Transactional 竟也能解决分布式事务?
  • [ 渗透工具篇 ] 一篇文章让你掌握神奇的shuize -- 信息收集自动化工具
  • [.net]官方水晶报表的使用以演示下载
  • [.NET]桃源网络硬盘 v7.4
  • [2021]Zookeeper getAcl命令未授权访问漏洞概述与解决
  • [APIO2015]巴厘岛的雕塑
  • [AutoSar]BSW_OS 01 priority ceiling protocol(PCP)
  • [BUUCTF NewStarCTF 2023 公开赛道] week4 crypto/pwn
  • [C/C++]数据结构 栈和队列()