つまづいたこと
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}も試したけど、展開が足りていなかったのかもしれない。
もしくは非同期処理のせいかもしれない。
詳しい方教えてください。
非同期で setState することは問題ありませんが、setSearchResult を 2 回続けて呼んでも意味ないですし、setIngredientLoading は読み込みが終了する前に呼ばれてしまってます。それでも fetch に成功すれば表示は更新されそうに見えますが、更新されないなら fetch または json への変換に失敗してる可能性が高いと思うので、A_kirisaki さんがおっしゃる通り console.log で確認しましょう。
>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}}
回答1件
あなたの回答
tips
プレビュー