Ответ вслух Junior memo, useMemo, useCallback спрашивают часто обновлено

useMemo, useCallback, memo

Вопрос

Когда нужны useMemo, useCallback и React.memo, а когда они только мешают?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

React.memo пропускает рендер, если пропсы поверхностно равны предыдущим. useCallback и useMemo нужны прежде всего, чтобы эти пропсы действительно были равны - иначе новая стрелка на каждом рендере убивает весь смысл memo.

Что должно прозвучать в ответе

  • memo сравнивает пропсы поверхностно и пропускает рендер

  • useCallback сохраняет ссылку на функцию между рендерами

  • useMemo сохраняет результат вычисления

  • memo бесполезен, если внутрь передают новый объект или стрелку

  • у мемоизации есть цена: память и сравнение

  • оправдано: дорогое вычисление, стабильная зависимость эффекта, большой список

Что могут спросить следом

  • Почему memo не сработает, если передать объект литералом
  • Что делает useMemo при смене зависимости
  • Чем React Compiler меняет эту картину

Разбор

React.memo пропускает рендер, если пропсы поверхностно равны предыдущим. useCallback и useMemo нужны прежде всего, чтобы эти пропсы действительно были равны - иначе новая стрелка на каждом рендере убивает весь смысл memo.

Когда оправдано: вычисление реально дорогое (сортировка тысяч строк); значение попадает в зависимости эффекта, и без стабильности эффект бьётся каждый рендер; компонент рендерит большое дерево.

Когда вредно: обёртки вокруг дешёвых операций. Сравнение зависимостей и удержание значения в памяти не бесплатны, а читаемость падает. Правило простое: сначала замер в профайлере, потом мемоизация.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме