Проверяет понимание жизненного цикла ref в React и того, почему ref.current доступен внутри useEffect уже при первом рендере, что важно для работы с DOM и императивными API.
В React ref — это обычный объект вида { current: value }, который создаётся хуком useRef один раз за весь жизненный цикл компонента. React не пересоздаёт этот объект при повторных рендерах, поэтому ссылка на него остаётся стабильной. Меняется только поле current, которое React обновляет в нужный момент.
Рендер компонента проходит несколько этапов:
ref.current ещё не привязан к DOM.ref.current реальный DOM-узел (или значение, возвращённое callback-ref).useEffect и useLayoutEffect.Поскольку эффекты запускаются после commit, к моменту вызова useEffect значение ref.current уже установлено — даже при первом рендере.
function Input() {
const inputRef = useRef(null);
useEffect(() => {
// ref.current уже указывает на DOM-узел
inputRef.current.focus();
}, []);
return <input ref={inputRef} />;
}
Если бы мы обратились к inputRef.current прямо в теле компонента, при первом рендере там был бы null, потому что DOM ещё не создан.
useLayoutEffect вызывается синхронно сразу после commit, до отрисовки браузером. useEffect — асинхронно, после отрисовки. В обоих случаях ref.current уже доступен, но useLayoutEffect полезен, когда нужно измерить DOM до paint.
Итог: ref — стабильный объект, а его поле current заполняется React во время commit-фазы, поэтому внутри эффектов оно доступно уже при первом рендере. Это делает ref удобным инструментом для работы с DOM и хранения мутируемых значений между рендерами.
Уровень
Рейтинг:
4
Сложность:
5
Навыки
JavaScript
React
Ключевые слова
Подпишись на React Developer в телеграм
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию