TLDR: Gunakan defaultChecked alih-alih dicentang, bekerja jsbin .
Mencoba mengatur kotak centang sederhana yang akan mencoret teks labelnya ketika dicentang. Untuk beberapa alasan handleChange tidak dipecat ketika saya menggunakan komponen. Adakah yang bisa menjelaskan kesalahan saya?
var CrossoutCheckbox = React.createClass({
getInitialState: function () {
return {
complete: (!!this.props.complete) || false
};
},
handleChange: function(){
console.log('handleChange', this.refs.complete.checked); // Never gets logged
this.setState({
complete: this.refs.complete.checked
});
},
render: function(){
var labelStyle={
'text-decoration': this.state.complete?'line-through':''
};
return (
<span>
<label style={labelStyle}>
<input
type="checkbox"
checked={this.state.complete}
ref="complete"
onChange={this.handleChange}
/>
{this.props.text}
</label>
</span>
);
}
});
Pemakaian:
React.renderComponent(CrossoutCheckbox({text: "Text Text", complete: false}), mountNode);
Larutan:
Menggunakan dicentang tidak membiarkan nilai yang mendasarinya berubah (tampaknya) dan dengan demikian tidak memanggil penangan onChange. Beralih ke defaultChecked tampaknya memperbaiki ini:
var CrossoutCheckbox = React.createClass({
getInitialState: function () {
return {
complete: (!!this.props.complete) || false
};
},
handleChange: function(){
this.setState({
complete: !this.state.complete
});
},
render: function(){
var labelStyle={
'text-decoration': this.state.complete?'line-through':''
};
return (
<span>
<label style={labelStyle}>
<input
type="checkbox"
defaultChecked={this.state.complete}
ref="complete"
onChange={this.handleChange}
/>
{this.props.text}
</label>
</span>
);
}
});
this.setState({checked: !this.state.checked})
mudah daripada harus menyimpan nilai. Kemudian operator ternary di attrubute yang diperiksa:checked={this.state.checked ? 'checked': null}
this.refs.complete.getDOMNode().checked
. lihat fiddle jsfiddle.net/d10xyqu1Jawaban:
Untuk mendapatkan status yang dicentang dari kotak centang Anda, pathnya adalah:
Alternatifnya adalah mendapatkannya dari acara yang diteruskan ke
handleChange
metode:sumber
checked
untuk komponen yang dikontrol: /checked
berarti keadaan dikelola di luar komponen. Ketika pengguna mengklik tidak ada yang bisa dihubungihandleChange
karena tidak ada keadaan yang diperbarui. Alih-alih, Anda perlu mendengarkanonClick
dan memicu pembaruan status di sana.Lebih baik tidak menggunakan referensi dalam kasus seperti itu. Menggunakan:
Ada beberapa opsi:
checked
vs.defaultChecked
Yang pertama akan menanggapi perubahan status dan klik. Yang terakhir akan mengabaikan perubahan status.
onClick
vs.onChange
Yang pertama akan selalu memicu klik. Yang terakhir tidak akan memicu klik jika
checked
atribut ada padainput
elemen.sumber
Dalam skenario Anda TIDAK ingin menggunakan penangan onChange pada input DOM, Anda dapat menggunakan
onClick
properti sebagai alternatif. ThedefaultChecked
, kondisi dapat meninggalkan kondisi tetap untuk v16 IINM.Saya harap ini membantu seseorang di masa depan.
sumber
Jika Anda memiliki
handleChange
fungsi yang terlihat seperti ini:Anda dapat membuat
onChange
fungsi khusus sehingga berfungsi seperti input teks:sumber
handleChange
padainput
seharusnyathis.handleChange
?Jika seseorang mencari pengatur kejadian universal, kode berikut ini dapat digunakan lebih atau kurang (dengan asumsi bahwa properti nama diset untuk setiap input):
sumber
onChange tidak akan memanggil handleChange di ponsel saat menggunakan defaultChecked. Sebagai alternatif, Anda dapat menggunakan onClick dan onTouchEnd.
sumber
Dalam materi ui, keadaan kotak centang dapat diambil sebagai
sumber