You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React中useEffect钩子是什么?新手学习该钩子遇困惑

搞懂React的useEffect钩子

useEffect就是React专门用来处理组件渲染过程中副作用的钩子——先明确:像数据请求、DOM操作、订阅/取消订阅、定时器这些不属于「纯渲染逻辑」(纯渲染就是根据state/props生成UI的过程)的操作,都属于副作用。

核心作用

它帮你把这些副作用操作和组件的「挂载、更新、卸载」阶段绑定起来,让你能精准控制代码什么时候执行。

基础用法示例

比如组件挂载后请求数据:

import { useEffect, useState } from 'react';

function UserList() {
  const [users, setUsers] = useState([]);

  useEffect(() => {
    // 这里写副作用逻辑:发起请求获取用户列表
    async function fetchUsers() {
      const res = await fetch('/api/users');
      const data = await res.json();
      setUsers(data);
    }
    fetchUsers();
  }, []); // 空数组依赖:仅在组件第一次渲染完成(挂载)时执行一次

  return (
    <ul>
      {users.map(user => <li key={user.id}>{user.name}</li>)}
    </ul>
  );
}

依赖数组的关键作用

依赖数组决定了useEffect什么时候重新执行:

  • 传空数组[]:只在组件挂载时执行一次,之后不管组件怎么更新都不触发
  • 传特定值(比如[users]):只有当这个值发生变化时,才会重新执行副作用
  • 不传依赖数组:每次组件渲染完成后都会执行,慎用,容易导致无限循环

清理副作用的必要性

有些副作用如果不清理会造成内存泄漏(比如定时器、事件监听、订阅),useEffect支持返回一个清理函数,这个函数会在组件卸载或者依赖变化时执行:

useEffect(() => {
  const timer = setInterval(() => {
    console.log('每秒输出一次');
  }, 1000);

  // 组件卸载/依赖更新时,清除定时器
  return () => clearInterval(timer);
}, []);

和类组件生命周期的简单对应(不用硬记)

  • 空依赖的useEffect ≈ 类组件的componentDidMount
  • 带依赖的useEffect ≈ 类组件的componentDidUpdate(仅当依赖变化时)
  • 返回的清理函数 ≈ 类组件的componentWillUnmount + 更新前的清理操作

内容的提问来源于stack exchange,提问作者Ivana

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 06:25:03