Voici ma situation:
- sur this.handleFormSubmit () J'exécute this.setState ()
- à l'intérieur de this.handleFormSubmit (), j'appelle this.findRoutes (); - qui dépend de la réussite de this.setState ()
- this.setState (); ne se termine pas avant que this.findRoutes soit appelé ...
- Comment attendre que this.setState () à l'intérieur de this.handleFormSubmit () se termine avant d'appeler this.findRoutes ()?
Une solution médiocre:
- mettre this.findRoutes () dans componentDidUpdate ()
- ce n'est pas acceptable car il y aura plus de changements d'état sans rapport avec la fonction findRoutes (). Je ne veux pas déclencher la fonction findRoutes () lorsque l'état non lié est mis à jour.
Veuillez consulter l'extrait de code ci-dessous:
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
malexanders
la source
la source
this.setState({ name: "myname" }, function() { console.log("setState completed", this.state) })
cela pourrait être utile
la source
Selon la documentation,
setState()
le nouvel état peut ne pas être reflété dans la fonction de rappelfindRoutes()
. Voici l'extrait de la documentation React :Voici donc ce que je vous propose de faire. Vous devez passer les nouveaux états
input
dans la fonction de rappelfindRoutes()
.La
findRoutes()
fonction doit être définie comme ceci:la source
setState()
car le nouvel état n'est pas bon car cela conduit à des conditions de coursePourquoi pas une réponse de plus?
setState()
et lessetState()
-triggeredrender()
ont tous deux terminé leur exécution lorsque vous appelezcomponentDidMount()
(la première foisrender()
est exécutée) et / oucomponentDidUpdate()
(à tout moment après l'render()
exécution). (Les liens sont vers les documents ReactJS.org.)Exemple avec
componentDidUpdate()
Appelant, définir la référence et définir l'état ...
Rendre le parent ...
Exemple avec
componentDidMount()
Appelant, définir la référence et définir l'état ...
Rendre le parent ...
Une fois que le parent a rendu l'enfant, voir l'état dans
componentDidUpdate()
.la source
setState
prend un nouvel état et une fonction de rappel facultative qui est appelée après que l'état a été mis à jour.la source