React 16およびReact> = 15.6の場合
.value=
Reactライブラリは入力値セッターをオーバーライドするため、セッターは期待どおりに機能しませんが、input
asコンテキストで関数を直接呼び出すことができます。
var nativeInputValueSetter = Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype, "value").set;
nativeInputValueSetter.call(input, 'react 16 value');
var ev2 = new Event('input', { bubbles: true});
input.dispatchEvent(ev2);
textarea要素の場合prototype
、HTMLTextAreaElement
クラスを使用する必要があります。
新しいcodepenの例。
この貢献者と彼のソリューションへのすべてのクレジット
React <= 15.5のみの古い回答
ではreact-dom ^15.6.0
、あなたは使用することができsimulated
通過するイベントのイベントオブジェクトにフラグを
var ev = new Event('input', { bubbles: true});
ev.simulated = true;
element.value = 'Something new';
element.dispatchEvent(ev);
例でコードペンを作りました
新しいフラグが必要な理由を理解するために、このコメントは非常に役に立ちました。
Reactの入力ロジックは、重複排除の変更イベントを重複排除するため、値ごとに2回以上発生しません。これは、ブラウザーのonChange / onInputイベントと、DOMノード値プロップ(JavaScriptを介して値を更新するとき)のセットの両方をリッスンします。これには、入力の値を手動で更新する場合にinput.value = 'foo'から{target:input}を使用してChangeEventをディスパッチするという副作用があります。Reactは、セットとイベントの両方を登録します。 '、それを重複イベントと見なし、それを飲み込みます。
「実際の」ブラウザで開始されたイベントはelement.valueのセットをトリガーしないため、これは通常のケースでは正常に機能します。トリガーするイベントにシミュレートされたフラグでタグを付けることにより、このロジックを密かに救済でき、反応すると常にイベントが発生します。
https://github.com/jquense/react/blob/9a93af4411a8e880bbc05392ccf2b195c97502d1/src/renderers/dom/client/eventPlugins/ChangeEventPlugin.js#L128