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

深入浅出 useEffect:React 函数组件中的副作用处理详解

useEffect 是 React 中的一个钩子函数,用于处理函数组件中的副作用操作,如发送网络请求、订阅消息、手动修改 DOM 等。下面是 useEffect 的用法总结:

  1. 基本用法
import React, { useState, useEffect } from 'react';function Example() {const [count, setCount] = useState(0);useEffect(() => {// 在这里执行副作用操作,模拟console.log('useEffect executed');}, []); // 不传第二个参数,每次组件状态更新都会执行;// 传入第二个参数,是个空数组,表示只在组件挂载时执行一次,模拟 componentDidMount (组件挂载完成);return (<div><p>You clicked {count} times</p><button onClick={() => setCount(count + 1)}>Click me</button></div>);
}
  1. 处理 cleanup

在组件卸载或者依赖项变化前执行清理操作,以避免内存泄漏。

import React, { useState, useEffect } from 'react';function Example() {const [count, setCount] = useState(0);useEffect(() => {// 在这里执行副作用操作 ...console.log('useEffect executed');// 返回一个 清理函数,模拟 componentWillUnmount (组件卸载前清理),在组件卸载或者依赖项变化前执行清理操作return () => {console.log('Cleanup executed');};}, []); // 传入空数组,表示只在组件挂载和卸载时执行return (<div><p>You clicked {count} times</p><button onClick={() => setCount(count + 1)}>Click me</button></div>);
}
  1. 处理依赖项变化

当依赖项变化时,重新执行副作用操作。

import React, { useState, useEffect } from 'react';function Example() {const [count, setCount] = useState(0);const [name, setName] = useState('');useEffect(() => {// 在这里执行副作用操作,模拟 componentDidUpdate (组件完成更新)console.log(`Hello, ${name}! You clicked ${count} times.`);}, [count, name]); // 当 count 或 name 变化时,重新执行副作用操作return (<div><p>You clicked {count} times</p><button onClick={() => setCount(count + 1)}>Click me</button><input type="text" value={name} onChange={e => setName(e.target.value)} /></div>);
}

注意:

  • 如果不传递第二个参数,那么每次组件重新渲染时都会执行副作用操作。
  • 如果传递空数组作为第二个参数,那么只在组件挂载时执行一次副作用操作。
  • 如果传递了依赖项数组,那么只有当依赖项发生变化时,才会重新执行副作用操作。
  • 传递空数组作为第二个参数,可以返回一个清理函数,在清理函数可以访问到当前的 state 和 props,但是不能修改它们。
http://www.lryc.cn/news/338531.html

相关文章:

  • 《QT实用小工具·十九》回车跳转到不同的编辑框
  • 基本的数据类型在16位、32位和64位机上所占的字节大小
  • 关注招聘 关注招聘 关注招聘
  • Django框架设计原理
  • Linux ARM平台开发系列讲解(QEMU篇) 1.2 新添加一个Linux kernel设备树
  • OSPF动态路由实验(思科)
  • MyBatis 等类似的 XML 映射文件中,当传入的参数为空字符串时,<if> 标签可能会导致 SQL 语句中的条件判断出现意外结果。
  • git的安装
  • 蓝桥杯嵌入式模板(cubemxkeil5)
  • ELFK (Filebeat+ELK)日志分析系统
  • HttpClient、OKhttp、RestTemplate接口调用对比( Java HTTP 客户端)
  • [旅游] 景区排队上厕所
  • 三 maven的依赖管理
  • iperf3 网络性能测试
  • 08 Php学习:if语句、Switch语句
  • 二分查找的边界问题是怎么产生的?
  • 华为 2024 届校园招聘-硬件通⽤/单板开发——第十套
  • 五子棋:不会下五子棋也没关系,会用Java写五子棋就行
  • 【VUE】使用Vue和CSS动画创建滚动列表
  • 分布式结构化数据表Bigtable
  • langchain 加载 csv,json
  • Java-常见面试题收集(十三)
  • 第二证券策略:股指预计维持震荡格局 关注汽车、工程机械等板块
  • hcia datacom课程学习(6):路由与路由表基础
  • AI PC元年,华为的一张航海图、一艘渡轮和一张船票
  • NAT技术
  • 新能源汽车“价格战”之后,充电桩主板市场将会怎样?
  • appium driver install uiautomator2 安装失败
  • 学浪已购买视频怎么下载到本地?
  • k8s-pod设置执行优先级