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

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

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

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

React.js

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

Q&A

解決済

1回答

2821閲覧

ReactでAPIを受け取る処理で無限レンダリングしてしまう

nanami0221

総合スコア18

JavaScript

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

React.js

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

0グッド

0クリップ

投稿2021/06/23 01:51

前提・実現したいこと

Laravel APIをReactで受け取りmapメソッドでループ処理したいです。
ただ、Reactで受け取った値が、なぜか無限ループして429 (Too Many Requests)となり、エラーになってしまいます。

発生している問題・エラーメッセージ

以下のコードでconsole.log(data)をしてみたところ、無限ループが発生してしまいます。
また、mapメソッドが表示されません。

該当のソースコード

API

1[{"id":1,"name":"\u30ab\u30b9\u30bf\u30e0\uff08\u8eca\uff09","created_at":"2021-06-23T01:28:57.000000Z","updated_at":"2021-06-23T01:28:57.000000Z"},{"id":2,"name":"\u30ab\u30b9\u30bf\u30e0\uff08\u30d0\u30a4\u30af\uff09","created_at":"2021-06-23T01:28:57.000000Z","updated_at":"2021-06-23T01:28:57.000000Z"},{"id":3,"name":"\u677f\u91d1\u4fee\u7406\uff08\u8eca\uff09","created_at":"2021-06-23T01:28:57.000000Z","updated_at":"2021-06-23T01:28:57.000000Z"},{"id":4,"name":"\u677f\u91d1\u4fee\u7406\uff08\u30d0\u30a4\u30af\uff09","created_at":"2021-06-23T01:28:57.000000Z","updated_at":"2021-06-23T01:28:57.000000Z"},{"id":5,"name":"\u8eca\u8ca9\u58f2","created_at":"2021-06-23T01:28:57.000000Z","updated_at":"2021-06-23T01:28:57.000000Z"},{"id":6,"name":"\u30d0\u30a4\u30af\u8ca9\u58f2","created_at":"2021-06-23T01:28:57.000000Z","updated_at":"2021-06-23T01:28:57.000000Z"},{"id":7,"name":"\u8eca\u8cb7\u53d6","created_at":"2021-06-23T01:28:57.000000Z","updated_at":"2021-06-23T01:28:57.000000Z"},{"id":8,"name":"\u30d0\u30a4\u30af\u8cb7\u53d6","created_at":"2021-06-23T01:28:57.000000Z","updated_at":"2021-06-23T01:28:57.000000Z"},{"id":9,"name":"\u30ed\u30fc\u30c9\u30b5\u30fc\u30d3\u30b9\uff08\u8eca\uff09","created_at":"2021-06-23T01:28:57.000000Z","updated_at":"2021-06-23T01:28:57.000000Z"},{"id":10,"name":"\u30ed\u30fc\u30c9\u30b5\u30fc\u30d3\u30b9\uff08\u30d0\u30a4\u30af\uff09","created_at":"2021-06-23T01:28:57.000000Z","updated_at":"2021-06-23T01:28:57.000000Z"},

tsx

1// 階層:/app/backend/resources/tsx/app.tsx 2require('./../tsx/views/components/CategoryLists.tsx');

js

1// 階層:/app/backend/webpack.mix.js 2mix.js('resources/js/app.js', 'public/js') 3 .ts('resources/tsx/app.tsx', 'public/js') 4 .sass('resources/sass/app.scss', 'public/css') 5 .react();

tsx

1import React, { useEffect, useState } from 'react'; 2import axios from 'axios'; 3import ReactDOM from 'react-dom'; 4 5// typescript設定 6type Category = { 7 id: number; 8 name: string; 9 created_at: Date; 10 updated_at: Date; 11}; 12 13// React.VFC : 型定義 14const CategoryLists: React.VFC = () => { 15 16 // useStateを作成 17 const [categories, setCategories] = useState<Category[]>([]) 18 19 // カテゴリーAPIを取得する 20 const getCategories = async () => { 21 const { data } = await axios.get<Category[]>('api/categories'); 22 console.log(data); // ← なぜか無限レンダリングしてしまう 23 setCategories(data); 24 } 25 26 // getCategoriesを出力する 27 useEffect(() => { 28 getCategories() 29 }) 30 31 // 本文 32 return ( 33 // 出力 34 <ul className="c-input__lists"> 35 { categories.map(category => { // ← 上手く表示されない 36 <li key={category.id} className="c-input__list"> 37 <input type="checkbox" /> 38 <label>{category.name}</label> 39 </li> 40 }) } 41 <li className="c-input__list"> 42 <input type="checkbox"/> 43 <label>サンプル</label> 44 </li> 45 <li className="c-input__list"> 46 <input type="checkbox"/> 47 <label>サンプル</label> 48 </li> 49 <li className="c-input__list"> 50 <input type="checkbox"/> 51 <label>サンプル</label> 52 </li> 53 <li className="c-input__list"> 54 <input type="checkbox"/> 55 <label>サンプル</label> 56 </li> 57 </ul> 58 ); 59} 60 61if (document.getElementById('categoryLists')) { 62 ReactDOM.render(<CategoryLists />, document.getElementById('categoryLists')); 63}

参考

以下のコードを参考に記述しました。
コピーしているので、問題ないと認識しているのですが、なぜかmapメソッドで出力されません。

https://www.youtube.com/watch?v=bqctWoscPgE&t=195s

補足情報(FW/ツールのバージョンなど)

typescript@4.3.4 Laravel Framework 8.48.0 @types/react 17.0.11 react 17.0.2 ts-loader ^9.2.3 typescript ^4.3.4

お力添えいただけると幸いです。

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

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

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

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

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

hoshi-takanori

2021/06/23 02:06

useEffect に第二引数 [] が必要では。
nanami0221

2021/06/23 02:28

おっしゃる通りでした。 いつも誠に有難うございます。
guest

回答1

0

ベストアンサー

無限ループ

useEffectの第二引数が指定されていないため、renderされる度に実行される状態になっています。
※「データ読み込み」→「再render」→「データ読み込み」・・・の状態です

useEffectの第二引数を以下のように修正すればOKです。

js

1useEffect(() => { 2 getCategories() 3}, [])

mapメソッドが表示されません。

map内でなにもreturnしていないためです。
下記のように修正して表示されますか?

js

1{categories.map(category => { 2 return( 3 <li key={category.id} className="c-input__list"> 4 <input type="checkbox" /> 5 <label>{category.name}</label> 6 </li> 7 ) 8})}

投稿2021/06/23 02:22

nekoniki

総合スコア2411

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

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

nanami0221

2021/06/23 02:29

具体的に有難うございます。 いただいた通りに修正したところ、問題なく表示されました。 useEffectについて正しく理解できていないので、調べてみます。 また、動画ではreturnが記載されていないのに表示されている点が不明なので、そちらも合わせて調べてみます。 誠に有難うございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問