useRef(initial) повертає об'єкт { current }, який живе весь час існування компонента. На відміну від стану, зміна ref.current не викликає рендер.
Два застосування:
- Доступ до DOM-елемента:
function Search() {
const inputRef = useRef(null);
return (
<>
<input ref={inputRef} />
<button onClick={() => inputRef.current.focus()}>Шукати</button>
</>
);
}
- Значення, яке треба зберігати між рендерами, але не показувати: ID таймера, попереднє значення, прапорець «чи вже відправлено», екземпляр сторонньої бібліотеки.
const timerRef = useRef(null);
function start() {
timerRef.current = setInterval(tick, 1000);
}
function stop() {
clearInterval(timerRef.current);
}
Стан чи ref:
- Значення впливає на те, що показано, - стан.
- Значення потрібне лише логіці й не має перемальовувати компонент - ref.
Правила:
- Не читати й не записувати
ref.currentпід час рендеру (крім лінивої ініціалізації) - рендер має бути чистим, а зміна ref не відображається в UI. - Для передачі ref у власний компонент у React 19
ref- звичайний prop. Раніше для цього потрібен бувforwardRef.