在异步函数中正确使用 useEffect 和 useState 调用
Proper use of useEffect with useState called within async function
致敬!
我正在尝试(并成功地)在异步函数内复制数组。我正在使用这个数组来设置在 React 组件的顶层声明的数组的状态,如下所示:
const [retrievedData, setRetrievedData] = useState([]);
useEffect(() => {
setRetrievedData;
}, [retrievedData]);
async function fetchInfo() {
const promiseData = await Promise.all(<My fetch links array>)
);
const dataInJson = await promiseData.map((resp) => resp.json());
let actualData = [];
for (let i = 0; i < dataInJson.length; i++) {
const foo = await Promise.resolve(dataInJson[i]);
actualData.push(foo);
}
setRetrievedData(actualData);
}
fetchInfo();
此代码的问题在于它创建了一个无限循环的 setStates,即使我将 useEffect 第二个参数设置为空数组也是如此。我也尝试在调用 fetchInfo
函数时使用 async/await 但那只是 returns 当然是另一个 Promise。在处理此问题时,我还注意到 Promise.all 调用运行了两次。
非常感谢花时间阅读这个问题。
做这样的事情:
const [retrievedData, setRetrievedData] = useState({ data: [] });
const fetchInfo = useCallback(async () => {
// do your stuff here...
setRetrievedData({ data });
}, []);
useEffect(() => {
fetchInfo();
}, [fetchInfo]);
如果您打算追加数据到retrievedData
,那么您可以这样调用setRetrievedData
:
setRetrievedData(prevState => ({
data: [...prevState.data, newData]
}));
如果您仅在组件加载期间使用 fetchInfo
,您可以将其定义(没有 useCallback
)移动到您的 useEffect
并将一个空的依赖项数组传递给它,而不是.
所示
这是 react 中的常见模式
const Component = () => {
const [data, setData] = useState();
useEffect(()=>{
const fetchData = async () => {
const data = await fetch();
setData(data);
}
fetchData();
}, [])
return <div>{JSON.stringify(data)}</div>
}
致敬!
我正在尝试(并成功地)在异步函数内复制数组。我正在使用这个数组来设置在 React 组件的顶层声明的数组的状态,如下所示:
const [retrievedData, setRetrievedData] = useState([]);
useEffect(() => {
setRetrievedData;
}, [retrievedData]);
async function fetchInfo() {
const promiseData = await Promise.all(<My fetch links array>)
);
const dataInJson = await promiseData.map((resp) => resp.json());
let actualData = [];
for (let i = 0; i < dataInJson.length; i++) {
const foo = await Promise.resolve(dataInJson[i]);
actualData.push(foo);
}
setRetrievedData(actualData);
}
fetchInfo();
此代码的问题在于它创建了一个无限循环的 setStates,即使我将 useEffect 第二个参数设置为空数组也是如此。我也尝试在调用 fetchInfo
函数时使用 async/await 但那只是 returns 当然是另一个 Promise。在处理此问题时,我还注意到 Promise.all 调用运行了两次。
非常感谢花时间阅读这个问题。
做这样的事情:
const [retrievedData, setRetrievedData] = useState({ data: [] });
const fetchInfo = useCallback(async () => {
// do your stuff here...
setRetrievedData({ data });
}, []);
useEffect(() => {
fetchInfo();
}, [fetchInfo]);
如果您打算追加数据到retrievedData
,那么您可以这样调用setRetrievedData
:
setRetrievedData(prevState => ({
data: [...prevState.data, newData]
}));
如果您仅在组件加载期间使用 fetchInfo
,您可以将其定义(没有 useCallback
)移动到您的 useEffect
并将一个空的依赖项数组传递给它,而不是
这是 react 中的常见模式
const Component = () => {
const [data, setData] = useState();
useEffect(()=>{
const fetchData = async () => {
const data = await fetch();
setData(data);
}
fetchData();
}, [])
return <div>{JSON.stringify(data)}</div>
}