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

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

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

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

Q&A

1回答

2249閲覧

(React.js)mapを使用したデータの一覧表示

paonppp

総合スコア0

React.js

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

0グッド

0クリップ

投稿2021/05/26 13:50

前提・実現したいこと

React.jsを使用して、タスク情報(DBテーブルの値)を表示するWebアプリを作っています。
サーバーサイドでAPIを作成済みで、Axiosを使用してデータを取得し、クライアント側でDBのレコードを一覧で表示したいのですが、
うまくいきません。

具体的には、render()内で以下のエラーがでています。
エラー内容:TypeError: Cannot read property 'map' of undefined

taskListに値が入っていないからだと思い、コンソール出力に確認した結果、
constructor内のAxios.Getによるデータの取得はうまくいってるように見えるのですが、
Axios.Getの後のConsoleを確認するとundefinedになっているという状態です。

この対処法がわからず悩んでおります。
JavascriptやReactに触れるのが初めてで理解が浅いところ恐縮なのですが、対処法を教えていただけないでしょうか。

よろしくお願いいたします。

javascript

1import './App.css'; 2import React from 'react' 3import Axios from 'axios' 4import ReactDOM from 'react-dom'; 5 6 7class TaskViewPage extends React.Component { 8 taskList; 9 10 constructor(props) { 11 super(props) 12 var getTaskUrl = 'APIのURL' 13 Axios.get(getTaskUrl, { 14 } 15 ).then((response) => { 16 this.taskList = response.data; 17 //ここはテーブルから取得した値が表示される 18 console.log(response.data); 19 //ここはテーブルから取得した値が表示される 20 console.log(this.taskList); 21 }) 22 //ここがundefinedになる 23 console.log(this.taskList); 24 25 } 26 27 render() { 28 return <div> 29 <div> 30 {this.taskList.map((val) => ( 31 <div> 32 <label> 33 <input 34 type="checkbox" 35 className="checkbox-input" 36 defaultChecked={val.done} 37 /> 38 <span className="checkbox-label">{val.task_name}</span> 39 </label> 40 ))} 41 </div> 42 43 } 44} 45export default TaskViewPage;

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

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

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

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

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

hoshi-takanori

2021/05/26 14:57

React 初めてとのことですが、まず state の扱いについて学ぶ必要があるかと思います。何か参考書とかお持ちでしょうか?
guest

回答1

0

おそらく、JSの非同期処理の話と、ReactのStateとライフサイクルの部分が理解できていないのかなと思います。
前者は調べたらいっぱい出てきます、後者については、公式のドキュメントを読んでみるといいかもしれません。

//ここがundefinedになる console.log(this.taskList);

まず、ここがundefinedになる原因ですが、おそらくこのconsole.logは上2つのconsole.logよりも前にコンソールに表示されるのではないでしょうか。
これはJSの非同期処理が原因で、axiosでデータを取得してくるのが時間がかかるので、それを待っている間にどんどん次の処理を実行してしまいます。
thenメソッド内に書かれた処理は、axiosの結果が返ってきてから実行されるので、console.logで値が確認できますが、thenメソッドの外にあるconsole.logは値が取得されるより先に実行されるのでundefinedになるわけです。

次に、render内のmapでエラーになる原因ですが、こちらも同様の理由で画面表示時にthis.taskListundefinedが設定されているからです。
これを回避するためには、taskListを空の配列で初期化すれば大丈夫です。中身が空でも配列になっていればmaptype errorになることはありません。

ただ、上2つをしても、一覧は表示されません。
それは、画面が描画(render)された後にaxiosでのデータ取得が完了するという順番になってしまうからです。
そのため、初期レンダリング→axiosでデータ取得の後に再度レンダリングをする必要があります。
このときに使うのがStateになります。
taskListStateとして定義しておいて、axiosthenメソッド内でsetState関数を使って値を更新すれば、そのタイミングで再レンダリングされ、画面にリストが表示されると思います。

投稿2021/05/26 15:09

dyekv

総合スコア128

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問