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