React-ссылка (ref) - это механизм, который позволяет получить доступ к реальному DOM-элементу, созданному компонентом, и изменять его свойства и методы.
В React, когда компонент рендерится, React создает виртуальное дерево DOM, которое является копией реального DOM. Виртуальное дерево DOM не является полным представлением реального DOM, поэтому некоторые свойства и методы реального DOM не могут быть изменены напрямую из компонента. React-ссылка (ref) позволяет получить доступ к реальному DOM-элементу и изменять его свойства и методы.
React-ссылка создается с помощью функции React.createRef(). Эта функция возвращает объект ref, который можно передать в свойство компонента. Когда компонент монтируется, React присваивает объект ref свойству ref элемента DOM, созданного компонентом.
Пример использования React-ссылки:
import React, { Component } from "react"
class MyComponent extends Component {
constructor(props) {
super(props)
this.inputRef = React.createRef()
}
componentDidMount() {
this.inputRef.current.focus()
}
render() {
return <input type="text" ref={this.inputRef} />
}
}
export default MyComponentВ данном примере мы создаем React-ссылку inputRef в конструкторе компонента MyComponent. В методе componentDidMount() мы вызываем метод focus() для получения фокуса на элементе input. В методе render() мы передаем React-ссылку в свойство ref элемента input. После монтирования компонента, React присваивает объект inputRef свойству ref элемента input. Когда метод componentDidMount() вызывается, мы можем получить доступ к элементу input через this.inputRef.current и вызвать метод focus().
React-ссылки также могут быть использованы для получения доступа к компоненту, созданному внутри другого компонента, и вызова его методов. Однако, использование React-ссылок должно быть минимальным, поскольку React-ссылки нарушают идеологию React о неизменности и однонаправленном потоке данных.
**Отличие state от ref
Официальная документация рекомендует использовать state и прибегать к refs только в том случае, когда по-другому никак, потому что ref используется когда нужна DOMnode или React-element. Например, после какого-то event вы хотите ставить focus в какой-то input. Берете ref input и ставите фокус.
В state - хранится локальное состояние.
| refs | state |
|---|---|
| useRef(initialValue) возвращает (current: initialValue) | useState(initialValue) возвращает текущее значение переменной состояния и функцию-установщик состояния [value, setValue] |
| не запускает повторный рендеринг при изменении | срабатывает повторный рендеринг при изменении |
| mutable - вы можете изменять и обновлять значение current вне процесса рендеринга | immutable - вы должны использовать функцию установки состояния для изменения состояния, чтобы поставить очередь на повторный рендеринг |
| вы не должны читать (или записывать) значение current во время рендеринга | вы можете читать состояние в любое время. Однако каждый рендер имеет собственный snapshot состояния, которое не изменяется |