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

React页面加载时API请求触发两次问题排查求助

API请求触发两次的原因及解决方法

根本原因

在React 18的严格模式下,开发环境中组件会被挂载两次,这是React官方的设计,目的是检测组件中潜在的bug(比如未正确清理的副作用)。你的useEffect依赖项为空数组,会在组件挂载时执行,因此在开发环境中会触发两次API请求,而生产环境下不会出现这个问题。

解决方法

  • 关闭严格模式:若开发阶段想避免重复请求,可修改项目入口文件(通常是index.js或main.jsx),移除<StrictMode>对根组件的包裹:
    原代码:

    root.render(
      <StrictMode>
        <App />
      </StrictMode>
    );
    

    修改后:

    root.render(<App />);
    
  • 忽略开发环境的重复触发:这是React 18开发环境的正常行为,生产环境会自动恢复单次执行,若不影响开发流程,可无需处理。

  • 添加请求去重逻辑:如果担心重复请求带来的资源浪费,可给请求函数添加状态标记,避免重复执行:

    import React, { useEffect, useState } from "react";
    function App() {
      const [user, setUser] = useState([]);
      const [isLoading, setIsLoading] = useState(false);
    
      const fetchData = async () => {
        // 若正在请求则直接返回
        if (isLoading) return;
        setIsLoading(true);
        try {
          const response = await fetch("https://jsonplaceholder.typicode.com/users", {
            method:'GET',
            headers: {
              'Accept': 'application/json',
              "Content-Type": "application/x-www-form-urlencoded"
            }
          });
          const data = await response.json();
          setUser(data);
        } catch (err) {
          console.error("请求失败:", err);
        } finally {
          setIsLoading(false);
        }
      }
    
      useEffect(() => {
        fetchData();
      },[])
    
      return (
        <main> 
          <h1>User List</h1> 
          <ul> 
            {user.length > 0 && user.map((userObj) => ( 
              <li key={userObj.id}>{userObj.name}</li> 
            ))} 
          </ul> 
        </main>
      );
    }
    export default App;
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 20:33:30