🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
API

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

React.js

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

Q&A

解決済

1回答

1365閲覧

functionalComponentの非同期関数内のsetStateによる再レンダリングについて。

MOTOMUR

総合スコア195

API

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

React.js

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

0グッド

0クリップ

投稿2021/01/03 15:13

編集2021/01/03 15:19

つまづいたこと

APIにfetchでデータベースにアクセスして、setStateしたときに再レンダリングがされない。

<レンダリング先>

<div> { (searchResult.data) ?searchResult.data.map((ingredient, i) => { <div>{ingredient.food}</div> }) :<div></div> } </div>

<setState元>

function search(e) { if(e!==""){ fetch(`APIsomething`) .then(res =>{ return res.json() }).then(data => { setSearchResult({}) setSearchResult(data) }) } setIngredientLoading(false); }

<search呼び出し>(inputのonChange)

 function onChangeField (e){ console.log(e.target.value) setSearchWord(e.target.value) setIngredientLoading(true) search(e.target.value) }

非同期処理関数内でsetStateを使うのがダメ?

{...data}も試したけど、展開が足りていなかったのかもしれない。
もしくは非同期処理のせいかもしれない。
詳しい方教えてください。

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

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

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

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

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

A_kirisaki

2021/01/03 15:16

search を呼んでいる部分を載せていただけますか?
MOTOMUR

2021/01/03 15:19

失礼しました。追記しました。
A_kirisaki

2021/01/03 15:23

search 内で console.log(res) と console.log(data) はしてみましたか?
hoshi-takanori

2021/01/03 17:09

非同期で setState することは問題ありませんが、setSearchResult を 2 回続けて呼んでも意味ないですし、setIngredientLoading は読み込みが終了する前に呼ばれてしまってます。それでも fetch に成功すれば表示は更新されそうに見えますが、更新されないなら fetch または json への変換に失敗してる可能性が高いと思うので、A_kirisaki さんがおっしゃる通り console.log で確認しましょう。
MOTOMUR

2021/01/03 23:37

>resとdataは問題なく出力できています。 >setSearchResult を2回呼んだら再レンダリングされるかなとテストで追加していますが結果はもちろんダメです。 もともとasync awaitでfetch部分とsearchを記述していましたが、onChangeでテキストフィールドの入力e.target.valueをsetstateする前に動作してしまったため、変更しております。質問に乗せたコードではfetchまではうまく行ってます、setState後のレンダリングができていません。 searchResultはpropsで子コンポーネントに渡しています。 再レンダリングのルールから何かしらの理由で外れている気がします。 補足:res.json() {data:{//object some},data2:{//object some}}
guest

回答1

0

ベストアンサー

レンダリング先のこの部分ですが、

js

1 ?searchResult.data.map((ingredient, i) => { 2 <div>{ingredient.food}</div> 3 })

searchResult.data という配列の各要素に対して、

(ingredient, i) => { <div>{ingredient.food}</div> }

というアロー関数を実行して、その結果を配列にしてますが、この関数が値を返してないからですね。

明示的に return を書くか、

js

1 ?searchResult.data.map((ingredient, i) => { 2 return <div>{ingredient.food}</div> 3 })

{ } を削除 (または ( ) に変更) して => の先にブロックではなく一つの式がある状態にしてその値が return されるようにするといいと思います。

js

1 ?searchResult.data.map((ingredient, i) => 2 <div>{ingredient.food}</div> 3 )

js

1 ?searchResult.data.map((ingredient, i) => ( 2 <div>{ingredient.food}</div> 3 ))

参考: アロー関数 - JavaScript | MDN<

投稿2021/01/04 01:37

hoshi-takanori

総合スコア7899

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

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

MOTOMUR

2021/01/04 09:22

初歩的なところでつまづいていました。失礼しました。ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問