- Вы не можете
await
в функции setState
(setUrl
). - Вы возвращаете данные выборки, которые не используются позже.
Сначала вам нужно изменить свое мышление о том, как вы думаете об обработчиках реакции и когда вам нужно их использовать.
Насколько я понимаю, вы хотите получить некоторые данные с сервера, обновить хранилище при успешном извлечении и показывать ошибку при сбое запроса.
Вы должны делать это полностью или не делать этого вообще. Вы можете поместить отправку в ловушку или , вы можете забыть о ловушке и написать многоразовую fetchData
функцию и дескриптор setHasError
в useEffect
вашего компонента.
Их много способы решить эту проблему, но это мое предпочтительное решение:
import React, { Fragment, useState, useEffect, useReducer } from 'react';
import axios from 'axios';
export const useHttpRequest = (url, updateStore) => {
const [hasError, setHasError] = useState(false);
const fetchData = async (url) => {
setHasError(false);
try {
const res = await axios(url);
const responseData = res.data.data.data;
updateStore(responseData);
} catch (error) {
setHasError(true);
}
};
useEffect(() => {
if (url) {
fetchData(url);
}
}, [url]);
return { fetchData, hasError };
};
// in case you want to fetch the data on component render
const { fetchData, hasError } = useHttpRequest(url, (data) => dispatch({
type: SET_CATEGORYDATA,
payload: data
}));
// in case you want to fetch it in a callback
const clickButton = () => {
fetchData(someCustomUrl);
}
Наконец, вы можете обобщить своих диспетчеров, так что вам не нужно отправлять всю функцию на ловушку и отправлять только имя диспетчера .