useMemo, useCallback, memo
Вопрос
Когда нужны useMemo, useCallback и React.memo, а когда они только мешают?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
memo сравнивает пропсы поверхностно и пропускает рендер
useCallback сохраняет ссылку на функцию между рендерами
useMemo сохраняет результат вычисления
memo бесполезен, если внутрь передают новый объект или стрелку
у мемоизации есть цена: память и сравнение
оправдано: дорогое вычисление, стабильная зависимость эффекта, большой список
Что могут спросить следом
- Почему memo не сработает, если передать объект литералом
- Что делает useMemo при смене зависимости
- Чем React Compiler меняет эту картину
Разбор
React.memo пропускает рендер, если пропсы поверхностно равны предыдущим.
useCallback и useMemo нужны прежде всего, чтобы эти пропсы действительно были равны -
иначе новая стрелка на каждом рендере убивает весь смысл memo.
Когда оправдано: вычисление реально дорогое (сортировка тысяч строк); значение попадает в зависимости эффекта, и без стабильности эффект бьётся каждый рендер; компонент рендерит большое дерево.
Когда вредно: обёртки вокруг дешёвых операций. Сравнение зависимостей и удержание значения в памяти не бесплатны, а читаемость падает. Правило простое: сначала замер в профайлере, потом мемоизация.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Термины по теме
Ещё по теме «memo, useMemo, useCallback»
- Перерендерится ли children
- React Compiler
- React.memo
- useCallback
- useMemo
- Таблица на 10 000 строк
- memo и children
- memo и стрелочная функция в props