Оба запускают эффекты, но в разные моменты относительно отрисовки браузером — и именно эта временная разница является ключевым моментом.
Оба запускают эффекты, но в разные моменты относительно отрисовки браузером — и именно эта временная разница является ключевым моментом.
useEffect запускается после того, как браузер произвел отрисовку. Это асинхронно и неблокирующе. Используйте его практически для всего (данные, подписки, логирование).useLayoutEffect запускается синхронно после изменения DOM, но ДО отрисовки браузером. Используйте его, когда вам нужно прочитать layout и изменить DOM в одном и том же кадре, чтобы избежать видимого мерцания.render → DOM updated → [useLayoutEffect runs] → browser paints → [useEffect runs]
Представьте, что вы измеряете элемент и переопределяете позицию tooltip на основе его размера. С useEffect пользователь ненадолго увидит tooltip в неправильном месте, а потом он прыгнет:
useLayoutEffect(() => {
const { height } = ref.current.getBoundingClientRect();
setTooltipTop(-height); // applied BEFORE paint → no visible jump
}, []);
С useEffect тот же код запускается после отрисовки → мерцание на один кадр.
useLayoutEffect делает интерфейс рывким, потому что браузер не может рисовать до завершения.Правило большого пальца: по умолчанию используйте useEffect; useLayoutEffect только для синхронных измерений/изменений DOM, которые иначе мерцали бы.
Библиотека вопросов для IT-собеседований с подробными ответами — от Junior до Senior.
Поддержать