[解決済み] React.js、関数を起動する前にsetStateが終了するのを待つ?
2022-05-13 19:40:31
質問
私の状況を説明します。
- this.handleFormSubmit() で this.setState() を実行しています。
- this.handleFormSubmit() の内部で this.findRoutes(); を呼び出していますが、これは this.setState() の正常終了に依存します。
- this.setState(); は this.findRoutes が呼び出される前に完了しません。
- this.handleFormSubmit()内のthis.setState()が終了するのを待ってからthis.findRoutes()を呼び出すにはどうしたらいいですか?
劣悪なソリューションです。
- componentDidUpdate() に this.findRoutes() を入れる。
- というのは、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>
);
}
});
どのように解決するのですか?
setState()
にはオプションのコールバック・パラメータがあり、これを使用することができます。コードを少し変更するだけで、このようになります。
// Form Input
this.setState(
{
originId: input.originId,
destinationId: input.destinationId,
radius: input.radius,
search: input.search
},
this.findRoutes // here is where you put the callback
);
の呼び出しに注意してください。
findRoutes
の呼び出しは、現在では
setState()
の呼び出しになります。
を2番目のパラメータとして使用します。
がなければ
()
は、関数を渡しているからです。
関連
-
[解決済み】JavaScript TypeError: null のプロパティ 'style' を読み取ることができない
-
[解決済み】JavaScriptでインラインIF文の書き方は?
-
[解決済み】 env: node: macにそのようなファイルやディレクトリはありません
-
[解決済み】「.addEventListener is not a function」なぜこのエラーが発生するのか?
-
[解決済み】React.jsの配列の子要素のユニークキーを理解する
-
[解決済み] jQueryの「exists」関数はありますか?
-
[解決済み] JavaScriptでNULL、未定義、空白の変数をチェックする標準的な関数はありますか?
-
[解決済み] オブジェクトのためのマップ関数(配列の代わりに)
-
[解決済み】JavaScriptの関数にデフォルトのパラメータ値を設定する
-
[解決済み】関数の前のエクスクラメーションマークは何をするのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
JSクロスドメインソリューション リアクト構成 リバースプロキシ
-
Vueの要素ツリーコントロールに破線を追加する説明
-
Vueのイベント処理とイベントモディファイアの解説
-
Vueの一般的な組み込みディレクティブの説明
-
[解決済み] テスト
-
[解決済み】JavaScriptの配列でforEachが関数でない不具合
-
[解決済み】gulp anythingを実行するたびに、アサーションエラーが発生します。- タスク関数を指定する必要があります
-
[解決済み】(Google Map API) Geocodeは以下の理由で成功しませんでした。REQUEST_DENIED
-
[解決済み】 Uncaught TypeError : undefined のプロパティ 'replace' を読み取れない In Grid
-
nodejs unhandledPromiseRejectionWarning メッセージ