Иногда в компонентах нам нужен доступ к DOM-элементам — например, чтобы вызывать методы этого элемента. Элементы DOM не являются частью React, поэтому напрямую в компоненте к ним нет доступа. Но для этого есть хук useRef()
, который позволяет получить доступ к таким элементам.
С помощью useRef()
можно получить доступ к DOM-элементам, чтобы использовать их в useEffect()
или обработчиках событий:
const Input = () => {
// null — начальное значение
const inputEl = useRef(null);
const onButtonClick = () => {
// `current` указывает на смонтированный элемент `input`
inputEl.current.focus();
};
return (
<>
<input ref={inputEl} type="text" />
<button onClick={onButtonClick}>Фокус</button>
</>
);
}
Значение внутри inputEl
появляется после монтирования компонента, но до вызова хуков. Для этого нужно не забывать установить на нужный элемент атрибут ref
. С помощью этого атрибута устанавливается связь между хуком и элементом, к которому мы хотим получить доступ.
Другой вариант использования хука useRef()
— хранение любых данных между вызовами компонента. Этот хук возвращает обычный объект со свойством current
внутри. Единственное отличие этого объекта от создаваемого вручную { current: ... }
в том, что хук возвращает один и тот же объект при каждом вызове компонента. По своему поведению useRef()
похож на использование обычного свойства внутри классового компонента (this.someproperty
).
Ниже пример того, как можно сохранять предыдущее состояние с помощью useRef()
:
See the Pen use_ref by Hexlet (@hexlet) on CodePen.
Дополнительные материалы
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
- Статья «Как учиться и справляться с негативными мыслями»
- Статья «Ловушки обучения»
- Статья «Сложные простые задачи по программированию»
- Вебинар «Как самостоятельно учиться»
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.