¿Cuál es la forma de reaccionar de establecer el foco en un campo de texto en particular después de que se representa el componente?
La documentación parece sugerir el uso de referencias, por ejemplo:
Establecer ref="nameInput"
en mi campo de entrada en la función de renderizado, y luego llamar:
this.refs.nameInput.getInputDOMNode().focus();
¿Pero a dónde debería llamar esto? He probado algunos lugares pero no puedo hacer que funcione.
javascript
reactjs
Dave
fuente
fuente
<input>
elemento. Algo así como<input ref={ (component) => ReactDOM.findDOMNode(component).focus() } />
La respuesta de @ Dhiraj es correcta, y para su comodidad, puede usar el accesorio de enfoque automático para que una entrada se enfoque automáticamente cuando se monta:
Tenga en cuenta que en jsx es
autoFocus
(mayúscula F) a diferencia de html simple que no distingue entre mayúsculas y minúsculas.fuente
autofocus
atributo no confiable HTML5 , sino que también lo usafocus()
en el montaje DOM, porreact-dom
lo que es bastante confiable.A partir de React 0.15 , el método más conciso es:
fuente
Centrarse en el monte
Si solo desea enfocar un elemento cuando se monta (inicialmente se procesa), se hará un uso simple del atributo autoFocus.
Enfoque dinámico
para controlar el enfoque dinámicamente, use una función general para ocultar los detalles de implementación de sus componentes.
Reaccionar 16.8 + componente funcional - useFocus hook
Demo completa
Reaccionar 16.3 + Componentes de clase - utilizarFocus
Demo completa
fuente
(htmlElRef.current as any).focus()
y (2) enreturn {htmlElRef, setFocus}
lugar de matriz.useFocus
para más de un elemento.useFocus
escrito en mecanografiado. gist.github.com/carpben/de968e377cbac0ffbdefe1ab56237573as const
tienes), ¡muy educativo!set
la segunda posición comoconst [inputRef, setInputFocus] = useFocus()
. Esto coincide con useState más. Primero el objeto, luego el armador de ese objetoSi solo desea realizar el enfoque automático en React, es simple.
Mientras que si solo quiere saber dónde colocar ese código, la respuesta está en componentDidMount ().
v014.3
Lea los documentos de la API aquí: https://facebook.github.io/react/docs/top-level-api.html#reactdom.finddomnode
fuente
F
! (Nota para sí mismo y para los demás, no para el que responde).React 16.3 agregó una nueva forma conveniente de manejar esto mediante la creación de una referencia en el constructor del componente y usarlo como a continuación:
Para más detalles, puede consultar este artículo en el blog React.
Actualizar:
A partir de React 16.8 ,
useRef
hook se puede usar en componentes de función para lograr el mismo resultado:fuente
Acabo de encontrarme con este problema y estoy usando react
15.0.115.0.2 y estoy usando la sintaxis ES6 y no obtuve lo que necesitaba de las otras respuestas ya que v.15 cayó hace algunas semanas y algunas de lasthis.refs
propiedades fueron desaprobados y eliminados .En general, lo que necesitaba era:
Estoy usando:
Enfoca el primer elemento de entrada
Solía
autoFocus={true}
en el primero<input />
en la página para que cuando se monte el componente, se enfoque.Enfoque el primer elemento de entrada con un error
Esto tomó más tiempo y fue más complicado. Estoy manteniendo fuera el código que no es relevante para la solución por brevedad.
Tienda Redux / Estado
Necesito un estado global para saber si debo establecer el enfoque y deshabilitarlo cuando se configuró, por lo que no vuelvo a configurar el enfoque cuando los componentes se vuelven a procesar (lo usaré
componentDidUpdate()
para verificar la configuración del enfoque. )Esto podría diseñarse como mejor le parezca para su aplicación.
Componente contenedor
El componente necesitará tener la
resetfocus
propiedad establecida y un callBack para borrar la propiedad si termina estableciendo el foco en sí mismo.También tenga en cuenta que organicé mis Action Creators en archivos separados principalmente debido a que mi proyecto es bastante grande y quería dividirlos en trozos más manejables.
Componente de presentación
Visión general
La idea general es que cada campo de formulario que podría tener un error y estar enfocado necesita verificarse a sí mismo y si necesita establecer el foco en sí mismo.
Hay una lógica de negocios que debe suceder para determinar si el campo dado es el campo correcto para establecer el foco. Esto no se muestra porque dependerá de la aplicación individual.
Cuando se envía un formulario, ese evento debe establecer el indicador de enfoque global
resetFocus
en verdadero. Luego, a medida que cada componente se actualice, verá que debe verificar para ver si obtiene el foco y, si lo hace, enviar el evento para restablecer el foco para que otros elementos no tengan que seguir revisando.editar Como nota al margen, tenía mi lógica de negocios en un archivo de "utilidades" y simplemente exporté el método y lo llamé dentro de cada
shouldfocus()
método.¡Salud!
fuente
Los documentos de React ahora tienen una sección para esto. https://facebook.github.io/react/docs/more-about-refs.html#the-ref-callback-attribute
fuente
autofocus
montar, solo buscaba que el elemento permaneciera enfocado al ingresar un valor. Esto funcionó perfectamente para ese escenario. (usando react 15)Esta ya no es la mejor respuesta. A partir de v0.13,
this.refs
puede no estar disponible hasta DESPUÉS decomponentDidMount()
ejecutarse, en algunos casos extraños.Simplemente agregue la
autoFocus
etiqueta a su campo de entrada, como FakeRainBrigand mostró arriba.fuente
<input autofocus>
campos no se comportarán bien<input>
después de hacerÁrbitro. Comentario de @ Dave sobre la respuesta de @ Dhiraj; una alternativa es utilizar la funcionalidad de devolución de llamada del atributo ref en el elemento que se está representando (después de que un componente se procesa primero):
Más información
fuente
Uncaught TypeError: Cannot read property 'focus' of null
component && React.findDomNode...
. Lea más sobre esto aquí: facebook.github.io/react/docs/…Esta es la forma correcta, cómo enfocar automáticamente. Cuando usa la devolución de llamada en lugar de la cadena como valor de referencia, se llama automáticamente. Tienes tu referencia disponible que sin la necesidad de tocar el DOM usando
getDOMNode
fuente
Tenga en cuenta que ninguna de estas respuestas funcionó para mí con un componente material-ui TextField . Por ¿Cómo establecer el foco en un materialUI TextField? Tuve que saltar algunos aros para que esto funcione:
fuente
focus()
a debe retrasarse hasta el final de la animación.Puede poner esa llamada al método dentro de la función de renderizado. O dentro del método del ciclo de vida,
componentDidUpdate
fuente
No necesitas
getInputDOMNode
?? en este caso...Simplemente obtenga el
ref
yfocus()
cuando el componente se monte - componentDidMount ...fuente
AutoFocus funcionó mejor para mí. Necesitaba cambiar algo de texto a una entrada con ese texto en doble clic, así que esto es lo que terminé con:
NOTA: Para solucionar el problema donde React coloca el cursor al comienzo del texto, use este método:
Encontrado aquí: https://coderwall.com/p/0iz_zq/how-to-put-focus-at-the-end-of-an-input-with-react-js
fuente
Tengo el mismo problema pero también tengo algo de animación, por lo que mi colega sugiere usar window.requestAnimationFrame
Este es el atributo ref de mi elemento:
fuente
Debiera ser
fuente
La respuesta más simple es agregar ref = "algún nombre" en el elemento de texto de entrada y llamar a la siguiente función.
fuente
Para mover el foco a un elemento recién creado, puede almacenar el ID del elemento en el estado y usarlo para establecerlo
autoFocus
. p.ejDe esta manera, ninguno de los cuadros de texto se enfoca en la carga de la página (como quiero), pero cuando presiona el botón "Agregar" para crear un nuevo registro, ese nuevo registro se enfoca.
Como
autoFocus
no se "ejecuta" de nuevo a menos que el componente se vuelva a montar, no tengo que molestarme en desarmarlothis.state.focus
(es decir, no seguirá robando el foco mientras actualizo otros estados).fuente
Leí casi toda la respuesta pero no vi un
getRenderedComponent().props.input
Configure sus referencias de entrada de texto
this.refs.username.getRenderedComponent().props.input.onChange('');
fuente
Después de probar muchas de las opciones anteriores sin éxito, descubrí que era como era
disabling
y luegoenabling
la entrada que hizo que se perdiera el foco.Tenía un accesorio
sendingAnswer
que deshabilitaría la entrada mientras estaba sondeando el backend.Una vez que eliminé el accesorio deshabilitado, todo comenzó a funcionar nuevamente.
fuente
Versión actualizada puedes consultar aquí
fuente
Dado que hay muchas razones para este error, pensé que también publicaría el problema que estaba enfrentando. Para mí, el problema era que representaba mis entradas como contenido de otro componente.
Así es como llamé al componente anterior:
fuente
De acuerdo con la sintaxis actualizada, puede usar
this.myRref.current.focus()
fuente