Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про JavaScript: React, custom hook, caching, state management, fetch deduplication

Как избежать двойного вызова fetch, если один и тот же кастомный хук используется в двух разных компонентах на одной странице?

Проверяет понимание стратегий кэширования и синхронизации состояния при использовании кастомных хуков в React.

Короткий ответ

Чтобы избежать двойного вызова fetch, можно использовать внешнее хранилище состояния, например, глобальный стейт-менеджер (Redux, Zustand) или React Context. Другой подход — кэшировать результат запроса в модульной переменной или с помощью библиотеки React Query, которая автоматически дедуплицирует запросы. Также можно поднять состояние до общего родителя и передавать данные через пропсы.

Длинный ответ

Проблема двойного вызова fetch

Когда один и тот же кастомный хук, выполняющий fetch, используется в двух разных компонентах на одной странице, каждый компонент при монтировании инициирует свой собственный запрос. Это приводит к дублированию сетевых вызовов, что увеличивает нагрузку на сервер и замедляет работу приложения.

Решение с помощью внешнего хранилища

Один из способов — вынести состояние запроса в глобальное хранилище, например, в Redux или React Context. Хук будет проверять, есть ли уже данные в хранилище, и если да, то не выполнять новый запрос.

// useData.js
import { useContext } from 'react';
import { DataContext } from './DataContext';

export function useData() {
  const { data, fetchData } = useContext(DataContext);
  if (!data) {
    fetchData(); // выполняется только один раз
  }
  return data;
}

Решение с помощью библиотеки React Query

React Query (TanStack Query) предоставляет встроенную дедупликацию запросов. Если несколько компонентов используют один и тот же ключ запроса, библиотека автоматически объединяет их в один вызов.

import { useQuery } from '@tanstack/react-query';

function useData() {
  return useQuery(['data'], fetchData);
}

// В любом компоненте:
const { data } = useData();

Решение с помощью модульного кэша

Можно создать простой кэш в модульной переменной, который будет хранить результат запроса. Хук проверяет кэш перед выполнением fetch.

let cache = null;

export function useData() {
  const [data, setData] = useState(cache);
  useEffect(() => {
    if (!cache) {
      fetch('/api/data')
        .then(res => res.json())
        .then(result => {
          cache = result;
          setData(result);
        });
    }
  }, []);
  return data;
}

Вывод

Выбор метода зависит от сложности приложения: для простых случаев подойдет модульный кэш, для средних — React Context, для крупных проектов с множеством запросов — React Query или Redux Toolkit Query.

Frontend developer

tech
tech
tech
tech
tech
tech
tech
tech
tech

Ментор по Frontend

Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства

Записаться на консультацию

Уровень

  • Рейтинг:

    4

  • Сложность:

    5

Навыки

  • JavaScript

    JavaScript

  • React

    React

Ключевые слова

#React

#custom hook

#caching

#state management

#fetch deduplication

Подпишись на React Developer в телеграм

Frontend developer

tech
tech
tech
tech
tech
tech
tech
tech
tech

Ментор по Frontend

Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства

Записаться на консультацию