Intenté buscar una respuesta a esto, pero la mayoría de ellos están fuera del contexto de React, donde se onChange
desencadena al desenfoque.
Al realizar varias pruebas, parece que no puedo decir en qué se diferencian estos dos eventos (cuando se aplican a un área de texto). ¿Alguien puede arrojar algo de luz sobre esto?
javascript
reactjs
dom-events
ffxsam
fuente
fuente
onChange
). Y no, pegar texto en un área de texto (en React) activa tantoonChange
yonInput
. Siéntase libre de probar en un violín y lo verá.onChange
se dispararía yonInput
no, pero ambos se dispararían.Respuestas:
Parece que no hay diferencia real
React, por alguna razón, adjunta oyentes
Component.onChange
alelement.oninput
evento DOM . Vea la nota en los documentos sobre formularios:React docs - Formularios
Hay más personas a las que les sorprende este comportamiento. Para obtener más detalles, consulte este problema en el rastreador de problemas de React:
Documente cómo el onChange de React se relaciona con onInput # 3964
Cita de los comentarios sobre ese tema:
Estoy 100% de acuerdo con el comentario ... Pero supongo que cambiarlo ahora traerá más problemas de los que resuelve, ya que se había escrito tanto código que se basa en este comportamiento.
React no es parte de la colección oficial de API web
A pesar de que React está construido sobre JS y ha visto una gran tasa de adopción, como tecnología, React existe para ocultar una gran cantidad de funcionalidades bajo su propia API (bastante pequeña). Una vez que el área donde esto es obvio es en el sistema de eventos, donde están sucediendo muchas cosas bajo la superficie que en realidad son radicalmente diferentes del sistema de eventos DOM estándar. No solo en términos de qué eventos hacen qué, sino también en términos de cuándo se permite que los datos persistan en qué etapa del manejo de eventos. Puedes leer mas al respecto aquí:
React Event System
fuente
No hay diferencia
React no tiene el comportamiento del evento predeterminado 'onChange'. El 'onChange' que vemos en react tiene el comportamiento del evento predeterminado 'onInput'. Entonces, para responder a su pregunta, no hay diferencia en la reacción de ambos. He planteado un problema en GitHub con respecto a lo mismo y esto es lo que tienen que decir al respecto:
https://github.com/facebook/react/issues/9567
Además, este artículo proporcionará más información. Como solución para la falta de 'onChange' predeterminado, el artículo sugiere escuchar el evento 'onBlur'.
https://www.peterbe.com/plog/onchange-in-reactjs
fuente
Recientemente obtuve un error
onChange
que no permitía copiar y pegar en el campo de entrada en IE11. Considerando que elonInput
evento permitiría ese comportamiento. No pude encontrar ninguna documentación que describiera esto en los documentos, pero eso muestra que hay una diferencia entre los dos (esperada o no).fuente
Como puede ver en varios comentarios aquí, React trata onChange y onInput de la misma manera, en lugar de debatir los méritos de esta decisión. Esta es la solución.
Use onBlur cuando no desee procesar las ediciones del usuario hasta que estén listas. :)
fuente
Para cualquiera que haya tropezado con este problema buscando una forma de escuchar el
change
evento real basado en DOM , así es como lo hice (escrito en TypeScript):import { Component, createElement, InputHTMLAttributes } from 'react'; export interface CustomInputProps { onChange?: (event: Event) => void; onInput?: (event: Event) => void; } /** * This component restores the 'onChange' and 'onInput' behavior of JavaScript. * * See: * - https://reactjs.org/docs/dom-elements.html#onchange * - https://github.com/facebook/react/issues/3964 * - https://github.com/facebook/react/issues/9657 * - https://github.com/facebook/react/issues/14857 */ export class CustomInput extends Component<Omit<InputHTMLAttributes<HTMLInputElement>, 'onChange' | 'onInput' | 'ref'> & CustomInputProps> { private readonly registerCallbacks = (element: HTMLInputElement | null) => { if (element) { element.onchange = this.props.onChange ? this.props.onChange : null; element.oninput = this.props.onInput ? this.props.onInput : null; } }; public render() { return <input ref={this.registerCallbacks} {...this.props} onChange={undefined} onInput={undefined} />; } }
Por favor, avíseme si encuentra formas de mejorar este enfoque o tiene problemas con él. A diferencia de
blur
lachange
evento también se activa cuando el usuario presiona Enter y solo se activa si el valor realmente cambió.Todavía estoy ganando experiencia con este
CustomInput
componente. Por ejemplo, las casillas de verificación se comportan de forma extraña. Tengo que invertirevent.target.checked
en elonChange
controlador mientras paso el valor a la casilla de verificación conchecked
o deshacerme de esta inversión al pasar el valor a la casilla de verificación con,defaultChecked
pero esto rompe que varias casillas de verificación que representan el mismo estado en diferentes lugares de la página se mantienen sincronizadas . (En ambos casos, no pasé unonInput
controlador a lasCustomInput
casillas de verificación for).fuente