Saya ingin memeriksa apa yang terjadi ketika Anda menggunakan this.setState beberapa kali (2 kali demi diskusi). Saya berpikir bahwa komponen akan di-render dua kali tetapi ternyata itu hanya ditampilkan sekali. Harapan lain yang saya miliki adalah bahwa mungkin panggilan kedua untuk setState akan menjalankan yang pertama, tetapi Anda dapat menebaknya - berfungsi dengan baik.
Tautkan ke JSfiddle
var Hello = React.createClass({
render: function() {
return (
<div>
<div>Hello {this.props.name}</div>
<CheckBox />
</div>
);
}
});
var CheckBox = React.createClass({
getInitialState: function() {
return {
alex: 0
};
},
handleChange: function(event) {
this.setState({
value: event.target.value
});
this.setState({
alex: 5
});
},
render: function() {
alert('render');
return (
<div>
<label htmlFor="alex">Alex</label>
<input type="checkbox" onChange={this.handleChange} name="alex" />
<div>{this.state.alex}</div>
</div>
);
}
});
ReactDOM.render(
<Hello name="World" />,
document.getElementById('container')
);
Seperti yang akan Anda lihat, peringatan yang mengatakan 'render' muncul di setiap render.
Apakah Anda memiliki penjelasan mengapa ini bekerja dengan baik?
javascript
reactjs
alexunder
sumber
sumber
this.state.alex
- apa yang terjadi jika Anda menambahkan elemen yang bergantungthis.state.value
juga?Jawaban:
React batches state update yang terjadi di event handler dan metode siklus hidup. Jadi, jika Anda memperbarui status beberapa kali di sebuah
<div onClick />
handler, React akan menunggu penanganan event selesai sebelum rendering ulang.Untuk lebih jelasnya, ini hanya berfungsi dalam penanganan kejadian sintetis dan metode siklus hidup yang dikontrol React. Pembaruan status tidak dikumpulkan di AJAX dan
setTimeout
penangan kejadian, misalnya.sumber
<div onClick />
) dan metode siklus hidup komponen, ia tahu bahwa ia dapat dengan aman mengubah perilakusetState
selama panggilan ke pembaruan status batch dan menunggu untuk dibilas. Sebaliknya, dalam AJAX atausetTimeout
handler, React tidak memiliki cara untuk mengetahui kapan handler kita telah selesai dieksekusi. Secara teknis, status antrian React diperbarui dalam kedua kasus, tetapi segera keluar dari penangan yang dikendalikan React.ReactDOM.unstable_batchedUpdates(function)
batch disetState
luar penangan acara React. Sesuai namanya, Anda akan membatalkan garansi Anda.Metode setState () tidak segera memperbarui status komponen, metode ini hanya menempatkan pembaruan dalam antrian untuk diproses nanti. React dapat mengumpulkan beberapa permintaan pembaruan untuk membuat rendering lebih efisien. Karenanya, tindakan pencegahan khusus harus dilakukan saat Anda mencoba memperbarui status berdasarkan status komponen sebelumnya.
Misalnya, kode berikut hanya akan menambah atribut nilai status sebesar 1 meskipun telah dipanggil 4 kali:
Untuk menggunakan keadaan setelah diperbarui, lakukan semua logika dalam argumen callback:
Metode setState (updater, [callback]) bisa menggunakan fungsi updater sebagai argumen pertamanya untuk memperbarui status berdasarkan status dan properti sebelumnya. Nilai kembali dari fungsi pembaru akan digabungkan secara dangkal dengan status komponen sebelumnya. Metode ini memperbarui status secara asinkron, jadi ada opsi callback yang akan dipanggil setelah negara selesai memperbarui sepenuhnya.
Contoh:
Berikut adalah contoh cara mengupdate status berdasarkan status sebelumnya:
sumber
setState(updater,[callback])
itu, ini sepertiObject.assign
terima kasih yang kurang bertele-tele untuk itu!