TGViewer
React JS React JS @react_tg · 16.2K subscribers
Post #424 5.09K
💻 Проверь свои скиллы — задача по написанию hook для загрузки данных

На первой итерации решение может выглядеть как-то так:
function useFetch(url) {
const [data, setData] = useState(null);

useEffect(() => {
fetch(url)
.then((res) => res.json())
.then((respData) => setData(respData));
}, []);

return data;
}

В этом коде не хватает зависимости. Если url изменится, то запроса данных не произойдет.

Дальше код может стать таким:
function useFetch(url) {
const [data, setData] = useState(null);

useEffect(() => {
setData(null); // не забыть сбросить данные перед загрузкой
fetch(url)
.then((res) => res.json())
.then((respData) => setData(respData));
}, [url]); // <-- не забыть зависимость

return data;
}

На этом этапе можно остановиться, и подумать, как улучшить этот hook.

Пропустим ещё несколько итераций, и финальный код, который можно считать неплохим решением, выглядит так:
function useFetch(url) {
const [data, setData] = useState(null);
const [isLoading, setIsLoading] = useState(false);
const [error, setError] = useState(null);

useEffect(() => {
// флаг отмены
let cancelled = false;

setIsLoading(true);
setData(null);
setError(null);
fetch(url)
.then((res) => res.json())
.then((respData) => {
if (!cancelled) setData(respData);
})
.catch((e) => {
if (!cancelled) setError(e);
})
.finally(() => {
if (!cancelled) setIsLoading(false);
});

return () => {
// выставим признак того, что запрос отменен
cancelled = true;
};
}, [url]);

return [data, isLoading, error];
}


Эта задачка позволяет проверить понимание устройства рендеринга React, как устроено хранение состояния, когда происходят перерисовки, как заставить компонент перерисоваться в ответ на асинхронное событие, как устроена "очистка (cleanup) эффекта", как работают сайд-эффекты.

@react_tg
  • 👍 29
  • 🔥 4
  • ❤ 3
More from @react_tg
  1. Oct 2, 2026🔥 Claude Code теперь можно менять изнутри Anthropic представила Mods: небольшие функции н…
  2. Oct 1, 2026Всплывающие скроллеры изображений с анимацией, управляемой прокруткой CSS 🤙 .pop { view-t…
  3. Oct 1, 2026👨‍💻 Фронтенд с AI: что можно делегировать агентам 5 октября, стартует конференция Podlod…
  4. Oct 1, 2026Совет по JavaScript💡 Легко и правильно отображайте цены.
  5. Sep 29, 2026🌦️ Красивый пример того, как может выглядеть современное приложение на Aspire Команда пок…
  6. Sep 24, 2026Temperature displays Индикаторы - это svg-картинки, параметры которых задаются в JS. https…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →