React 通过异步等待(async/await)和钩子(hooks)从多个 API 获取数据是一种常见的模式,用于在组件加载时获取并处理数据。以下是这个过程的基础概念、优势、类型、应用场景以及可能遇到的问题和解决方案。
useState
和 useEffect
。以下是一个使用 useEffect
和 async/await
从多个 API 并行获取数据的示例:
import React, { useState, useEffect } from 'react';
function DataFetchingComponent() {
const [data, setData] = useState({ api1: null, api2: null });
useEffect(() => {
async function fetchData() {
try {
const [response1, response2] = await Promise.all([
fetch('https://api.example.com/data1'),
fetch('https://api.example.com/data2')
]);
const json1 = await response1.json();
const json2 = await response2.json();
setData({ api1: json1, api2: json2 });
} catch (error) {
console.error('Error fetching data:', error);
}
}
fetchData();
}, []);
return (
<div>
<h1>Data from APIs</h1>
<pre>{JSON.stringify(data, null, 2)}</pre>
</div>
);
}
export default DataFetchingComponent;
原因:网络问题或 API 服务器问题可能导致请求失败。
解决方案:
try/catch
块捕获错误并进行处理。const controller = new AbortController();
const signal = controller.signal;
setTimeout(() => controller.abort(), 5000); // 5秒超时
原因:如果需要按特定顺序处理数据,串行获取可能更合适。
解决方案:
async/await
按顺序调用 API。async function fetchDataSequentially() {
try {
const response1 = await fetch('https://api.example.com/data1');
const json1 = await response1.json();
const response2 = await fetch('https://api.example.com/data2');
const json2 = await response2.json();
setData({ api1: json1, api2: json2 });
} catch (error) {
console.error('Error fetching data:', error);
}
}
原因:如果在组件卸载后数据才到达,可能会导致内存泄漏或不必要的状态更新。
解决方案:
useEffect
的返回函数来清理副作用。useEffect(() => {
let isMounted = true;
async function fetchData() {
try {
const response = await fetch('https://api.example.com/data');
const json = await response.json();
if (isMounted) {
setData(json);
}
} catch (error) {
console.error('Error fetching data:', error);
}
}
fetchData();
return () => {
isMounted = false;
};
}, []);
通过这些方法,可以有效地从多个 API 获取数据并在 React 组件中进行管理。
领取专属 10元无门槛券
手把手带您无忧上云