Как установить фокус на поле ввода после рендеринга?
Проблема с установкой фокуса на текстовое поле в React
Я пытаюсь установить фокус на определенное текстовое поле после рендеринга компонента в React. Документация предлагает использовать refs, например:
Установите ref="nameInput" на моем текстовом поле в функции рендера, а затем вызовите:
this.refs.nameInput.getInputDOMNode().focus();
Но где именно мне следует это вызывать? Я пробовал несколько мест, но не могу заставить это работать. Подскажите, пожалуйста, правильный подход к этой задаче.
5 ответ(ов)
Ответ @Dhiraj верный. Для удобства вы можете использовать пропс autoFocus, чтобы input автоматически получал фокус при монтировании:
<input autoFocus name="..." />
Обратите внимание, что в JSX используется autoFocus (с заглавной буквой F), в отличие от обычного HTML, который не чувствителен к регистру.
На момент версии React 0.15, самый лаконичный способ сфокусировать элемент ввода выглядит так:
<input ref={input => input && input.focus()}/>
Этот код использует атрибут ref, чтобы получить доступ к элементу DOM, и при его наличии вызывает метод focus().
Если вы просто хотите сделать автопозиционирование (autofocus) в React, это очень просто:
<input autoFocus type="text" />
Если же вы хотите знать, куда именно вставить этот код, то ответ будет: в метод componentDidMount().
v014.3
componentDidMount() {
this.refs.linkInput.focus()
}
В большинстве случаев вы можете прикрепить ref к DOM-узлу и полностью избежать использования
findDOMNode.
Прочитайте документацию API здесь: https://facebook.github.io/react/docs/top-level-api.html#reactdom.finddomnode
В документации React теперь есть раздел, посвящённый этому вопросу. Вы можете ознакомиться с ним по ссылке: Документация React о ref.
Вот пример кода, который демонстрирует использование колбэков ref для задания фокуса на элементе TextInput:
render: function() {
return (
<TextInput
ref={function(input) {
if (input != null) {
input.focus();
}
}} />
);
},
В данном примере, внутри функции колбэка мы проверяем, не является ли input равным null. Если элемент существует, вызывается метод focus(), чтобы установить фокус на поле ввода.
Это уже не самый лучший ответ. Начиная с версии 0.13, this.refs может быть недоступен до тех пор, пока не выполнится метод componentDidMount(), в некоторых нестандартных случаях.
Просто добавьте атрибут autoFocus к вашему полю ввода, как показал FakeRainBrigand выше.
Как реализовать дебаунс?
Обнаружена ошибка: Невозможное нарушение: Неверный тип элемента: ожидался строковый тип (для встроенных компонентов) или класс/функция, но получен объект
Добавление тега script в React/JSX
"Не используйте Route или withRouter() вне Router при работе с react-router 4 и styled-components в React"
React + Redux — Замедление работы onChange в Input при вводе, когда значение берется из состояния