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

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

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

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

React.js

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

Q&A

2回答

2050閲覧

React props が渡せない

ryo_engineer

総合スコア33

JavaScript

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

React.js

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

0グッド

0クリップ

投稿2022/04/30 00:22

React props が渡せない

以下の様なコンポーネントなのですが、
axios でオブジェクトを取得 -> stateに代入 -> state を props として子コンポーネントに渡す -> 子コンポーネントでそれを表示
という流れを期待していますが、子コンポーネントに渡すときに、正常に渡されていないようです。
chrome のコンソールには以下のエラーが吐かれています。
(Uncaught TypeError: Cannot read properties of undefined (reading 'id'))
axios でデータを受け取る前に子コンポーネントに渡しているから、上記のエラーが出ていると考えているのですが正しいでしょうか。
そうだとするなら、axios で受け取ってから渡すコードはどう書けばよいでしょうか?

【親コンポーネント】

React

1import React from 'react'; 2import axios from 'axios'; 3import { Res } from './Res'; 4 5const url = 'https://api.example/test'; 6function Example() { 7 const [res, setRes] = React.useState({}); 8 React.useLayoutEffect(() => { 9 const fetchData = async () => { 10 const response = await axios.get(url); 11 setRes(response.data); 12 }; 13 fetchData(); 14 }, []); 15 console.log(res); 16 return ( 17 <> 18 <Res res01={ res.01 } res02={ res.02 } /> 19 </> 20 ); 21}

【子コンポーネント】

React

1import React from 'react'; 2 3export const Res = ({ res01, res02 }) => { 4 return ( 5 <> 6 <div>{ res01.id }</div> 7 ...以下略... 8 </> 9 ); 10}

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

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

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

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

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

guest

回答2

0

非同期のデータ取得はuseEffectを使うことをおすすめします。
私がするなら以下のようにデータ取得中はロード画面を表示します。

function Example() { const [res, setRes] = React.useState({}); // React.useLayoutEffect(() => { React.useEffect(() => { const fetchData = async () => { const response = await axios.get(url); setRes(response.data); }; fetchData(); }, []); console.log(res); if(!res) return <div>loading...</div> return ( <> <Res res01={ res.01 } res02={ res.02 } /> </> ); }

投稿2022/05/16 14:08

lkl191

総合スコア14

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

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

0

axiosによるデータ取得は非同期である以上、最初の描画時には間に合いません。データなしの状態で子コンポーネントが描画されてしまいます。

投稿2022/04/30 00:27

maisumakun

総合スコア145184

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

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

ryo_engineer

2022/04/30 00:29

ありがとうございます。 データを取得後に子コンポーネントに渡すにはどうすればよいでしょうか?
maisumakun

2022/04/30 00:29

> そうだとするなら、axios で受け取ってから渡すコードはどう書けばよいでしょうか? できません。「データがない状態が起きうることを想定して子コンポーネントを実装する」、もしくは「データがあるときだけ<Res>を描画する」形で対応してください。
ryo_engineer

2022/04/30 00:32

React めっちゃ不便っすね。react というより非同期通信の性質上仕方ないのかもしれませんが、 うまくやってほしいですね
maisumakun

2022/04/30 00:39

考え方が違うのかもしれません。 Reactは、(SuspendやTransitionなど最近加わった部分は別として)「このデータがあればこの形で描画する」という「宣言型」の考えをベースに動いています。「これをやってこれを動かす」という「手続き型」とは頭を切り替える必要があります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問