Dalam komponen Bereaksi untuk <select>
menu, saya perlu mengatur selected
atribut pada opsi yang mencerminkan keadaan aplikasi.
Di render()
, optionState
diteruskan dari pemilik negara ke komponen SortMenu. Nilai opsi diteruskan sebagai props
dari JSON.
render: function() {
var options = [],
optionState = this.props.optionState;
this.props.options.forEach(function(option) {
var selected = (optionState === option.value) ? ' selected' : '';
options.push(
<option value={option.value}{selected}>{option.label}</option>
);
});
// pass {options} to the select menu jsx
Namun itu memicu kesalahan sintaks pada kompilasi JSX.
Melakukan hal ini akan menghilangkan kesalahan sintaksis tetapi jelas tidak menyelesaikan masalah:
var selected = (optionState === option.value) ? 'selected' : 'false';
<option value={option.value} selected={selected}>{option.label}</option>
Saya juga mencoba ini:
var selected = (optionState === option.value) ? true : false;
<option value={option.value} {selected ? 'selected' : ''}>{option.label}</option>
Apakah ada cara yang disarankan untuk menyelesaikan ini?
javascript
reactjs
cantera
sumber
sumber
Jawaban:
Bereaksi secara otomatis memahami boolean untuk tujuan ini, jadi Anda cukup menulis (catatan: tidak disarankan)
dan itu akan menampilkan 'dipilih' dengan tepat.
Namun, Bereaksi membuat ini lebih mudah bagi Anda. Alih-alih mendefinisikan
selected
pada setiap opsi, Anda dapat (dan seharusnya) cukup menulisvalue={optionsState}
pada tag pilih itu sendiri :Untuk info lebih lanjut, lihat Bereaksi pilih tag doc .
sumber
onChange={this.handleSelect}
dan menetapkan nilai status untuk komponen Anda, misalnya: 'handleSelect: function () {this.setState ({value: event.target.value});} `Ini akan membuat komponen pilih Anda dengan yang baru item yang dipilih. Semoga ini bisa membantu Anda.value
prop pada a<select>
dapat berupa array jika Anda telahmultiselect
mengaktifkan.defaultValue
untuk menginisialisasiAnda dapat melakukan apa yang Bereaksi memperingatkan Anda ketika Anda mencoba mengatur properti "terpilih" dari
<option>
:Jadi, Anda dapat menggunakan
options.value
pada pilihandefaultValue
Andasumber
Berikut ini adalah solusi lengkap yang menggabungkan jawaban terbaik dan komentar di bawahnya (yang mungkin membantu seseorang yang kesulitan untuk menyatukan semuanya):
UPDATE FOR ES6 (2019) - menggunakan fungsi panah dan perusakan objek
dalam komponen utama:
termasuk komponen (yang sekarang menjadi fungsional stateless):
JAWABAN SEBELUMNYA (menggunakan ikatan):
dalam komponen utama:
termasuk komponen (yang sekarang menjadi fungsional stateless):
komponen utama mempertahankan nilai yang dipilih untuk buah (dalam keadaan), komponen yang disertakan menampilkan elemen yang dipilih dan pembaruan dikembalikan ke komponen utama untuk memperbarui keadaannya (yang kemudian memutar kembali ke komponen yang disertakan untuk mengubah nilai yang dipilih).
Perhatikan penggunaan prop nama yang memungkinkan Anda untuk mendeklarasikan metode handleChange tunggal untuk bidang lain pada formulir yang sama terlepas dari jenisnya.
sumber
this.handleChange.bind(this);
harusthis.handleChange = this.handleChange.bind(this)
;Berikut ini contoh terbaru cara melakukannya. Dari bereaksi docs , ditambah sintaks metode "lemak-panah" yang mengikat secara otomatis.
sumber
Cukup tambahkan sebagai opsi pertama dari tag pilihan Anda:
Ini akan menjadi default dan ketika Anda akan memilih opsi yang valid akan ditetapkan pada negara Anda
sumber
sumber
Saya punya masalah dengan
<select>
tag yang tidak diperbarui ke yang benar<option>
ketika kondisi berubah. Masalah saya tampaknya adalah bahwa jika Anda membuat dua kali berturut-turut, pertama kali tanpa pra-pilih<option>
tetapi kedua kalinya dengan satu, maka<select>
tag tidak memperbarui pada render kedua, tetapi tetap pada default pertama.Saya menemukan solusi untuk ini menggunakan referensi . Anda perlu mendapatkan referensi ke
<select>
simpul tag Anda (yang mungkin bersarang di beberapa komponen), dan kemudian secara manual memperbaruivalue
properti di dalamnya, dicomponentDidUpdate
hook.sumber
Posting jawaban yang serupa untuk MULTISELECT / optgroups:
sumber
Saya punya solusi sederhana mengikuti dasar HTML.
.text-hide
adalah kelas bootstrap, jika Anda tidak menggunakan bootstrap, inilah Anda:sumber
Saya mengatasi masalah serupa dengan mengatur defaultProps:
<select value="this.props.propName" ...
Jadi sekarang saya menghindari kesalahan pada kompilasi jika prop saya tidak ada sampai pemasangan.
sumber
value
penyangga ke bidang formulir tanpaonChange
penangan. Ini akan membuat bidang hanya baca. Jika bidang harus dapat digunakan berubah-ubahdefaultValue
. Jika tidak, atur salah satuonChange
ataureadOnly
.