Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Войти

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

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

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

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

Что произойдет, если передавать новую функцию в мемоизированный компонент?

Проверяет понимание механизма мемоизации React.memo и влияния передачи новых ссылок на функции на производительность.

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

Если передавать новую функцию в мемоизированный компонент, React.memo не сможет предотвратить ререндер, так как при каждом рендере родителя создается новая ссылка на функцию. Сравнение props происходит по ссылке, и новая функция считается изменением. Для решения используют useCallback, который стабилизирует ссылку на функцию между рендерами.

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

Как работает React.memo

React.memo — это компонент высшего порядка, который запоминает результат рендера и пропускает повторный рендер, если props не изменились. Сравнение props выполняется поверхностно (shallow comparison) по ссылкам. Если передать новую функцию, её ссылка будет отличаться от предыдущей, и React.memo посчитает, что props изменились, что приведет к ререндеру.

Пример проблемы

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

function Parent() {
  const [count, setCount] = useState(0);
  return (
    <>
      <p>{count}</p>
      <Child onClick={() => setCount(c => c + 1)} />
    </>
  );
}

Каждый раз при вызове setCount родитель ререндерится, создается новая стрелочная функция для onClick, и Child тоже ререндерится, несмотря на React.memo.

Решение с useCallback

function Parent() {
  const [count, setCount] = useState(0);
  const handleClick = useCallback(() => {
    setCount(c => c + 1);
  }, []);
  return (
    <>
      <p>{count}</p>
      <Child onClick={handleClick} />
    </>
  );
}

useCallback возвращает одну и ту же ссылку на функцию, пока не изменятся зависимости (в данном случае пустой массив). Теперь React.memo видит, что onClick не изменился, и пропускает ререндер Child.

Вывод

Передача новой функции в мемоизированный компонент сводит на нет пользу от мемоизации. Используйте useCallback для стабилизации ссылок на функции, передаваемые в качестве props, особенно если компонент тяжелый или часто ререндерится.

Frontend developer

tech
tech
tech
tech
tech
tech
tech
tech
tech

Ментор по Frontend

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

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

Уровень

  • Рейтинг:

    4

  • Сложность:

    5

Навыки

  • JavaScript

    JavaScript

  • React

    React

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

#React.memo

#memoization

#referential equality

#useCallback

#performance optimization

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

Frontend developer

tech
tech
tech
tech
tech
tech
tech
tech
tech

Ментор по Frontend

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

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