teratail header banner
teratail header banner
質問するログイン新規登録

質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.30%
React Native

React Nativeは、ネイティブモバイルアプリ(iOS/Android)を作成できるJavaScriptフレームワークです。Reactと同じ設計のため、宣言的なコンポーネントでリッチなUIを開発することが可能です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

774閲覧

【React】非同期処理内でStateに連想配列を即時反映させたい。

sasa0330

総合スコア64

React Native

React Nativeは、ネイティブモバイルアプリ(iOS/Android)を作成できるJavaScriptフレームワークです。Reactと同じ設計のため、宣言的なコンポーネントでリッチなUIを開発することが可能です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2023/04/04 06:35

編集2023/04/04 07:53

0

0

実現したいこと

  • 非同期処理内でStateに値を即時反映させたい。

前提

現在地情報を非同期で取得してStateに反映したいのですが、即時反映されません。
以下のソースコードのconsole.logで新しい値に変わっているのが望ましいのですが、この時点ではまだStateが更新されないようです。
どのようにすればここのconsole.logの時点で値を反映させることができるでしょうか。
値は連想配列です。

JavaScript

1 navigator.geolocation.getCurrentPosition( 2 (position) => { 3 4 const data: currentPosition = { 5 lat: position.coords.latitude, 6 lng: position.coords.longitude, 7 }; 8 // state更新 9 setCurrentPosition(data); 10 //更新した値をログに出したいが、setCurrentPositionした値が反映されない 11 console.log(currentPosition.lat); 12 console.log(currentPosition.lng); 13 resolve(); 14 }, 15... 16 }

なぜそうしたいのか

現在地を取得→現在地情報を元にAPIでデータを取得したいためです。
現在地情報をstateで管理すると、APIが走る時に最新の現在地情報が反映されていないことに気がつきました。
そのため即時反映(console.logの位置で反映)されていれば、後続の処理で問題なく現在地情報を使えると思いました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2023/04/04 07:19

> どのようにすればここのconsole.logの時点で値を反映させることができるでしょうか。 なぜそれをしなければならないのでしょうか?
sasa0330

2023/04/04 07:54 編集

コメントありがとうございます。 「なぜそうしたいのか」を追加しました。 現在地を取得→現在地情報を元にAPIでデータを取得したいためです。 現在地情報をstateで管理すると、APIが走る時に最新の現在地情報が反映されていないことに気がつきました。 そのため即時反映(console.logの位置で反映)されていれば、後続の処理で問題なく現在地情報を使えると思いました。
guest

回答2

0

ベストアンサー

そのため即時反映(console.logの位置で反映)されていれば、後続の処理で問題なく現在地情報を使えると思いました。

どうしてもそれをやりたいのであれば、dataをそのまま使ってください。stateのcurrentPositionは次の描画まで更新されません。

投稿2023/04/04 07:58

maisumakun

総合スコア146641

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sasa0330

2023/04/04 08:29

>stateのcurrentPositionは次の描画まで更新されません。 ありがとうございます。 stateは使わない方針で再度検討してみます。
guest

0

ReactのStateは非同期で更新されるため、
setCurrentPosition()実行後すぐにStateの値が更新されるわけではありません。

なのでuseEffectを使ってください。

jsx

1import { useState, useEffect } from "react"; 2 3export default () => { 4 const [currentPosition, setCurrentPosition] = useState({ lat: 0, lng: 0 }); 5 6 useEffect(() => { 7 console.log(currentPosition.lat); 8 console.log(currentPosition.lng); 9 }, [currentPosition]); 10 11 navigator.geolocation.getCurrentPosition((position) => { 12 const data = { 13 lat: position.coords.latitude, 14 lng: position.coords.longitude, 15 }; 16 setCurrentPosition(data); 17 }); 18 ・・・

投稿2023/04/04 06:47

pippi19

総合スコア684

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問