Вот моя ситуация:
- на this.handleFormSubmit () я выполняю this.setState ()
- внутри this.handleFormSubmit () я вызываю this.findRoutes (); - что зависит от успешного завершения this.setState ()
- this.setState (); не завершается до вызова this.findRoutes ...
- Как мне дождаться завершения this.setState () внутри this.handleFormSubmit () перед вызовом this.findRoutes ()?
Неудовлетворительное решение:
- помещая this.findRoutes () в componentDidUpdate ()
- это неприемлемо, потому что будет больше изменений состояния, не связанных с функцией findRoutes (). Я не хочу запускать функцию findRoutes () при обновлении несвязанного состояния.
См. Фрагмент кода ниже:
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
мександры
источник
источник
this.setState({ name: "myname" }, function() { console.log("setState completed", this.state) })
это может быть полезно
источник
Согласно документации
setState()
новое состояние может не отражаться в функции обратного вызоваfindRoutes()
. Вот выдержка из документации React :Итак, вот что я предлагаю вам сделать. Вы должны передать новые состояния
input
в функцию обратного вызоваfindRoutes()
.findRoutes()
Функция должна быть определена следующим образом:источник
setState()
качестве нового состояния нехорошо, потому что это приводит к условиям гонкиsetState
принимает новое состояние и необязательную функцию обратного вызова, которая вызывается после обновления состояния.источник
Почему не еще один ответ?
setState()
иsetState()
-triggeredrender()
завершили выполнение при вызовеcomponentDidMount()
(выполняется в первый разrender()
) и / илиcomponentDidUpdate()
(в любое время послеrender()
выполнения). (Ссылки на документы ReactJS.org.)Пример с
componentDidUpdate()
Вызывающий, установить ссылку и установить состояние ...
Отрисовать родителя ...
Пример с
componentDidMount()
Вызывающий, установить ссылку и установить состояние ...
Отрисовать родителя ...
После того, как родитель повторно отрендерит ребенка, см. Состояние в
componentDidUpdate()
.источник