状態を更新することを目的とした機能は完全には機能しません。React状態の更新をすぐに行うにはどうしたらいいですか?
私が変更した現在の状態のディープコピーを作成し、その状態に変更したコピーを設定します。私はコピー上で単純なマップを実行し、配列内の各オブジェクトのプロパティを更新することにしました。これにより、アプリケーションの更新状態が直ちに変更されました。 (下のコードには表示されていませんが、私が試したもの)
しかし、私は真にコピーを作りたいと思っています。 setStateは非同期になるので、変更がすぐには起こらないことを理解していますが、どうすればこの問題を解決できますか?なぜなら、関数が2回目にトリガされたときに変更が表示されるからですが、最初の実行時にその関数を実行する必要があります。あなたが望むなら、あなたが構築しているもののライブデモをhttps://non.mpedersen.me/に見ることができます。 App.js
addressSearch(address){
console.log('firing search for distance. Origin is: ' + address)
let origin = [address];
const newStores = JSON.parse(JSON.stringify(this.state.stores))
let service = new google.maps.DistanceMatrixService();
newStores.map(store => service.getDistanceMatrix({
origins: origin,
destinations: store.addressapi,
travelMode: 'DRIVING',
}, result => {
store.distance = result.rows["0"].elements["0"].distance.text.replace(/\Dkm/, '').replace(/,/,'.').replace(/\s/, '');
store.duration = result.rows["0"].elements["0"].duration.text;
}))
newStores.sort((a,b) => a.distance - b.distance);
this.setState({stores : newStores})
}
をところで、 '' constのnewStores = JSON.parse(JSON.stringify(this.state.stores))をアップ何?何がポイントなのですか – enapupe
詳細なお返事ありがとうございます、私はあなたの提案をお試しになります。私はスライスで深いコピーを作ろうとしましたが、新しい配列は古いものを参照するようになりました。私は状態を直接変更したくないので、元の状態の独立したコピーを作成したいと思っていました – mpleonardo
それはオブジェクトですか? 'const newStores = {... this.state.stores}' .. これは 'immutable.js'を使う良い理由です:) – enapupe