Получить доступ

Когда компонент React перерисовывается и как избежать лишних рендеров?

JuniorReact
Ещё спрашивают так:
  • Зачем нужны React.memo, useMemo и useCallback?
Коротко

Компонент перерисовывается, когда меняется его состояние, контекст, который он читает, или перерисовывается родитель (по умолчанию — все дети, даже с теми же props). React.memo пропускает рендер при неизменных props (сравнение по ссылке), useMemo запоминает значение, useCallback — функцию, чтобы ссылки не менялись.

  • memo бесполезен, если в props каждый раз новый объект или стрелочная функция
  • Сначала измерить в React DevTools Profiler, потом оптимизировать
  • Часто помогает перенос состояния ниже или передача детей через children

А ещё React Compiler (React 19) расставляет мемоизацию автоматически

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Рендер — не изменение DOM. Перерисовка компонента — вызов функции и сравнение деревьев; DOM меняется, только если результат отличается. Лишние рендеры важны, когда компонентов много или они дорогие.

Почему memo не срабатывает:

<Row style={{ color: "red" }} onClick={() => select(id)} />

Объект и функция создаются заново на каждом рендере родителя — props «изменились». Решение: вынести константы наружу, useMemo для объектов, useCallback для обработчиков.

Структурные приёмы, часто лучше мемоизации:

  • опустить состояние в компонент, которому оно нужно, — родитель и соседи не перерисуются;
  • передавать children — элементы, созданные выше, не пересоздаются при изменении состояния обёртки;
  • разделить контекст — частые изменения в отдельном контексте.

Длинные списки — виртуализация (react-window): рендерить только видимые строки.

Что хотят услышать

  • Причины перерисовки.
  • memo, useMemo, useCallback и условие их пользы.
  • Структурные способы и измерение.

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем