Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Войти

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

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

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про JavaScript: useCallback, React, memoization, performance optimization, referential equality

Как определить по коду, нужен ли useCallback или нет?

Вопрос проверяет понимание мемоизации функций в React и умение определять, когда useCallback действительно необходим для оптимизации производительности.

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

useCallback нужен, когда вы передаете функцию в качестве пропса дочернему компоненту, обернутому в React.memo, или когда функция используется в массиве зависимостей других хуков (useEffect, useMemo). Если функция создается внутри компонента и передается в обычный HTML-элемент (div, button) или в компонент без React.memo, useCallback не дает выигрыша, так как ререндер все равно произойдет. Также не стоит использовать useCallback для простых функций, вызываемых по событию (onClick, onChange), если нет проблем с производительностью.

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

Когда нужен useCallback?

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

  • Передача функции в дочерний компонент, обернутый в React.memo. React.memo предотвращает ререндер, если пропсы не изменились, но без useCallback каждая новая ссылка на функцию будет считаться изменением пропса.
  • Использование функции в массиве зависимостей других хуков (useEffect, useMemo, useCallback). Если функция не мемоизирована, она будет создаваться заново при каждом рендере, вызывая бесконечные циклы или лишние вызовы эффектов.

Когда useCallback не нужен?

Если функция передается в обычный HTML-элемент (например, <button onClick={handleClick}>), useCallback не дает выигрыша, так как ререндер все равно произойдет. Также не стоит использовать его для простых обработчиков событий, если нет измеримых проблем с производительностью. Преждевременная оптимизация может усложнить код.

Практический пример

import React, { useState, useCallback } from 'react';

const ExpensiveChild = React.memo(({ onClick }) => {
  console.log('Child re-rendered');
  return <button onClick={onClick}>Click</button>;
});

function Parent() {
  const [count, setCount] = useState(0);

  // Без useCallback: новая функция при каждом рендере
  const handleClick = useCallback(() => {
    setCount(prev => prev + 1);
  }, []); // Зависимости пусты, функция стабильна

  return (
    <div>
      <p>Count: {count}</p>
      <ExpensiveChild onClick={handleClick} />
    </div>
  );
}

В этом примере ExpensiveChild обернут в React.memo. Без useCallback каждый ререндер Parent создавал бы новую функцию, и React.memo не сработал бы. С useCallback ссылка на функцию стабильна, и дочерний компонент не ререндерится лишний раз.

Вывод

Используйте useCallback только когда есть реальная проблема с производительностью или когда функция участвует в зависимостях других хуков. Не применяйте его для всех функций подряд — это усложняет код без пользы.

Frontend developer

tech
tech
tech
tech
tech
tech
tech
tech
tech

Ментор по Frontend

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

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

Уровень

  • Рейтинг:

    4

  • Сложность:

    5

Навыки

  • JavaScript

    JavaScript

  • React

    React

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

#useCallback

#React

#memoization

#performance optimization

#referential equality

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

Frontend developer

tech
tech
tech
tech
tech
tech
tech
tech
tech

Ментор по Frontend

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

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