Проверяет понимание того, как React обрабатывает повторные вызовы setState с одинаковым значением и нужно ли разработчику вручную оптимизировать такие обновления.
Когда вы вызываете setState в функциональном компоненте через хук useState, React не рендерит компонент вслепую. Перед обновлением он сравнивает новое значение с текущим, используя алгоритм Object.is. Если значения идентичны, React делает так называемый bailout — пропускает повторный рендер этого компонента и его детей. Это встроенная оптимизация, которая работает из коробки.
setCount(5), когда count уже равен 5 — рендера не будет.setUser(user), где user — тот же объект, что уже в стейте.Если вы создаёте новый объект или массив с теми же данными, ссылка меняется, и React считает значение новым:
// Плохо: каждый вызов создаёт новую ссылку
setUser({ ...user });
// Хорошо: та же ссылка, если данные не изменились
setUser(user);
// Или проверяем вручную
if (user.name !== newName) {
setUser({ ...user, name: newName });
}Если вы используете setState(prev => ...), React вызовет функцию-апдейтер, но всё равно сравнит результат с текущим состоянием через Object.is. Если вернуть то же значение, рендер не произойдёт:
setCount(prev => prev); // рендера не будет
setCount(prev => prev + 0); // тоже не будетВ большинстве случаев ручное сравнение избыточно — React уже оптимизирует одинаковые примитивы и ссылки. Но если вы формируете новые объекты или массивы, стоит либо проверять изменения перед вызовом setState, либо использовать useMemo/useCallback для стабилизации ссылок. Это особенно важно в компонентах с тяжёлым рендером или частыми обновлениями.
Итог: полагайтесь на встроенный bailout React для примитивов и одинаковых ссылок, а ручное сравнение применяйте только там, где вы создаёте новые объекты или массивы и хотите избежать лишних рендеров.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию