Как реагирует установка фокуса на конкретное текстовое поле после рендеринга компонента?
Документация предлагает использовать ссылки, например:
Установите ref="nameInput"
в моем поле ввода в функции рендеринга, а затем вызовите:
this.refs.nameInput.getInputDOMNode().focus();
Но где мне это назвать? Я пробовал несколько мест, но не могу заставить его работать.
javascript
reactjs
Дейв
источник
источник
<input>
элемента. Нечто подобное<input ref={ (component) => ReactDOM.findDOMNode(component).focus() } />
Ответ @ Dhiraj правильный, и для удобства вы можете использовать опору autoFocus для автоматической фокусировки при подключении:
Обратите внимание, что в jsx это
autoFocus
(заглавная F) в отличие от простого старого html, который не зависит от регистра.источник
autofocus
атрибут HTML5 , а фактически используетсяfocus()
при монтировании DOM,react-dom
поэтому он достаточно надежен.Начиная с версии 0.15 , наиболее краткий метод:
источник
Фокус на горе
Если вы просто хотите сфокусировать элемент при его монтировании (первоначальном рендеринге), достаточно использовать атрибут autoFocus.
Динамический фокус
для динамического управления фокусом используйте общую функцию, чтобы скрыть детали реализации от ваших компонентов.
Реакт 16.8 + Функциональный компонент - использовать крючок фокусировки
Полная демонстрация
Реагируй 16,3 + Класс Компоненты - utilizeFocus
Полная демонстрация
источник
(htmlElRef.current as any).focus()
и (2)return {htmlElRef, setFocus}
вместо массива.useFocus
более одного элемента.useFocus
написано в Typescript. gist.github.com/carpben/de968e377cbac0ffbdefe1ab56237573as const
тебя есть), очень познавательно!set
во вторую позицию, какconst [inputRef, setInputFocus] = useFocus()
. Это соответствует useState больше. Сначала объект, затем установщик этого объектаЕсли вы просто хотите сделать автофокус в React, это просто.
Если вы просто хотите знать, куда поместить этот код, ответ находится в componentDidMount ().
v014.3
Прочитайте документы API здесь: https://facebook.github.io/react/docs/top-level-api.html#reactdom.finddomnode
источник
F
! (Примечание для себя и других, а не для ответчика).В React 16.3 добавлен новый удобный способ справиться с этим путем создания ссылки на конструктор компонента и использования его, как показано ниже:
Для более подробной информации, вы можете проверить эту статью в блоге React.
Обновить:
Начиная с React 16.8 ,
useRef
ловушка может использоваться в компонентах функций для достижения того же результата:источник
Я только столкнулся с этой проблемой, и я использую реагировать
15.0.115.0.2, и я использую синтаксис ES6 и не совсем получил то, что мне было нужно из других ответов, так как v.15 упала несколько недель назад и некоторыеthis.refs
свойства были объявлены устаревшими и удалены .В общем то, что мне было нужно, было:
Я использую:
Сосредоточиться на первом элементе ввода
Я использовал
autoFocus={true}
первый<input />
на странице, чтобы, когда компонент монтировался, он получал фокус.Сосредоточить первый элемент ввода с ошибкой
Это заняло больше времени и было более запутанным. Я храню код, который не имеет отношения к решению для краткости.
Redux Store / Государство
Мне нужно глобальное состояние, чтобы знать, должен ли я установить фокус и отключить его, когда он был установлен, поэтому я не буду переустанавливать фокус при повторной визуализации компонентов (я буду использовать
componentDidUpdate()
для проверки установки фокуса. )Это может быть разработано так, как вы считаете подходящим для вашего приложения.
Контейнер Компонент
Компонент должен иметь установленное
resetfocus
свойство и callBack, чтобы очистить свойство, если оно в конечном итоге устанавливает фокус на себя.Также обратите внимание, что я организовал своих создателей Action в отдельные файлы, в основном из-за того, что мой проект довольно большой, и я хотел разбить их на более управляемые куски.
Компонент презентации
обзор
Общая идея заключается в том, что каждое поле формы, которое может иметь ошибку и быть сфокусированным, должно проверять себя и не должно ли оно сосредоточиться на себе.
Есть бизнес-логика, которая должна произойти, чтобы определить, является ли данное поле правильным полем для фокусировки. Это не показано, потому что это будет зависеть от конкретного приложения.
Когда форма отправлена, это событие должно установить флаг глобального фокуса
resetFocus
в true. Затем, когда каждый компонент обновляется сам, он увидит, что он должен проверить, получает ли он фокус, и если это так, отправляет событие, чтобы сбросить фокус, чтобы другие элементы не должны были продолжать проверку.править Как примечание стороны, у меня был бизнес - логика в файле «утилиты» , и я только что экспортировал метод и назвал его в пределах каждого
shouldfocus()
метода.Ура!
источник
В документации React есть раздел для этого. https://facebook.github.io/react/docs/more-about-refs.html#the-ref-callback-attribute
источник
autofocus
монтировать, я просто искал элемент, чтобы оставаться сфокусированным при вводе значения. Это отлично сработало для этого сценария. (используя реакцию 15)Это уже не лучший ответ. Начиная с версии v0.13
this.refs
может быть недоступно до запуска ПОСЛЕcomponentDidMount()
, в некоторых странных случаях.Просто добавьте
autoFocus
тег в поле ввода, как показано выше в FakeRainBrigand.источник
<input autofocus>
полей не будут вести себя хорошо<input>
после рендераСсылка @ Комментарий Дэйва к ответу @ Дхираджа; альтернатива состоит в том, чтобы использовать функцию обратного вызова атрибута ref для визуализируемого элемента (после первого рендеринга компонента):
Больше информации
источник
Uncaught TypeError: Cannot read property 'focus' of null
component && React.findDomNode...
. Подробнее об этом здесь: facebook.github.io/react/docs/...Это правильный способ, как с автофокусом. Когда вы используете callback вместо строки в качестве значения ref, он вызывается автоматически. Вы получили свой реф, чем без необходимости касаться DOM, используя
getDOMNode
источник
Обратите внимание, что ни один из этих ответов не работал для меня с компонентом TextField для материала и пользовательского интерфейса . Per Как установить фокус на materialUI TextField? Мне пришлось перепрыгнуть через несколько обручей, чтобы заставить это работать:
источник
focus()
должен быть отложен до конца анимации.Вы можете поместить этот метод в функцию рендера. Или внутри метода жизненного цикла,
componentDidUpdate
источник
Тебе не нужно
getInputDOMNode
?? в этом случае...Просто получите
ref
иfocus()
это, когда компонент монтируется - componentDidMount ...источник
Автофокус работал лучше всего для меня. Мне нужно было изменить текст на вход с двойным щелчком, поэтому я закончил:
ПРИМЕЧАНИЕ. Чтобы устранить проблему, когда React размещает курсор в начале текста, используйте этот метод:
Найдено здесь: https://coderwall.com/p/0iz_zq/how-to-put-focus-at-the-end-of-an-input-with-react-js
источник
У меня та же проблема, но у меня тоже есть анимация, поэтому мой коллега предлагает использовать window.requestAnimationFrame
это атрибут ref моего элемента:
источник
Должно быть
источник
Самый простой ответ - добавить ref = "some name" во входной текстовый элемент и вызвать функцию ниже.
источник
Чтобы переместить фокус на вновь созданный элемент, вы можете сохранить идентификатор элемента в состоянии и использовать его для установки
autoFocus
. напримерТаким образом, ни одно из текстовых полей не фокусируется на загрузке страницы (как я хочу), но когда вы нажимаете кнопку «Добавить», чтобы создать новую запись, тогда эта новая запись получает фокус.
Так
autoFocus
как не «запускается» снова, пока компонент не перемонтируется, мне не нужно беспокоиться об отключенииthis.state.focus
(т.е. он не будет продолжать воровать фокус при обновлении других состояний).источник
Прочитал почти весь ответ, но не увидел
getRenderedComponent().props.input
Установите текстовые ссылки для ввода
this.refs.username.getRenderedComponent().props.input.onChange('');
источник
Попробовав множество вариантов, описанных выше, безуспешно, я обнаружил, что все было так, как было,
disabling
а затемenabling
вход, из-за которого фокус был потерян.У меня была опора,
sendingAnswer
которая отключала бы вход, пока я опрашивал бэкэнд.Как только я удалил отключенную опору, все снова заработало.
источник
Обновленную версию вы можете проверить здесь
источник
Поскольку существует много причин этой ошибки, я подумал, что я также опубликую проблему, с которой столкнулся. Для меня проблема заключалась в том, что я представлял свои входные данные как содержимое другого компонента.
Вот как я назвал вышеупомянутый компонент:
источник
Согласно обновленному синтаксису, вы можете использовать
this.myRref.current.focus()
источник