关于在react的useEffect使用axios请求出现两次的问题

问题原因

在react18中启用了严格模式。

解决方法

  1. 删除main.tsx中的<React.StrictMode>标签,使用useEffect就不会出现请求两次的情况
  2. 借助useRef解决。

相关代码

let [pageNum, setPageNum] = useState<number>(1);
let [pageSize, setPageSize] = useState<number>(10);
let [dataSource, setDataSource] = useState<DataType[]>([]);
let [total, setTotal] = useState<number>(0);
let renderRef = useRef<boolean>(true);

const loadData = async () => {
    await axios
        .get(`url`, {
             pageNum,
             pageSize
         })
         .then((resp: any) => {
             setDataSource(resp.rows);
             setTotal(resp.total);
         });
};

useEffect(() => {
    if (renderRef.current) {
       renderRef.current = false;
       return;
    }
    loadData();
}, [pageNum, pageSize]);

上述的解决方法任选一种即可。 

后记:

      至于其他在react的hooks中的useEffect遇到执行两次的情况,解决的方式与上述的思路差不多。

此外react官方的说明

  • 这是React18的新特性,只有在开发模式下且使用了严格模式才会触发2次,生产环境与原来一样
  • 执行2次是为了模拟立即卸载组件和重新挂载组件
  • React未来会增加特性,允许其保留状态的同时能够做到仅仅删除或者添加UI部分

我这是在初学的时候遇到的问题,开始还以为是出了啥bug。后来去了解了才发现,如果不介意开发模式下出现两次请求的情况,可以选择无视它,毕竟正式环境不会出现。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
React使用 Axios 进行网络请求时,解决跨域问题可以通过以下方法: 1. 在后端服务器开启 CORS:在后端服务器的响应头中添加 CORS 相关的头信息,允许指定的域名进行跨域访问。可以在后端的响应中添加如下的头信息: ``` Access-Control-Allow-Origin: http://localhost:3000 // 允许访问的域名 Access-Control-Allow-Methods: GET, POST, PUT, DELETE // 允许的请求方法 Access-Control-Allow-Headers: Content-Type // 允许的请求头 ``` 请注意,在生产环境中,应该限制允许跨域访问的域名,避免安全风险。 2. 使用代理服务器:可以在开发环境中使用代理服务器来解决跨域问题。在 React 的配置文件(例如 `package.json` 或 `webpack.config.js`)中,将代理服务器的地址配置为 Axios 请求的基础路径。例如: ```javascript axios.defaults.baseURL = '/api'; // 代理服务器的地址 ``` 然后,在网络请求时,只需使用相对路径即可。 3. JSONP (仅适用于 GET 请求):如果后端支持 JSONP,可以使用 Axios 发送 JSONP 请求来避免跨域问题。通过将 `callback` 参数添加到请求 URL 中,使得响应返回一个函数调用。例如: ```javascript axios.get('http://api.example.com/data?callback=handleResponse') .then(response => { // 处理响应数据 }) .catch(error => { // 处理错误 }); ``` 在全局作用域下定义 `handleResponse` 函数,用于处理响应数据。 以上是一些常见的解决跨域问题的方法,你可以根据你的具体情况选择适合的方法。希望对你有所帮助!
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值