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

为何Axios会向服务器发送三次GET请求?

解决Axios在React组件中发送三次请求的问题

你的代码逻辑本身没问题,但出现三次请求通常是以下原因导致的:

  • React 18严格模式的开发环境行为:React 18的Strict Mode会在开发环境下重复执行副作用(比如useEffect)、组件渲染等操作,用来检测潜在的代码问题,这会让请求被触发两次,加上初始的一次就会出现三次请求,生产环境下这个行为会自动消失。
  • 组件被多次挂载:如果你的<Components />组件在多个地方被渲染,或者父组件的状态变化导致它反复卸载再挂载,也会触发多次请求。

具体解决办法

1. 处理Strict Mode导致的开发环境重复请求

如果只是开发环境的问题,不需要修改业务代码,生产环境会自动恢复正常。如果不想在开发阶段看到重复请求,可以去掉项目入口文件里的<StrictMode>包裹:

// index.js 入口文件示例
import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';

const root = ReactDOM.createRoot(document.getElementById('root'));
// 移除<StrictMode>标签
root.render(<App />);

2. 给请求添加取消逻辑(推荐)

不管是什么原因导致的重复请求,都应该给Axios请求加上取消机制,避免无效请求占用资源:

import React from 'react';
import axios from "axios";

export const Components = (props) => {
  const [data, setData] = React.useState([])

  React.useEffect(() => {
    // 创建AbortController实例
    const controller = new AbortController();
    const { signal } = controller;

    axios.get('http://localhost:8000/api/posts', { signal })
      .then(res => setData(res.data))
      .catch(err => {
        // 只处理非取消类的错误
        if (!axios.isCancel(err)) {
          console.error('请求失败:', err);
        }
      });

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

  return data.map((p, index) => (
    <p key={index}>{p.title}</p>
  ))
}

export default Components;

3. 排查组件是否被重复挂载

可以在组件内添加日志,确认是否被多次挂载:

export const Components = (props) => {
  console.log('组件已挂载');
  // ... 其他代码
}

如果日志打印多次,说明组件被重复渲染/挂载,需要检查父组件的逻辑,比如是否在循环中渲染了该组件,或者路由切换的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 23:10:33