Как уже упоминалось в других ответах, свойство current
ref создается React.createRef()
, которое изначально не было доступно в React 16 и было введено в React 16.3.
Обычно это старый синтаксис (Реакт 15, Реакт 16.0 до 16.2):
<input ref={ref => this.inputRef = ref}/>
...
this.inputRef.focus()
против. новый синтаксис (Реакт 16.3 и выше):
inputRef = React.createRef();
...
<input ref={this.inputRef}/>
...
this.inputRef.current.focus()
В новом синтаксисе представлен полезный шаблон, который также можно использовать в более старых версиях React:
inputRef = { current: null };
...
<input ref={ref => this.inputRef.current = ref}/>
...
this.inputRef.current.focus()
Важным отличием является то, что React.createRef()
создает объект ref, содержащий единственное свойство, current
. Это шаблон для сохранения постоянной ссылки на объект ref, даже если ссылка в свойстве current
изменяется. Таким образом, ссылка на объект может быть передана по ссылке, даже если current
изначально null
.
Ранее это был антипаттерн, в первую очередь потому, что ссылка изменчива:
const ComponentThatAcceptsRefs = ({ inputRef }) => (
<button onClick={() => inputRef.focus() }>Focus</button>
);
и
<input ref={ref => this.inputRef = ref}/>
<ComponentThatAcceptsRefs inputRef={this.inputRef}/>
В этом случае он не определен в тот момент, когда он считается опорой. Для этого потребуется inputRef
поддержать функцию-получатель, getInputRef={() => this.inputRef}
.
Хотя то же самое возможно с объектом ref ( demo ):
const ComponentThatAcceptsRefs = ({ inputRef }) => (
<button onClick={() => inputRef.current.focus() }>Focus</button>
);
и
inputRef = React.createRef();
...
<input ref={this.inputRef}/>
<ComponentThatAcceptsRefs inputRef={this.inputRef}/>
В React могут быть более традиционные и практичные способы, не основанные на ссылках, но это возможно сделать с помощью объекта ref.