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

React中REST API重复调用问题:如何避免重复请求?

解决React useEffect发起两次请求的问题

问题原因

你遇到的两次请求是**React 18开发环境下严格模式(StrictMode)**的默认行为。StrictMode会刻意重复执行副作用(比如useEffect内的代码),目的是帮你提前发现代码里的潜在bug(比如内存泄漏、未正确清理的副作用),但生产环境下不会触发这个重复执行逻辑。

解决办法

1. 临时关闭严格模式(开发环境)

找到项目根组件(通常是index.tsx或main.tsx)里的<StrictMode>标签,直接移除它,开发环境中useEffect就只会执行一次。不过不推荐长期这么做,因为严格模式能帮你提前规避很多问题。

2. 优化请求逻辑,避免无效重复请求

即使严格模式触发重复执行,我们可以通过AbortController取消重复的请求,避免不必要的网络开销,同时修正你代码里的类型错误:

// 先定义正确的用户类型
type User = {
  id: number;
  name: string;
  // 其他字段根据实际接口补充
};

export const App: React.FC = () => {
  // 状态类型改为数组,因为接口返回的是用户数组
  const [users, setUsers] = useState<User[] | undefined>();

  useEffect(() => {
    const controller = new AbortController();
    const signal = controller.signal;

    fetch('https://jsonplaceholder.typicode.com/users', { signal })
      .then((response) => response.json())
      .then((json) => setUsers(json))
      .catch((error) => {
        // 忽略取消请求的错误
        if (error.name !== 'AbortError') {
          console.error('请求失败:', error);
        }
      });

    // 清理函数:组件卸载或useEffect重新执行时取消请求
    return () => controller.abort();
  }, []);

  // 组件返回内容示例
  return (
    <div>
      {users?.map(user => <div key={user.id}>{user.name}</div>)}
    </div>
  );
};

3. 生产环境自动恢复正常

当你构建生产版本时,React会自动关闭严格模式的重复执行逻辑,这时请求只会发起一次,不需要额外修改代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 19:07:37