Загрузка…
Загрузка…
React · middle · сложность 7
Чтобы поставить фокус в поле ввода сразу после появления на экране, используют ref и useEffect (или useLayoutEffect, если фокус нужен до paint).
import { useEffect, useRef } from 'react';
function SearchField() {
const inputRef = useRef(null);
useEffect(() => {
inputRef.current?.focus();
}, []);
return <input ref={inputRef} placeholder="Поиск…" />;
}Пустой массив зависимостей означает «один раз после mount». ?.focus() безопасен, если ref ещё не привязан.
autoFocus — атрибут тоже работает, но хуже контролируется (модалка, SSR, повторный mount). На собеседовании чаще ждут именно ref + effect.useLayoutEffect — синхронно после DOM-мутаций, до отрисовки браузером; меньше «мигания», если поле видно сразу.isOpen, effect с [isOpen] или remount через key надёжнее, чем «вечный» пустой deps.Вызывать focus() прямо в теле компонента: ref ещё null, а повторные рендеры будут дёргать фокус снова. Только в effect/layout-effect или в обработчике события.
На практике: ref + useEffect(() => { ref.current?.focus(); }, []) — стандартный и ожидаемый ответ.