Inilah situasi saya:
- pada this.handleFormSubmit () Saya menjalankan this.setState ()
- di dalam this.handleFormSubmit (), saya memanggil this.findRoutes (); - yang bergantung pada keberhasilan penyelesaian this.setState ()
- this.setState (); tidak selesai sebelum ini.findRoutes dipanggil ...
- Bagaimana cara menunggu this.setState () di dalam this.handleFormSubmit () selesai sebelum memanggil this.findRoutes ()?
Solusi di bawah standar:
- meletakkan this.findRoutes () di componentDidUpdate ()
- ini tidak dapat diterima karena akan ada lebih banyak perubahan status yang tidak terkait dengan fungsi findRoutes (). Saya tidak ingin memicu fungsi findRoutes () saat status yang tidak terkait diperbarui.
Silakan lihat cuplikan kode di bawah ini:
handleFormSubmit: function(input){
// Form Input
this.setState({
originId: input.originId,
destinationId: input.destinationId,
radius: input.radius,
search: input.search
})
this.findRoutes();
},
handleMapRender: function(map){
// Intialized Google Map
directionsDisplay = new google.maps.DirectionsRenderer();
directionsService = new google.maps.DirectionsService();
this.setState({map: map});
placesService = new google.maps.places.PlacesService(map);
directionsDisplay.setMap(map);
},
findRoutes: function(){
var me = this;
if (!this.state.originId || !this.state.destinationId) {
alert("findRoutes!");
return;
}
var p1 = new Promise(function(resolve, reject) {
directionsService.route({
origin: {'placeId': me.state.originId},
destination: {'placeId': me.state.destinationId},
travelMode: me.state.travelMode
}, function(response, status){
if (status === google.maps.DirectionsStatus.OK) {
// me.response = response;
directionsDisplay.setDirections(response);
resolve(response);
} else {
window.alert('Directions config failed due to ' + status);
}
});
});
return p1
},
render: function() {
return (
<div className="MapControl">
<h1>Search</h1>
<MapForm
onFormSubmit={this.handleFormSubmit}
map={this.state.map}/>
<GMap
setMapState={this.handleMapRender}
originId= {this.state.originId}
destinationId= {this.state.destinationId}
radius= {this.state.radius}
search= {this.state.search}/>
</div>
);
}
});
javascript
reactjs
state
pengacau
sumber
sumber
this.setState({ name: "myname" }, function() { console.log("setState completed", this.state) })
ini mungkin bisa membantu
sumber
Menurut dokumen
setState()
, status baru mungkin tidak tercermin dalam fungsi callbackfindRoutes()
. Berikut adalah ekstrak dari dokumen React :Jadi, inilah yang saya usulkan yang harus Anda lakukan. Anda harus meneruskan status baru
input
dalam fungsi callbackfindRoutes()
.The
findRoutes()
fungsi harus didefinisikan seperti ini:sumber
setState()
sebagai negara bagian baru tidak baik karena mengarah ke kondisi rasMengapa tidak satu jawaban lagi?
setState()
dansetState()
-triggeredrender()
telah menyelesaikan eksekusi saat Anda memanggilcomponentDidMount()
(pertama kalirender()
dijalankan) dan / ataucomponentDidUpdate()
(setiap saat setelahrender()
dijalankan). (Tautan ke dokumen ReactJS.org.)Contoh dengan
componentDidUpdate()
Penelepon, atur referensi, dan setel status ...
Jadikan induk ...
Contoh dengan
componentDidMount()
Penelepon, atur referensi, dan setel status ...
Jadikan induk ...
Setelah orang tua merender anak, lihat status dalam
componentDidUpdate()
.sumber
setState
mengambil status baru dan fungsi panggilan balik opsional yang dipanggil setelah status diperbarui.sumber