Я попытался найти ответ на этот вопрос, но большинство из них находятся вне контекста React, где onChange
срабатывает размытие.
Выполняя различные тесты, я не могу сказать, чем отличаются эти два события (применительно к текстовой области). Может кто-нибудь пролить некоторый свет на это?
javascript
reactjs
dom-events
ffxsam
источник
источник
onChange
). И нет, вставка текста в текстовое поле (в React) запускает обаonChange
иonInput
. Не стесняйтесь тестировать на скрипке, и вы увидите.onChange
сработает иonInput
нет, но оба срабатывают.Ответы:
Кажется, нет реальной разницы
React по какой-то причине присоединяет слушателей
Component.onChange
кelement.oninput
событию DOM . См. Примечание в документации к формам:React docs - Формы
Такого поведения удивляет больше людей. Дополнительные сведения см. В этой проблеме в системе отслеживания проблем React:
Документируйте, как onChange в React соотносится с onInput # 3964
Цитата из комментариев по этому поводу:
Я согласен на 100% с комментарием ... Но я полагаю, что его изменение сейчас принесет больше проблем, чем решит, поскольку уже было написано так много кода, который полагается на это поведение.
React не является частью официальной коллекции веб-API
Несмотря на то, что React построен на основе JS и получил огромное распространение, существует технология React, позволяющая скрыть множество функций под собственным (довольно маленьким) API. Однажды область, где это очевидно, находится в системе событий, где много чего происходит под поверхностью, что на самом деле радикально отличается от стандартной системы событий DOM. Не только с точки зрения того, какие события что делают, но и с точки зрения того, когда данные могут сохраняться на каком этапе обработки события. Вы можете прочитать об этом здесь:
Система событий React
источник
Нет никакой разницы
React не имеет поведения события onChange по умолчанию. 'OnChange', который мы видим в реакции, имеет поведение события onInput по умолчанию. Итак, чтобы ответить на ваш вопрос, у них обоих нет разницы в реакции. Я поднял вопрос о том же на GitHub, и вот что они говорят по этому поводу:
https://github.com/facebook/react/issues/9567
Также эта статья предоставит больше информации. В качестве временного решения проблемы отсутствия onChange по умолчанию в статье предлагается прослушать событие onBlur.
https://www.peterbe.com/plog/onchange-in-reactjs
источник
Недавно у меня возникла ошибка, из-за которой
onChange
не разрешалось копирование и вставка в поле ввода IE11. В то время какonInput
событие допускало такое поведение. Я не смог найти никакой документации, которая описывала бы это в документах, но это показывает, что есть разница между ними (ожидаемая или нет).источник
Как вы можете видеть в различных комментариях здесь, React рассматривает onChange и onInput одинаково, и поэтому, а не обсуждает достоинства этого решения. Вот решение.
Используйте onBlur, если вы не хотите обрабатывать правки пользователя, пока они не будут сделаны. :)
источник
Для всех, кто наткнулся на эту проблему, ища способ прослушать реальное
change
событие, основанное на DOM , я сделал это следующим образом (написано на 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} />; } }
Пожалуйста, дайте мне знать, если вы видите способы улучшить этот подход или у вас возникнут проблемы с ним. В отличие от
blur
этогоchange
событие также запускается, когда пользователь нажимает клавишу ввода, и запускается только в том случае, если значение действительно изменилось.Я все еще набираюсь опыта с этим
CustomInput
компонентом. Например, странно ведут себя флажки. Мне нужно либо инвертироватьevent.target.checked
вonChange
обработчике, передавая значение флажку,checked
либо избавиться от этой инверсии при передаче значения флажку,defaultChecked
но это затем нарушает синхронизацию нескольких флажков, представляющих одно и то же состояние в разных местах на странице . (В обоих случаях я не передавалonInput
обработчик флажкамCustomInput
for.)источник