Я использую redux & redux-saga для асинхронных операций c, что очень удобно с точки зрения читабельности, отладки и модульности моего кода. Однако, если вы хотите использовать ловушки, чтобы справиться с этим, вы также можете создать собственный крючок:
import React, { useState, useEffect } from 'react';
function useAsyncHook() {
const [data, setData] = useState([]);
const [loading, setLoading] = useState(false);
useEffect(() => {
async function fetchData() {
try {
setLoading(true);
const res = await fetch(
`ENDPOINT`
);
const data = await res.json();
setData(data);
} catch (error) {
setLoading(false);
}
}
}, []);
return [data, loading];
}
Тогда вы можете использовать его так:
function App() {
const [data, loading] = useAsyncHook();
return (
<div>
{!loading && <p>Loading...</p>}
{data && data.map(item => {
return <div>{item}</div>;
})
)}
</div>
);
}