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

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

新規登録して質問してみよう
ただいま回答率
85.35%
JavaScript

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

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

1回答

848閲覧

asyncでAPIを叩いて取得した値を使用したい

teis

総合スコア10

JavaScript

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

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

1クリップ

投稿2020/06/09 11:28

編集2020/06/09 11:35

asyncでデータを取得するとき、データがうまく設定できない

ReactでAPIからデータを取得して小コンポーネントに値を渡したいのですが、非同期で取得するため値を渡すときデータが空になってしまいます。
この場合どのように書けば、値を設定した後に渡せるでしょうか?
個人的にはhooks使う形になるのかなと思っています。何か良い方法があれば教えていただきたいです。

tsx

1import Child from '/child' 2 3const Component = ({children}: Props) => { 4 const getData = async () => { 5 return await axios.post('localhost:8080/data').then(r => r.data.token) 6 } 7 8 const link = { 9 uri: '/data', 10 data: getData() 11 } 12 13 return <Child link={link}>{children}</Child> // この時点ではdataの値が空のままlinkに渡ってしまう 14} 15

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

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

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

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

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

guest

回答1

0

ベストアンサー

こんにちは

API の POST localhost:8080/data が成功すると

json

1{ "token": "foobarbaz" }

のような形式のJSONが返ってくる想定だと思いますが、以下のように修正してみるといかがでしょうか?

diff

1const Component = ({ children }: Props) => { 2 const getData = async () => { 3 return await axios.post('localhost:8080/data').then(r => r.data.token) 4 } 5 6+ const [data, setData] = React.useState(null); 7+ 8+ React.useEffect(() => { 9+ (async () => { 10+ const data = await getData(); 11+ setData(data); 12+ })(); 13+ }, []); 14 15 const link = { 16 uri: '/data', 17- data: getData() 18+ data 19 } 20 21 return <Child link={link}>{children}</Child>; 22}

上記では、data の初期値を null にしていますが、そこは何らか、dataの型に合わせて適切な初期値にする必要があるかもしれません。
参考になれば幸いです。

追記

ご質問の本題ではありませんが、APIを呼ぶ getData は必ずしもコンポーネントの中になくてもよいので、別の apis.ts のようなファイルに書いておいて、コンポーネントでこれを使う場合

typescript

1import { getData } from '/apis';

のように、importしてもよいかもしれません。

投稿2020/06/09 13:05

編集2020/06/09 21:58
jun68ykt

総合スコア9058

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

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

teis

2020/06/09 14:15

ありがとうございます!実現できました。
teis

2020/06/09 14:15

hooksは切り離して定義しようと思います!
jun68ykt

2020/06/09 14:52

どういたしまして???? > 実現できました。 とのことでよかったです????
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問