Usamos el paquete Backbone + ReactJS para crear una aplicación del lado del cliente. Confiando en gran medida en notorio valueLink
, propagamos valores directamente al modelo a través de su propio contenedor que admite la interfaz ReactJS para el enlace bidireccional.
Ahora nos enfrentamos al problema:
Tenemos un jquery.mask.js
complemento que formatea el valor de entrada mediante programación, por lo que no activa eventos React. Todo esto conduce a una situación en la que el modelo recibe valores sin formato de la entrada del usuario y pierde los formateados del complemento.
Parece que React tiene muchas estrategias de manejo de eventos según el navegador. ¿Existe alguna forma común de activar un evento de cambio para un elemento DOM en particular para que React lo escuche?
Respuestas:
Para React 16 y React> = 15.6
Setter
.value=
no funciona como queríamos porque la biblioteca React anula el setter de valores de entrada, pero podemos llamar a la función directamente en elinput
contexto as.Para el elemento de área de texto se debe utilizar
prototype
deHTMLTextAreaElement
clase.Nuevo ejemplo de codepen .
Todos los créditos a este colaborador y su solución
Respuesta desactualizada solo para React <= 15.5
Con
react-dom ^15.6.0
puede usar unasimulated
bandera en el objeto de evento para que el evento paseHice un codepen con un ejemplo
Para entender por qué se necesita una nueva bandera, encontré este comentario muy útil:
fuente
Al menos en las entradas de texto, parece que
onChange
está escuchando eventos de entrada:fuente
Event
no es compatible con IE https://developer.mozilla.org/en-US/docs/Web/API/Event/Eventvar event = document.createEvent('CustomEvent'); event.initCustomEvent('input', true, false, { });
, pero no tengo una VM IE9 a mano.var evt = document.createEvent('CustomEvent'); evt.initCustomEvent('input', true, false, { }); document.getElementById('description').value = 'I changed description'; document.getElementById('description').dispatchEvent(evt);
Sé que esta respuesta llega un poco tarde, pero recientemente enfrenté un problema similar. Quería activar un evento en un componente anidado. Tenía una lista con widgets de radio y casillas de verificación (eran divs que se comportaban como casillas de verificación y / o botones de radio) y en algún otro lugar de la aplicación, si alguien cerraba una caja de herramientas, necesitaba desmarcar una.
Encontré una solución bastante simple, no estoy seguro de si esta es la mejor práctica, pero funciona.
Esto desencadenó el evento de clic en el domNode y mi controlador adjunto a través de react fue llamado de hecho, por lo que se comporta como esperaría si alguien hiciera clic en el elemento. No he probado onChange pero debería funcionar, y no estoy seguro de cómo funcionará en versiones realmente antiguas de IE, pero creo que MouseEvent es compatible con al menos IE9 y versiones posteriores.
Eventualmente me alejé de esto para mi caso de uso particular porque mi componente era muy pequeño (solo una parte de mi aplicación usaba react ya que todavía lo estoy aprendiendo) y pude lograr lo mismo de otra manera sin obtener referencias a los nodos dom.
ACTUALIZAR:
Como otros han declarado en los comentarios, es mejor usarlo
this.refs.refname
para obtener una referencia a un nodo dom. En este caso, refname es la referencia que adjuntó a su componente a través de<MyComponent ref='refname' />
.fuente
React.findDOMNode
función. goo.gl/RqccrAref
a su elemento y luego usethis.ref.refName.dispatchEvent
Puede simular eventos usando ReactTestUtils pero eso está diseñado para pruebas unitarias.
Recomendaría no usar valueLink para este caso y simplemente escuchar los eventos de cambio activados por el complemento y actualizar el estado de la entrada en respuesta. El enlace bidireccional se utiliza más como demostración que como cualquier otra cosa; se incluyen en complementos solo para enfatizar el hecho de que el enlace bidireccional puro no es apropiado para la mayoría de las aplicaciones y que generalmente necesita más lógica de aplicación para describir las interacciones en su aplicación.
fuente
ReactTestUtils.Simulate.change(ReactDOM.findDOMNode(this.fieldRef))
Ampliando la respuesta de Grin / Dan Abramov, esto funciona en múltiples tipos de entrada. Probado en React> = 15.5
fuente
La activación de eventos de cambio en elementos arbitrarios crea dependencias entre componentes sobre las que es difícil razonar. Es mejor seguir con el flujo de datos unidireccional de React.
No hay un fragmento simple para activar el evento de cambio de React. La lógica se implementa en ChangeEventPlugin.js y hay diferentes ramas de código para diferentes tipos de entrada y navegadores. Además, los detalles de implementación varían según las versiones de React.
He creado react-trigger-change que lo hace, pero está destinado a ser utilizado para pruebas, no como una dependencia de producción:
CodePen
fuente
bueno, dado que usamos funciones para manejar un evento onchange, podemos hacerlo así:
fuente
Encontré esto en los problemas de Github de React: funciona como un encanto (v15.6.2)
Así es como lo implementé en una entrada de texto:
fuente
Por
HTMLSelectElement
, es decir<select>
fuente
Si está utilizando Backbone y React, le recomiendo uno de los siguientes:
Ambos ayudan a integrar modelos y colecciones de Backbone con vistas de React. Puede usar eventos de Backbone como lo hace con las vistas de Backbone. He incursionado en ambos y no vi mucha diferencia, excepto que uno es un mixin y el otro cambia
React.createClass
aReact.createBackboneClass
.fuente