Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Задачи

Войти

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

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

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про JavaScript: callback, re-render, memoization, useCallback, React

Почему при использовании callback внутри метода map или аналогичных структур может происходить лишний ререндер компонента?

Вопрос проверяет понимание связи между созданием новых функций при каждом рендере и оптимизацией React-компонентов через мемоизацию.

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

При использовании callback внутри map каждый рендер создает новую функцию. Если этот callback передается в дочерний компонент, обернутый в React.memo, то мемоизация не срабатывает, так как ссылка на функцию меняется. Это вызывает лишний ререндер дочернего компонента. Для решения используют useCallback или выносят функцию за пределы компонента.

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

Проблема лишних ререндеров при использовании callback в map

Когда вы используете callback внутри метода map (или аналогичных структур) в React-компоненте, каждый раз при рендере создается новая функция. Это нормальное поведение JavaScript, но оно может вызывать нежелательные ререндеры дочерних компонентов.

Как это работает

Рассмотрим пример: у вас есть список элементов, и для каждого элемента вы передаете callback-функцию. Если дочерний компонент обернут в React.memo, он сравнивает предыдущие и новые props. Поскольку функция создается заново при каждом рендере, ссылка на неё меняется, и React.memo считает, что props изменились, вызывая ререндер.

// Пример проблемы
function Parent() {
  const items = ['a', 'b', 'c'];
  return (
    <div>
      {items.map(item => (
        <Child key={item} onClick={() => handleClick(item)} />
      ))}
    </div>
  );
}

Решение с useCallback

Используйте хук useCallback, чтобы мемоизировать callback. Он вернет ту же самую функцию, пока не изменятся зависимости. Это предотвращает лишние ререндеры.

// Исправленный пример
function Parent() {
  const items = ['a', 'b', 'c'];
  const handleClick = useCallback((item) => {
    console.log(item);
  }, []);
  return (
    <div>
      {items.map(item => (
        <Child key={item} onClick={handleClick} />
      ))}
    </div>
  );
}

Альтернативные подходы

  • Вынести callback за пределы компонента, если он не зависит от props или state.
  • Использовать useMemo для мемоизации массива функций.
  • Передавать идентификатор элемента вместо callback и обрабатывать событие в родителе.

Вывод: Используйте useCallback для стабильных ссылок на функции, передаваемые в дочерние компоненты, особенно при работе с большими списками или компонентами, обернутыми в React.memo. Это повышает производительность и предотвращает лишние ререндеры.

Frontend developer

tech
tech
tech
tech
tech
tech
tech
tech
tech

Ментор по Frontend

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

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

Уровень

  • Рейтинг:

    4

  • Сложность:

    5

Навыки

  • JavaScript

    JavaScript

  • React

    React

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

#callback

#re-render

#memoization

#useCallback

#React

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

Frontend developer

tech
tech
tech
tech
tech
tech
tech
tech
tech

Ментор по Frontend

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

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