Untuk React 16 dan React> = 15.6
Setter .value=
tidak bekerja seperti yang kita inginkan karena perpustakaan React menimpa setter nilai input tetapi kita dapat memanggil fungsi tersebut secara langsung pada input
konteks 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);
Untuk elemen textarea Anda harus menggunakan prototype
dari HTMLTextAreaElement
kelas.
Contoh codepen baru .
Semua kredit untuk kontributor ini dan solusinya
Jawaban usang hanya untuk React <= 15.5
Dengan react-dom ^15.6.0
Anda dapat menggunakan simulated
bendera pada objek acara untuk melewati acara
var ev = new Event('input', { bubbles: true});
ev.simulated = true;
element.value = 'Something new';
element.dispatchEvent(ev);
Saya membuat codepen dengan sebuah contoh
Untuk memahami mengapa bendera baru diperlukan, saya menemukan komentar ini sangat membantu:
Logika masukan dalam React sekarang menghilangkan peristiwa perubahan sehingga tidak diaktifkan lebih dari sekali per nilai. Ini mendengarkan baik kejadian onChange / onInput browser serta set pada prop nilai simpul DOM (ketika Anda memperbarui nilai melalui javascript). Ini memiliki efek samping yang berarti bahwa jika Anda memperbarui nilai input secara manual input.value = 'foo' kemudian mengirimkan ChangeEvent dengan {target: input} React akan mendaftarkan set dan acara, lihat nilainya masih '' foo ', anggap itu acara duplikat dan telanlah.
Ini berfungsi dengan baik dalam kasus normal karena peristiwa yang dimulai browser "nyata" tidak memicu set pada element.value. Anda dapat keluar dari logika ini secara diam-diam dengan menandai peristiwa yang Anda picu dengan bendera simulasi dan bereaksi akan selalu mengaktifkan peristiwa tersebut.
https://github.com/jquense/react/blob/9a93af4411a8e880bbc05392ccf2b195c97502d1/src/renderers/dom/client/eventPlugins/ChangeEventPlugin.js#L128