Saya membaca bagian FormulirReaksidokumentasi dan baru saja mencoba kode ini untuk menunjukkan onChange
penggunaan ( JSBIN ).
var React= require('react');
var ControlledForm= React.createClass({
getInitialState: function() {
return {
value: "initial value"
};
},
handleChange: function(event) {
console.log(this.state.value);
this.setState({value: event.target.value});
console.log(this.state.value);
},
render: function() {
return (
<input type="text" value={this.state.value} onChange={this.handleChange}/>
);
}
});
React.render(
<ControlledForm/>,
document.getElementById('mount')
);
Ketika saya memperbarui <input/>
nilai di browser, yang kedua console.log
di dalam handleChange
callback mencetak sama value
dengan yang pertama console.log
, Mengapa saya tidak bisa melihat hasil this.setState({value: event.target.value})
dalam lingkup handleChange
callback?
javascript
reactjs
react-jsx
tarrsalah
sumber
sumber
Jawaban:
Dari dokumentasi Bereaksi :
Jika Anda ingin fungsi dijalankan setelah perubahan status terjadi, berikan sebagai panggilan balik.
sumber
componentDidUpdate
. Ini akan dipanggil setelah negara berubah.shouldComponentUpdate
yang menentukan sebaliknya. Apa sebenarnya yang Anda coba lakukan dalam callback yang Anda sampaikan dansetState
ingin Anda wujudkan sebelum render ulang?Seperti disebutkan dalam dokumentasi Bereaksi, tidak ada jaminan
setState
dipecat secara serempak, sehingga Andaconsole.log
dapat mengembalikan negara sebelum memperbarui.Michael Parker menyebutkan lewat callback di dalam
setState
. Cara lain untuk menangani logika setelah perubahan keadaan adalah melaluicomponentDidUpdate
metode siklus hidup, yang merupakan metode yang direkomendasikan dalam React docs.Ini sangat berguna ketika mungkin ada berturut-turut
setState
dipecat, dan Anda ingin memecat fungsi yang sama setelah setiap perubahan negara. Daripada menambahkan panggilan balik ke masing-masingsetState
, Anda dapat menempatkan fungsi di dalamcomponentDidUpdate
, dengan logika spesifik di dalam jika perlu.sumber
Anda dapat mencoba menggunakan ES7 async / menunggu. Misalnya menggunakan contoh Anda:
sumber
setState
asinkron tetapi tidak mengembalikan apa pun , sehinggaawait
sebagian besar waktu akan berfungsi tetapi hanya secara kebetulan karena merupakan kondisi ras.Waspadai metode siklus hidup reaksi!
Saya bekerja selama beberapa jam untuk mencari tahu yang
getDerivedStateFromProps
akan dipanggil setelah setiapsetState()
.😂
sumber
async-await
sintaks berfungsi sempurna untuk sesuatu seperti berikut ...sumber
Harap baca tentang Perulangan Acara untuk memiliki gambaran yang jelas tentang sifat Asinkron di JS dan mengapa diperlukan waktu untuk memperbarui -
Karenanya -
karena butuh waktu untuk memperbarui. Untuk mencapai proses di atas -
sumber