Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Войти

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

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

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про JavaScript: memoization, React.memo, useMemo, object reference, shallow comparison

Почему мемоизация может не работать при передаче объектов?

Вопрос проверяет понимание механизма мемоизации в React и причин, по которым она может не срабатывать при передаче объектов в качестве пропсов или зависимостей.

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

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

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

Почему мемоизация не работает с объектами

Мемоизация в React — это техника оптимизации, которая предотвращает повторные рендеры или вычисления, если входные данные не изменились. Однако она основана на поверхностном сравнении (shallow comparison), то есть сравниваются ссылки на объекты, а не их содержимое. Если при каждом рендере создается новый объект, его ссылка будет отличаться от предыдущей, и мемоизация посчитает, что данные изменились.

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

Рассмотрим компонент, который использует React.memo:

const Child = React.memo(({ data }) => {
  console.log('Child rendered');
  return <div>{data.value}</div>;
});

function Parent() {
  const data = { value: 'test' }; // новый объект при каждом рендере
  return <Child data={data} />;
}

Каждый раз, когда Parent рендерится, создается новый объект data с новой ссылкой. React.memo видит, что пропс data изменился (ссылка другая), и перерисовывает Child, несмотря на то, что содержимое объекта одинаковое.

Как это исправить

Чтобы мемоизация работала, нужно стабилизировать ссылку на объект. Для этого используйте useMemo или useCallback:

function Parent() {
  const data = useMemo(() => ({ value: 'test' }), []);
  return <Child data={data} />;
}

Теперь объект data будет создан один раз и будет иметь ту же ссылку при последующих рендерах, если зависимости не изменятся.

Вывод

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

Frontend developer

tech
tech
tech
tech
tech
tech
tech
tech
tech

Ментор по Frontend

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

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

Уровень

  • Рейтинг:

    4

  • Сложность:

    5

Навыки

  • JavaScript

    JavaScript

  • React

    React

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

#memoization

#React.memo

#useMemo

#object reference

#shallow comparison

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

Frontend developer

tech
tech
tech
tech
tech
tech
tech
tech
tech

Ментор по Frontend

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

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