前提
setIntervalで5秒毎に非同期でAPIからJSONでデータを取得し、それを要素に変換して表示しているのですが、再描画がされず、困ってます。
デバッグ用にforceUpdateというboolean型のstateを使い、強制再描画&更新の確認をしてみたところ、初期値falseが一度trueに書き換わり、描画され、それ以降二度とtrueに戻りません。
typescript
1import React, { useState, useEffect, useContext, useReducer } from "react"; 2import CommentCard from "./CommentCard"; 3import "./Home.css"; 4import { Context } from "./App"; 5 6import Box from "@mui/material/Box"; 7import { CommentSharp } from "@material-ui/icons"; 8 9const update = (state: any, additionalElement: any) => { 10 console.log("add↓"); 11 console.log(additionalElement); 12 console.log("state"); 13 console.log(state); 14 let _tmp = state; 15 _tmp.left.push(additionalElement); 16 return _tmp; 17}; 18function Home() { 19 const [right, setRight] = useContext(Context); 20 const [forceUpdate, setforceUpdata] = useState<boolean>(false); 21 22 const [state, setState] = useReducer(update, { left: [] }); 23 24 useEffect(() => { 25 setInterval(() => { 26 const getter = async () => { 27 const promise = await fetch("/api/share/get/comments"); 28 const json = await promise.json(); 29 console.log(state.left); 30 for (var a = 0; a < json.length; a++) { 31 setState( 32 <CommentCard 33 key={json[a]["commentID"]} 34 user={json[a]["username"]} 35 json={json[a]} 36 /> 37 ); 38 } 39 }; 40 getter(); 41 setforceUpdata(forceUpdate ? false : true); 42 }, 5000); 43 }, []); 44 45 return ( 46 <> 47 <Box sx={{ pt: "1vh" }} className="left"> 48 {state.left} 49 {forceUpdate ? "true" : "false"} 50 </Box> 51 52 <Box className="left">{right}</Box> 53 </> 54 ); 55} 56export default Home; 57

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/11/14 11:26 編集
2022/11/14 11:32
2022/11/14 11:58 編集
2022/11/14 12:27
2022/11/15 01:07 編集
2022/11/14 14:33
2022/11/15 08:25
2022/11/15 08:41
2022/11/15 09:07
2022/11/15 09:21
2022/11/15 11:02 編集