Когда флаг стоит менять в обработчике, а когда в эффекте

Нет: выбор зависит от смысла. Действие, непосредственно вызванное событием, можно обработать там же; эффект нужен для синхронизации после commit с внешней системой.

Короткий ответ

Что ответить на собеседовании

Нет: выбор зависит от смысла. Действие, непосредственно вызванное событием, можно обработать там же; эффект нужен для синхронизации после commit с внешней системой.

Подробный разбор

Ответ с пояснениями

Условие

React-обработчик меняет ref с признаком действия пользователя. Коллега предлагает всегда переносить такие изменения в useEffect. Верно ли это правило?

Ответ

Нет: выбор зависит от смысла. Действие, непосредственно вызванное событием, можно обработать там же; эффект нужен для синхронизации после commit с внешней системой.

Изменение ref не вызывает render, поэтому видимый флаг обычно должен быть state. Если флаг означает «DOM уже обновлён», ставить его сразу после setState нельзя — нужен соответствующий эффект. Если он лишь блокирует повторный синхронный запуск обработчика, ref может быть уместен. Без конкретного инварианта перенос в эффект способен добавить задержку и новую гонку.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее