Solo estoy escribiendo en la entrada de texto y, en onChange
caso de que llame setState
, React vuelve a reproducir mi interfaz de usuario. El problema es que la entrada de texto siempre pierde el enfoque, por lo que necesito enfocarlo nuevamente para cada letra: D.
var EditorContainer = React.createClass({
componentDidMount: function () {
$(this.getDOMNode()).slimScroll({height: this.props.height, distance: '4px', size: '8px'});
},
componentDidUpdate: function () {
console.log("zde");
$(this.getDOMNode()).slimScroll({destroy: true}).slimScroll({height: 'auto', distance: '4px', size: '8px'});
},
changeSelectedComponentName: function (e) {
//this.props.editor.selectedComponent.name = $(e.target).val();
this.props.editor.forceUpdate();
},
render: function () {
var style = {
height: this.props.height + 'px'
};
return (
<div className="container" style={style}>
<div className="row">
<div className="col-xs-6">
{this.props.selected ? <h3>{this.props.selected.name}</h3> : ''}
{this.props.selected ? <input type="text" value={this.props.selected.name} onChange={this.changeSelectedComponentName} /> : ''}
</div>
<div className="col-xs-6">
<ComponentTree editor={this.props.editor} components={this.props.components}/>
</div>
</div>
</div>
);
}
});
javascript
reactjs
Krab
fuente
fuente
Respuestas:
Sin ver el resto de su código, esto es una suposición. Cuando cree un EditorContainer, especifique una clave única para el componente:
<EditorContainer key="editor1"/>
Cuando ocurre una re-renderización, si se ve la misma clave, esto le dirá a React que no golpee y regenere la vista, en su lugar la reutilice. Entonces, el elemento enfocado debe mantener el enfoque.
fuente
Sigo volviendo aquí una y otra vez y siempre encuentro la solución para mi otro lugar al final. Entonces, lo documentaré aquí porque sé que lo olvidaré nuevamente.
La razón
input
fue perder el enfoque en mi caso se debió al hecho de que estaba volviendo a representar elinput
cambio de estado.Código de buggy:
Entonces, el problema es que siempre comienzo a codificar todo en un solo lugar para probar rápidamente y luego dividirlo todo en módulos separados. Pero, aquí esta estrategia fracasa porque la actualización del estado en el cambio de entrada desencadena la función de renderizado y se pierde el enfoque.
La solución es simple, realice la modularización desde el principio, en otras palabras, "Mueva el
Input
componente fuera derender
función"Código fijo
Árbitro. a la solución: https://github.com/styled-components/styled-components/issues/540#issuecomment-283664947
fuente
render()
yclass ... extends Component
debido a la referencia athis
. ponChange={this.handleInputChange}
render
función, para los componentes funcionales de React, no define componentes en el cuerpo de la función.render
función a las que se les estaba pasando el método 'this.handleChange' y devolvían los componentes que se utilizarían. Ejconst TextAreaDataField = TextAreaDataFieldFactory(this.handleChange)
. Simplemente moví la creación del componente al constructor y accedo a ellos en elrender
método comothis.TextAreaDataField
. Trabajado como un encanto.Si es un problema dentro de un enrutador de reacción,
<Route/>
use elrender
accesorio en lugar decomponent
.La pérdida de enfoque ocurre porque el
component
accesorio usaReact.createElement
cada vez en lugar de simplemente volver a renderizar los cambios.Detalles aquí: https://reacttraining.com/react-router/web/api/Route/component
fuente
<Route component={() => <MyComponent/>} />
cuando debería haberlo hecho<Route component={MyComponent} />
Mi respuesta es similar a lo que dijo @ z5h.
En mi caso, solía
Math.random()
generar un únicokey
para el componente.Pensé
key
que solo se usa para activar una repetición para ese componente en particular en lugar de volver a renderizar todos los componentes de esa matriz (devuelvo una matriz de componentes en mi código). No sabía que se usa para restaurar el estado después de la rendición.Quitar eso hizo el trabajo por mí.
fuente
La aplicación del
autoFocus
atributo alinput
elemento puede funcionar como una solución alternativa en situaciones en las que solo hay una entrada que debe enfocarse. En ese caso, unkey
atributo sería innecesario porque es solo un elemento y, además, no tendría que preocuparse por dividir elinput
elemento en su propio componente para evitar perder el foco en la reproducción del componente principal.fuente
Tengo el mismo comportamiento.
El problema en mi código fue que creé una matriz anidada de elementos jsx como este:
Cada elemento de esta matriz anidada se vuelve a renderizar cada vez que actualizo el elemento principal. Y así las entradas pierden su prop "ref" cada vez
Solucioné el problema con transformar la matriz interna en un componente de reacción (una función con una función de renderizado)
EDITAR:
El mismo problema aparece cuando construyo un anidado
React.Fragment
fuente
Me encontré con este problema y vine aquí en busca de ayuda. ¡Comprueba tu CSS! El campo de entrada no puede tener
user-select: none;
o no funcionará en un iPad.fuente
Resolví el mismo problema eliminando el atributo clave en la entrada y sus elementos principales
fuente
Para mí, esto se debía a que el cuadro de entrada de búsqueda se mostraba en el mismo componente (llamado UserList) que la lista de resultados de búsqueda. Entonces, cada vez que cambiaban los resultados de la búsqueda, se volvía a representar todo el componente UserList, incluido el cuadro de entrada.
Mi solución fue crear un componente completamente nuevo llamado UserListSearch que está separado de UserList . No necesité establecer claves en los campos de entrada en UserListSearch para que esto funcione. La función de renderizado de mi UsersContainer ahora se ve así:
Espero que esto también ayude a alguien.
fuente
Si el campo de entrada está dentro de otro elemento (es decir, un elemento contenedor como
<div key={"bart"}...><input key={"lisa"}...> ... </input></div>
, las elipses aquí indican código omitido), debe haber una clave única y constante en el elemento contenedor (así como en el campo de entrada) . De lo contrario, React presenta un nuevo elemento contenedor cuando se actualiza el estado del niño en lugar de simplemente volver a representar el contenedor anterior. Lógicamente, solo se debería actualizar el elemento hijo, pero ...Tuve este problema al intentar escribir un componente que tomaba mucha información de dirección. El código de trabajo se ve así
Los lectores perspicaces notarán que
<fieldset>
es un elemento contenedor, pero no requiere una clave. Lo mismo vale para<>
e<React.Fragment>
incluso<div>
¿Por qué? Quizás solo el contenedor inmediato necesite una llave. No se. Como dicen los libros de texto de matemáticas, la explicación se deja al lector como un ejercicio.fuente
La razón principal es: cuando React vuelva a renderizar, su referencia DOM anterior no será válida. Significa que react ha cambiado el árbol DOM, y this.refs.input.focus no funcionará, porque la entrada aquí ya no existe.
fuente
Las respuestas proporcionadas no me ayudaron, esto fue lo que hice, pero tuve una situación única.
Para limpiar el código, tiendo a usar este formato hasta que esté listo para colocar el componente en otro archivo.
Pero esto hizo que perdiera el foco, cuando puse el código directamente en el div, funcionó.
No sé por qué es esto, este es el único problema que he tenido al escribirlo de esta manera y lo hago en la mayoría de los archivos que tengo, pero si alguien hace algo similar, es por eso que pierde el enfoque.
fuente
Tuve el mismo problema con una tabla html en la que tengo líneas de texto de entrada en una columna. dentro de un bucle leo un objeto json y creo filas en particular, tengo una columna con inputtext.
http://reactkungfu.com/2015/09/react-js-loses-input-focus-on-typing/
Logré solucionarlo de la siguiente manera
fuente
Resulta que estaba vinculando
this
el componente que estaba causando que se volviera a rendir.Pensé que lo publicaría aquí en caso de que alguien más tuviera este problema.
Tuve que cambiar
A
Solución simple ya que en mi caso, no se necesita realmente
this
enrenderField
, pero espero que me publicar esto ayudará a alguien más.fuente
Cambié
value
prop adefaultValue
. Funciona para mi.fuente
Mi problema fue que nombré mi clave dinámicamente con un valor del elemento, en mi caso "nombre", por lo que la clave era clave = {
${item.name}-${index}
}. Entonces, cuando quería cambiar la entrada con item.name como valor, la clave también cambiaría y, por lo tanto, reaccionaría no reconocería ese elementofuente
Tuve este problema y el problema resultó ser que estaba usando un componente funcional y me estaba vinculando con el estado de un componente principal. Si cambiaba a usar un componente de clase, el problema desaparecía. Con suerte, hay una forma de evitar esto cuando se utilizan componentes funcionales, ya que es mucho más conveniente para los procesadores de elementos simples y otros.
fuente
incluyó el siguiente código en la entrada de la etiqueta:
Antes de:
Después:
fuente