网站首页 > 教程文章 正文
useEffect 理解:
- 是一个hook函数
- 渲染引起的操作
什么是副作用:
副作用是相对于主作用来说的,一个函数除了主作用,其他的作用就是副作用。对于 React 组件来说,主作用就是根据数据(state/props)渲染 UI,除此之外都是副作用(比如,手动修改 DOM)
常见的副作用:
- 数据请求 ajax发送
- 手动修改dom
- localstorage操作
useEffect函数的作用就是为react函数组件提供副作用处理的!
使用步骤:
- 导入 useEffect 函数
- 调用 useEffect 函数,并传入回调函数
- 在回调函数中编写副作用处理(dom操作)
- 修改数据状态
- 检测副作用是否生效
语法:useEffect(()=>{},[])
import { useEffect, useState } from 'react'
function App() {
const [count, setCount] = useState(0)
useEffect(()=>{document.title = `当前已点击了${count}次`})
return (<button onClick={() => { setCount(count + 1) }}>{count}</button>)
}
export default App
import { useState, useEffect } from 'react'
function App() {
const [arr, setArr] = useState([])
useEffect(()=>{
async function fn(){
const res = await fetch('')
const data = await res.json()
setArr(data.data.channels)
}
fn()
},[])
return (
<div className="App">
<ol>
{arr.map((item)=><li key={item.id}>{item.name}</li>)}
</ol>
</div>
);
}
export default App;
依赖项控制执行时机:
1. 不添加依赖项
组件首次渲染执行一次,以及不管是哪个状态更改引起组件更新时都会重新执行
- 组件初始渲染
- 组件更新 (不管是哪个状态引起的更新)
2. 添加空数组
组件只在首次渲染时执行一次
3. 添加特定依赖项
副作用函数在首次渲染时执行,在依赖项发生变化时重新执行
注意事项
useEffect 回调函数中用到的数据(比如,count)就是依赖数据,就应该出现在依赖项数组中,如果不添加依赖项就会有bug出现
4. 清理副作用
如果想要清理副作用 可以在副作用函数中的末尾return一个新的函数,在新的函数中编写清理副作用的逻辑
注意执行时机为:
- 组件卸载时自动执行
- 组件更新时,下一个useEffect副作用函数执行之前自动执行
import { useEffect, useState } from "react"
const App = () => {
const [count, setCount] = useState(0)
useEffect(() => {
const timerId = setInterval(() => {
setCount(count + 1)
}, 1000)
return () => {
// 用来清理副作用的事情
clearInterval(timerId)
}
}, [count])
return (
<div>
{count}
</div>
)
}
export default App
猜你喜欢
- 2025-06-18 让 React 代码行数减少78%的 htmlx 有这么神?
- 2025-06-18 如何做 React 性能优化?(react 项目优化)
- 2025-06-18 React 渲染流程可视化,有大佬实现了!
- 2025-06-18 与 Vue 相伴四年,终究还是没抵住 React 的巨大诱惑
- 2025-06-18 25、Tailwind:魔法速记术——React 19 样式新思路
- 2025-06-18 推荐!React 生态不容错过的6大顶级虚拟滚动库?
- 2025-06-18 React18 Hook中的useState和useEffect
- 2025-06-18 8.3K star!React Bits,让你拥有全网几乎所有动画效果
- 2025-06-18 react-store(react18+)-同步和异步操作仓库
- 2025-06-18 再见Cursor!Trae Pro 登场(cursor中的热门插件)
- 最近发表
-
- 一课译词:一刀两断(一刀两断成语解释)
- 核心短语break up用法解析(breakd短语)
- HTML+CSS 实现商品图片列表放大视觉效果 复制完整代码即可马上调用
- 前端实现右键自定义菜单(前端实现右键自定义菜单怎么设置)
- Python中docx与docxcompose批量合并多个Word文档并添加分页符
- Java 将Excel转为XML(java将xls转换成xlsx)
- jq+ajax+bootstrap改了一个动态分页的表格
- css兼容性问题及一些常见问题汇总大全,赶快收藏!
- Java 的业务逻辑验证框架 之-fluent-validator
- 小程序cover-view踩坑系列2(微信小程序overflow)
- 标签列表
-
- location.href (44)
- document.ready (36)
- git checkout -b (34)
- 跃点数 (35)
- 阿里云镜像地址 (33)
- qt qmessagebox (36)
- mybatis plus page (35)
- vue @scroll (38)
- 堆栈区别 (33)
- 什么是容器 (33)
- sha1 md5 (33)
- navicat导出数据 (34)
- 阿里云acp考试 (33)
- 阿里云 nacos (34)
- redhat官网下载镜像 (36)
- srs服务器 (33)
- pico开发者 (33)
- https的端口号 (34)
- vscode更改主题 (35)
- 阿里云资源池 (34)
- os.path.join (33)
- redis aof rdb 区别 (33)
- 302跳转 (33)
- http method (35)
- js array splice (33)