Ответ
useRef и useState оба могут хранить значения, но с ключевыми отличиями:
-
Рендер компонента:
useStateпри изменении значения вызывает ререндер компонента.useRefне вызывает ререндер при изменении.current.
-
Синхронность обновлений:
useStateобновления асинхронны (состояние может быть не актуально сразу после вызоваsetState).useRefобновляет.currentсинхронно.
-
Использование:
useState— для данных, влияющих на UI.useRef— для мутабельных значений, не требующих отрисовки (таймеры, DOM-элементы).
function Example() {
const [count, setCount] = useState(0); // Вызовет ререндер
const countRef = useRef(0); // Не вызовет
const handleClick = () => {
countRef.current += 1; // Изменение без ререндера
setCount(prev => prev + 1); // Вызовет ререндер
};
return <button onClick={handleClick}>Click</button>;
}