Saya baru mengenal ReactJS, maaf jika ini tidak aktif. Saya memiliki komponen yang membuat beberapa baris tabel sesuai dengan data yang diterima.
Setiap sel dalam kolom memiliki kotak centang radio. Karenanya pengguna dapat memilih satu site_name
dan satu address
dari baris yang ada. Seleksi harus ditunjukkan dalam catatan kaki. Dan di situlah saya terjebak.
var SearchResult = React.createClass({
render: function(){
var resultRows = this.props.data.map(function(result){
return (
<tbody>
<tr>
<td><input type="radio" name="site_name" value={result.SITE_NAME}>{result.SITE_NAME}</input></td>
<td><input type="radio" name="address" value={result.ADDRESS}>{result.ADDRESS}</input></td>
</tr>
</tbody>
);
});
return (
<table className="table">
<thead>
<tr>
<th>Name</th>
<th>Address</th>
</tr>
</thead>
{resultRows}
<tfoot>
<tr>
<td>chosen site name ???? </td>
<td>chosen address ????? </td>
</tr>
</tfoot>
</table>
);
}
});
Di jQuery saya bisa melakukan sesuatu seperti $("input[name=site_name]:checked").val()
mendapatkan pemilihan satu jenis kotak centang radio dan memasukkannya ke sel footer pertama.
Tetapi tentunya harus ada cara Reactjs, yang saya benar-benar hilang? Terimakasih banyak
input
elemen tidak memiliki konten. Jadi<input>content</input>
tidak masuk akal dan tidak valid. Anda mungkin mau<label><input />content</label>
.Jawaban:
Setiap perubahan pada rendering harus diubah melalui
state
atauprops
( react doc ).Jadi di sini saya mendaftarkan acara input, dan kemudian mengubah
state
, yang kemudian akan memicu render untuk ditampilkan di footer.jsbin
sumber
}, this);
di bawahnya</tbody>
. Apa itu dan apa fungsinya? Saya perhatikan tanpa itu kode crash.this
adalah konteks dilewatkan kemap
fungsi . Itu hasil edit oleh @FakeRainBrigand, tangkapan bagus! Tanpanya,this
fungsi peta Anda akan merujuk kewindow
, yang tidak tahu tentang apastate
ituthis
trik tidak diperlukan jika Anda menggunakan ES6 panah bukan fungsi biasa. Misalnya:var resultRows = this.props.data.map((result) => { ... });
Saya hanya menyebutkannya karena React-ers biasanya sudah menggunakan beberapa bentuk transpilasi (untuk JSX), jadi ES6 biasanya mudah dijangkau.onInputChange (e) {this.setState({ [e.target.name]: e.target.value }); }
Berikut adalah cara paling sederhana untuk mengimplementasikan tombol radio dalam bereaksi.
Diedit
Anda dapat menggunakan fungsi panah alih-alih mengikat. Ganti kode di atas sebagai
<div onChange={event => this.setGender(event)}>
Untuk penggunaan nilai default
defaultChecked
, seperti inisumber
.bind(this)
akan membuat fungsi baru setiap saat. Ini berarti ketika bereaksi memeriksa untuk melihat apakah ada yang berubah di DOM virtual, komponen ini akan selalu berbeda, dan selalu perlu dirender ulang.name
prop yang sama . Keduanya dibungkus dengan div yang memilikionChange
pawang seperti yang dijelaskan dalam jawaban ini. Saya mengklik radio pertama, sebuah acara dipecat. Saya mengklik radio kedua, sebuah acara dipecat. Namun yang ketiga dan selanjutnya, tidak ada acara yang dipecat. Mengapa?Berdasarkan apa yang dikatakan React Docs :
Sebagai contoh:
Tautan ke contoh: https://codesandbox.io/s/6l6v9p0qkr
Pada awalnya, tidak ada tombol radio yang dipilih sehingga
this.state
merupakan objek kosong, tetapi setiap kali tombol radio dipilihthis.state
mendapatkan properti baru dengan nama input dan nilainya. Maka memudahkan untuk memeriksa apakah pengguna memilih tombol radio seperti:EDIT:
Dengan React versi 16.7-alpha ada proposal untuk sesuatu yang disebut
hooks
yang akan membuat Anda melakukan hal-hal semacam ini lebih mudah:Pada contoh di bawah ini ada dua kelompok tombol radio dalam komponen fungsional. Namun, mereka telah mengendalikan input:
Contoh kerja: https://codesandbox.io/s/6l6v9p0qkr
sumber
Jadikan komponen radio sebagai komponen bisu dan berikan bantuan dari orangtua.
sumber
Hanya sebuah ide di sini: ketika datang ke input radio di Bereaksi, saya biasanya membuat semuanya dengan cara yang berbeda yang disebutkan dalam jawaban sebelumnya.
Jika ini dapat membantu siapa saja yang perlu membuat banyak tombol radio:
sumber
checked={ this.state.gender === value }
. Komponen fungsional tidak punyathis
.sumber
Mengklik tombol radio akan memicu acara yang:
self.props.selectionChanged(...)
Dalam kasus pertama, perubahan adalah status akan memicu re-render dan Anda dapat melakukannya
<td>chosen site name {this.state.chosenSiteName} </td>
dalam kasus kedua, sumber panggilan balik akan memperbarui hal-hal untuk memastikan bahwa di bawah garis, contoh SearchResult Anda akan memilihSiteName dan selectedAddress yang diatur dalam props itu.
sumber
Untuk membangun di atas kata ChinKang untuk jawabannya, saya memiliki pendekatan yang lebih kering dan dalam es6 bagi mereka yang tertarik:
kecuali yang ini akan memiliki nilai diperiksa standar.
sumber
Saya juga bingung di radio, implementasi kotak centang. Yang kita butuhkan adalah, dengarkan perubahan acara radio, lalu atur keadaan. Saya telah membuat contoh kecil pemilihan gender.
sumber
Bootstrap guys, kami melakukannya seperti ini:
sumber