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

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

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

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

React.js

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

Q&A

解決済

2回答

925閲覧

this.stateのプロパティが取得できない (React)

van-0215

総合スコア89

JavaScript

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

React.js

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

0グッド

0クリップ

投稿2018/09/04 00:04

現在、Reactを使ってページを作っています。そのページ内ではAPIを叩いて、データを取得した後、その中の特定の1つを表示させようとしています。

今、こんな感じでDBの情報を this.state.users に入れています。

JavaScript

1constructor(props) { 2 super(props); 3 this.state = { 4 users: [], 5 }; 6 } 7 8 //初期化(画面レンダリング前) 9 componentWillMount(){ 10 this.fetchResponse(); 11 } 12 13 //リストの更新 14 fetchResponse() { 15 fetch('') 16 .then ((res) => res.json() ) 17 .then ((res) => { 18 this.setState({ 19 users: res, 20 }); 21 // console.log(res); 22 }) 23 }

その後、下記render()内でこのようにアクセスをしています。 2行目の console.log(this.state.users[99]);
では しっかりとすべての情報が表示されます。(プロパティ[“birthday”]もusers連想配列のkeyとして表示されます。)

しかしながら、3行目の console.log(this.state.users[99].birthday);
を動かすと、 cannot read property ‘birthday’ of undefined とエラーが出ます。

なぜかわかりますか?

JavaScript

1render() { 2 console.log(this.state.users[99]); 3 // console.log(this.state.users[99].birthday);

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

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

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

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

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

guest

回答2

0

おそらく、最初に代入したusers: []に対してrenderが動いたために、this.state.users[99]undefinedのまま処理が進んでしまったのではないかと思われます。

fetchによる取得は非同期で、最初のrender間に合わないことも考えられるので、データが取得できていなくてもrenderで失敗しないようにコードを書く必要があります。

投稿2018/09/04 00:09

maisumakun

総合スコア145183

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

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

van-0215

2018/09/04 00:14

maisumakun様、回答ありがとうございます。 先ほど謝って受付を閉じてしまったため、もしよろしければ、https://teratail.com/questions/144656?modal=q-comp にコピペした内容を貼り付けていただきたいです。  fetchが非同期処理で間に合わないとおっしゃっていましたが、その場合、 console.log(this.state.users[99]) が表示されるのはなぜなのでしょうか?
van-0215

2018/09/04 00:44

16.4.2を使用しています。情報ありがとうございます。
guest

0

自己解決

render()の先頭で const tmpUsers = this.state.users としたり、 this.state.usersの中身をすべて回し、別の配列にpush()してみた。
その後で、 console.log(tmpUsers[0])をやると問題なく表示されるが、 console.log(tmpUsers[0].birthday) のようにプロパティまで表示させようとするとエラーがでた。

投稿2018/09/04 00:08

van-0215

総合スコア89

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問