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

学习React-12-useEffect

纯函数&副函数
纯函数(Pure Function)
同样的输入,必定得到同样的输出,而且执行过程中不修改外部世界。
  1. 相同输入 → 相同输出(确定性)。
  2. 无副作用(不依赖、不修改外部状态)。
  3. 不依赖系统时间、随机数、I/O 等“不稳定”数据。

小栗子

// 纯函数:计算订单折扣价
function getDiscountedPrice(price, rate) {return price * rate;   // 只依赖参数,不改外部,无 I/O
}
副函数(Impure Function / Side-effect Function)
执行时会对外部世界“动手脚”——改全局变量、写日志、发请求、改 DOM、读写文件、随机数、获取时间 … 都属于副作用。
  1. 依赖或修改了外部可变状态。
  2. 做了I/O(网络、磁盘、控制台)。
  3. 使用了非确定性数据(Date.now()、Math.random())。

小栗子

// 副函数:把折扣价写进全局变量 + 打印日志
let finalPrice = 0;
function applyDiscount(price, rate) {finalPrice = price * rate;      // 改外部console.log('新价格:', finalPrice); // I/Oreturn finalPrice;
}
sueEffect

useEffect 是 React Hook 的核心成员之一,它让函数组件拥有了生命周期能力——也就是副作用(side-effect)管理

基本用法

语法:

useEffect(effect: () => (void | (() => void | undefined)), deps?: ReadonlyArray<any>)

参数:

  • effect: 一个函数,React 会在渲染提交到屏幕后调用它。可以返回一个(可选)清理函数(cleanup),组件卸载或依赖变化时会先执行它。
  • deps(可选):依赖数组,告诉 React 何时重新运行 effect。当deps里面变量的值发生变化的时候会重新调用effect。

返回值:

let a = useEffect(() => {})
console.log('a', a) //undefined
三种使用模式
依赖数组执行时机对应类生命周期
不传每次渲染后都执行componentDidUpdate
[]挂载后执行一次componentDidMount
[a, b]a 或 b 变化时执行自定义
小栗子

① 挂载后发请求(仅一次)

useEffect(() => {fetchUser().then(setUser);
}, []);   // 空依赖 → 只运行一次

② 订阅 & 清理

useEffect(() => {const id = setInterval(() => tick(), 1000);return () => clearInterval(id); // 清理函数
}, []);

③ 依赖变化时重新执行

useEffect(() => {document.title = `当前计数:${count}`;
}, [count]); // count 变了就重新执行
小案例

需求: 实现根据用户的输入展示对应的信息。
小工具:https://jsonplaceholder.typicode.com 可以模拟用户数据进行增删查改

import React, { useState, useEffect } from "react"export function EffectDemo() {interface UserData {id: numbername: stringusername: stringphone: stringwebsite: string}const [uid, setUid] = useState(1);const [user, setUser] = useState<UserData | null>(null);const [loading, setLoading] = useState(false);useEffect(() => {setLoading(true)// https://jsonplaceholder.typicode.com 可以模拟数据fetch(`https://jsonplaceholder.typicode.com/users/${uid}`).then(res => res.json()).then(data => { setUser(data); setLoading(false) })}, [uid])return (<div><h1>User Information</h1><input type="text" value={uid === 0 ? '': uid} onChange={(e) => setUid(Number(e.target.value))} /><p>姓名:{user && user.name}</p><p>电话:{user && user.phone}</p><p>网址:{user && user.website}</p><h1>{loading && <span>Loading...</span>}</h1></div>)
}export default EffectDemo;

实现效果:
请添加图片描述

注意事项
  1. effect 运行在渲染之后,是异步的;不会阻塞浏览器绘制。
  2. 每次重新执行 effect 前,React 会先调用上一次返回的清理函数(如果有)。
  3. 不要在 effect 里直接 setState 造成死循环;如果必须,请用条件或 useCallback/useRef 控制。
  4. 依赖数组要“诚实”:用到什么变量就填什么,否则会出现闭包旧值 bug;官方推荐用 eslint-plugin-react-hooks 自动检查。
  5. 如果真想模拟“挂载 / 卸载”两次调用(React 18 严格模式 + 开发环境)不要试图绕过,这是 React 故意暴露潜在内存泄漏的方式。

文章转载自:

http://7US566OH.qdscb.cn
http://qWYL6w3Z.qdscb.cn
http://QOpRYAKF.qdscb.cn
http://mBeG5JqL.qdscb.cn
http://9nQG3dDq.qdscb.cn
http://Xrb3uHDG.qdscb.cn
http://GhrgPAtJ.qdscb.cn
http://nAF4uS61.qdscb.cn
http://yBhAft7W.qdscb.cn
http://1m1wmjOx.qdscb.cn
http://4byHfnr4.qdscb.cn
http://MCh9qH0P.qdscb.cn
http://vgBvl0AO.qdscb.cn
http://Kx2axhtx.qdscb.cn
http://yRrz83iV.qdscb.cn
http://Tzg99d1N.qdscb.cn
http://zhFWFklQ.qdscb.cn
http://7UbXeILU.qdscb.cn
http://SK300O4s.qdscb.cn
http://yhEKxnZq.qdscb.cn
http://rlLSHixt.qdscb.cn
http://sQ5Lbp9o.qdscb.cn
http://sBveMcpP.qdscb.cn
http://f44R5WRB.qdscb.cn
http://ivgW8v0Q.qdscb.cn
http://33kXY2bV.qdscb.cn
http://4leso6mu.qdscb.cn
http://V6AKFDuq.qdscb.cn
http://dYLSab67.qdscb.cn
http://mMT7uC70.qdscb.cn
http://www.dtcms.com/a/384619.html

相关文章:

  • MFC_Button
  • [K8S学习笔记]YAML相关
  • 贪心算法在物联网能耗优化中的应用
  • 使用paddlepaddle-Gpu库时的一个小bug!
  • 从 Linux 到 Kubernetes:操作系统的演变与云原生未来
  • Java网络编程:(socket API编程:TCP协议的 socket API -- 服务器端处理请求的三个步骤)
  • 新能源汽车总装车间案例:四台S7-1200通过无线网桥同步控制16组ET 200SP的秘诀
  • k8s事件驱动运维利器 shell operator
  • GitHub Actions 部署配置
  • java后端工程师进修ing(研一版‖day45)
  • k8s核心资料基本操作
  • Redis 在电商系统中的应用:高并发场景下的架构艺术
  • RK3588:MIPI底层驱动学习——芯外拾遗第一篇:从四个模块到整个“江湖”
  • K8S里的“豌豆荚”:Pod
  • OpenStack 管理与基础操作学习笔记(一):角色、用户及项目管理实践
  • 大数据毕业设计选题推荐-基于大数据的金融数据分析与可视化系统-Spark-Hadoop-Bigdata
  • Python爬虫实战:研究Pandas,构建期货数据采集和分析系统
  • 软考中级习题与解答——第六章_计算机硬件基础(3)
  • Nvidia显卡架构解析与cuda应用生态浅析
  • AppStore 如何上架?iOS 应用发布全流程、uni-app 打包上传 ipa、App Store 审核与多工具组合实战指南
  • 贪心算法应用:卫星链路调度问题详解
  • 基于https的数据加密技术
  • 自学嵌入式第四十一天:单片机-中断
  • 二分图 系列
  • DDAC工作流的PyCharm项目前置准备清单
  • 【Kubernetes】K8s 集群外服务配置 Service 访问
  • RESTFul API接口设计指南_V2
  • Linux第十七讲:应用层自定义协议与序列化
  • ESLint 自定义规则开发
  • 三维地震数据体:形态、处理流程与勘探应用笔记