Вам необходимо сделать что-то похожее на это.
import { useEffect, useState } from 'react';
const useFetch = (url) => {
const [response, setResponse] = useState(null);
const [loading, setLoading] = useState(false);
const [hasError, setHasError] = useState(false);
useEffect(() => {
setLoading(true);
fetch(
url,{
method: 'GET',
}).then(res => {
setResponse(res);
setLoading(false);
})
.catch(() => {
setHasError(true);
setLoading(false);
});
}, [url]);
return [response, loading, hasError];
};
export default useFetch;
, чтобы использовать это.
import { useEffect, useState } from 'react';
const component = () => {
const [response, loading, hasError] = useFetch('http://myurl.com/api/post');
useEffect(() => {
if(response !== null){
console.log(response);
}
});
return <>
{loading && <span>loading</span> }
{hasError && <span>Some error!!!</span>}
<div> {JSON.stringify(response)} </div>
</>;
}
Я бы предпочел использовать useReducer, но в этом случае, поскольку вы запрос хуков. Вот мой лучший подход к тому, что вы сделали до сих пор.