Kami menggunakan bundel Backbone + ReactJS untuk membangun aplikasi sisi klien. Sangat bergantung pada terkenal, valueLink
kami menyebarkan nilai langsung ke model melalui pembungkusnya sendiri yang mendukung antarmuka ReactJS untuk pengikatan dua arah.
Sekarang kami menghadapi masalah:
Kami memiliki jquery.mask.js
plugin yang memformat nilai input secara terprogram sehingga tidak mengaktifkan peristiwa React. Semua ini mengarah pada situasi ketika model menerima nilai yang tidak diformat dari input pengguna dan melewatkan yang diformat dari plugin.
Tampaknya React memiliki banyak strategi penanganan acara bergantung pada browser. Apakah ada cara umum untuk memicu peristiwa perubahan untuk elemen DOM tertentu sehingga React akan mendengarnya?
Jawaban:
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 padainput
konteks as.Untuk elemen textarea Anda harus menggunakan
prototype
dariHTMLTextAreaElement
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 menggunakansimulated
bendera pada objek acara untuk melewati acaraSaya membuat codepen dengan sebuah contoh
Untuk memahami mengapa bendera baru diperlukan, saya menemukan komentar ini sangat membantu:
sumber
Setidaknya pada input teks, tampaknya
onChange
mendengarkan input event:sumber
Event
tidak mendukung IE https://developer.mozilla.org/en-US/docs/Web/API/Event/Eventvar event = document.createEvent('CustomEvent'); event.initCustomEvent('input', true, false, { });
, tetapi saya tidak memiliki VM IE9.var evt = document.createEvent('CustomEvent'); evt.initCustomEvent('input', true, false, { }); document.getElementById('description').value = 'I changed description'; document.getElementById('description').dispatchEvent(evt);
Saya tahu jawaban ini datang sedikit terlambat tetapi saya baru-baru ini menghadapi masalah yang sama. Saya ingin memicu acara pada komponen bersarang. Saya memiliki daftar dengan radio dan widget tipe kotak centang (mereka div yang berperilaku seperti kotak centang dan / atau tombol radio) dan di beberapa tempat lain dalam aplikasi, jika seseorang menutup kotak alat, saya perlu menghapus centang satu.
Saya menemukan solusi yang cukup sederhana, tidak yakin apakah ini adalah praktik terbaik tetapi berhasil.
Ini memicu event klik pada domNode dan handler saya yang terpasang melalui react memang dipanggil sehingga berperilaku seperti yang saya harapkan jika seseorang mengklik elemen tersebut. Saya belum menguji onChange tetapi seharusnya berfungsi, dan tidak yakin bagaimana ini akan adil di versi IE yang benar-benar lama tetapi saya yakin MouseEvent didukung setidaknya di IE9 dan yang lebih baru.
Saya akhirnya pindah dari ini untuk kasus penggunaan khusus saya karena komponen saya sangat kecil (hanya sebagian dari aplikasi saya yang digunakan bereaksi karena saya masih mempelajarinya) dan saya dapat mencapai hal yang sama dengan cara lain tanpa mendapatkan referensi ke node dom.
MEMPERBARUI:
Seperti yang dinyatakan orang lain di komentar, lebih baik menggunakan
this.refs.refname
untuk mendapatkan referensi ke node dom. Dalam kasus ini, refname adalah referensi yang Anda lampirkan ke komponen melalui<MyComponent ref='refname' />
.sumber
React.findDOMNode
fungsi tersebut. goo.gl/RqccrAref
ke elemen Anda lalu gunakanthis.ref.refName.dispatchEvent
Anda dapat mensimulasikan kejadian menggunakan ReactTestUtils tetapi itu dirancang untuk pengujian unit.
Saya akan merekomendasikan untuk tidak menggunakan valueLink untuk kasus ini dan hanya mendengarkan peristiwa perubahan yang dipicu oleh plugin dan memperbarui status input sebagai tanggapan. Util mengikat dua arah lebih sebagai demo dari apa pun; mereka disertakan dalam addons hanya untuk menekankan fakta bahwa pengikatan dua arah murni tidak sesuai untuk sebagian besar aplikasi dan bahwa Anda biasanya memerlukan lebih banyak logika aplikasi untuk mendeskripsikan interaksi dalam aplikasi Anda.
sumber
ReactTestUtils.Simulate.change(ReactDOM.findDOMNode(this.fieldRef))
Memperluas jawaban dari Grin / Dan Abramov, ini berfungsi di berbagai jenis masukan. Diuji di React> = 15.5
sumber
Memicu peristiwa perubahan pada elemen arbitrer menciptakan ketergantungan antar komponen yang sulit untuk dipikirkan. Lebih baik tetap menggunakan aliran data satu arah React.
Tidak ada cuplikan sederhana untuk memicu peristiwa perubahan React. Logikanya diimplementasikan di ChangeEventPlugin.js dan ada cabang kode yang berbeda untuk jenis input dan browser yang berbeda. Selain itu, detail implementasi berbeda-beda di setiap versi React.
Saya telah membangun react-trigger-change yang melakukan hal itu, tetapi ini dimaksudkan untuk digunakan untuk pengujian, bukan sebagai ketergantungan produksi:
CodePen
sumber
karena kami menggunakan fungsi untuk menangani acara onchange, kami dapat melakukannya seperti ini:
sumber
Saya menemukan ini pada masalah Github React: Bekerja seperti pesona (v15.6.2)
Berikut adalah bagaimana saya mengimplementasikan ke input Teks:
sumber
Untuk
HTMLSelectElement
, yaitu<select>
sumber
Jika Anda menggunakan Backbone dan React, saya akan merekomendasikan salah satu dari yang berikut ini,
Keduanya membantu mengintegrasikan model dan koleksi Backbone dengan tampilan React. Anda dapat menggunakan acara Backbone seperti yang Anda lakukan dengan tampilan Backbone. Saya telah mencoba keduanya dan tidak melihat banyak perbedaan kecuali satu adalah mixin dan perubahan lainnya
React.createClass
keReact.createBackboneClass
.sumber