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

React 18 useEffect钩子重复发起两次数据请求问题求助

useEffect 发起两次请求的原因及解决方法
  • 开发模式下StrictMode的影响
    React 18在开发环境(比如create-react-app创建的项目)默认开启StrictMode,这个模式会让组件挂载、卸载后再重新挂载一次,目的是帮你排查代码里的潜在副作用问题。你的useEffect用了空依赖数组,会在两次挂载时各执行一次,所以出现了两次请求。这个行为只在开发环境存在,打包到生产环境后就不会触发两次请求了。

  • 优化你的代码逻辑
    你现在循环调用setNewTaskContent,每次都更新状态,效率很低,而且直接把<Task />元素存在状态里也不是React的推荐做法。正确的方式是先把接口返回的原始数据存在状态中,渲染的时候再遍历数据生成组件:

    // 先声明状态存储任务数据
    const [tasks, setTasks] = useState([]);
    
    useEffect(() => {
      const fetchTasks = async () => {
        const res = await fetch('http://localhost:8080/tasks');
        const data = await res.json();
        console.log(data);
        // 一次性设置所有任务数据
        setTasks(data);
      };
      fetchTasks();
    }, []);
    
    // 在渲染阶段生成Task组件
    return (
      <div>
        {tasks.map(task => <Task key={task.id} task={task} />)}
      </div>
    );
    

    这样既避免了多次更新状态,也符合React状态管理的最佳实践——状态里存原始数据,而非JSX元素。

  • 开发环境临时屏蔽两次请求的方法
    如果你想在开发时暂时避免这个情况,可以找到项目入口文件(比如index.js或main.jsx),去掉包裹<App />的<StrictMode>标签。不过不建议长期这么做,因为StrictMode能帮你提前发现很多隐藏的代码问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 11:42:51