Вы можете создать функцию отображения для ваших данных, которая затем будет использоваться ловушкой. Это может быть сделано вне вашей функции подключения.
const mapChartDataItem = (dataItem) => ({
...dataItem,
reportDate: dataItem.reportDate.replace(/-/g, "/").replace(/^\d{4}\//g, ""))
});
Отображение reportDate - это тот же код, который вы использовали в вашем useEffect.
Затем в вашей функции подключения:
const data = await response.json();
// this is the new code
const mappedData = data.map(mapChartDataItem);
// change setData to use the new mapped data
setData(mappedData);
Выполнение этого здесь означает, что вы отображаете свои объекты только один раз (когда они выбираются), а не каждый раз, когда значение данных изменяется.
Обновление - с введением функции в крючок
Ваш крючок теперь будет выглядеть так:
const useDataApi = (initialUrl, initialData, transformFn) => {
const [data, setData] = useState(initialData);
const [url, setUrl] = useState(initialUrl);
const [isLoading, setIsLoading] = useState(true);
const [isError, setIsError] = useState(false);
useEffect(() => {
const fetchData = async () => {
setIsError(false);
setIsLoading(true);
try {
const response = await fetch(url);
const data = await response.json();
// if transformFn isn't provided, then just set the data as-is
setData((transformFn && transformFn(data)) || data);
} catch (error) {
setIsError(true);
}
setIsLoading(false);
};
fetchData();
}, [url, transformFn]);
return [{ data, isLoading, isError }];
};
Затем, чтобы вызвать его, вы можете использовать следующее:
const mapChartDataItem = (dataItem) => ({
...dataItem,
reportDate: dataItem.reportDate.replace(/-/g, "/").replace(/^\d{4}\//g, ""))
});
const transformFn = useCallback(data => data.map(mapChartDataItem), []);
const [{ data, isLoading, isError }] = useDataApi(
"https://some/api/domain",
[],
transformFn
);
Для простоты, потому что Аргумент transformFn является последним параметром функции, затем вы можете выбрать вызов хука без него, и он просто вернет данные, которые были возвращены из вызова выборки.
const [{ data, isLoading, isError }] = useDataApi(
"https://some/api/domain",
[]
);
будет работать в То же самое, что и раньше.
Кроме того, если вы не хотите, чтобы (transformFn && transformFn(data)) || data
в вашем коде, вы могли бы задать для transformFn значение по умолчанию в вашем хуке, более подробно это выглядит так:
const useDataApi = (
initialUrl,
initialData,
transformFn = data => data) => {
// then the rest of the hook in here
// and call setData with the transformFn
setData(transformFn(data));
}