React 在循环遍历 JSON 对象数组时不渲染组件

React not rendering components while looping through array of JSON objects

提问人:Himanshu Sardana 提问时间:11/5/2023 更新时间:11/6/2023 访问量:47

问:

所以我基本上有一个 JSON 对象数组,我试图遍历并在屏幕上呈现,但是它似乎不起作用,React 没有任何错误

let quizCards = [];
    fetch("/api/get-all-quiz")
        .then((response) => response.json())
        .then((JSONResponse) => {
            console.log(JSONResponse["message"][0].name);
            for (let i = 0; i <= JSONResponse["message"].length + 3; i++) {
                quizCards.push(
                    <Card w="200%" h="100%">
                        <Flex>
                            <Flex direction={"column"}>
                                <Text>Hello</Text>
                            </Flex>
                        </Flex>
                    </Card>
                );
            }
        });

这里是对象数组,但是卡片组件似乎没有被渲染JSONResponse['message']

我已经添加了我希望显示它们的位置,但是它似乎不起作用,而且当我手动添加卡片(没有遍历JSON对象)时,它似乎可以工作,但我希望这是动态的{quizCards}

javascript reactjs json 反应钩子

评论

0赞 AKX 11/6/2023
不要将组件置于状态,只需将 API 响应置于状态并从中渲染即可。

答:

0赞 Krzysztof Krzeszewski 11/6/2023 #1

不应将组件保持在状态中。除了使用状态并将值加载为副作用的一部分之外,您还可以将 fetch 语句重构为单独的惰性组件。

const Lazy: React.FC = React.lazy(() => {
    return fetch("/api/get-all-quiz")
        .then((response) => response.json())
        .then((JSONResponse) => {
            const quizCards = [];
            for (let i = 0; i <= JSONResponse["message"].length + 3; i++) {
                quizCards.push(
                    <Card w="200%" h="100%">
                        <Flex>
                            <Flex direction="column">
                                <Text>Hello</Text>
                            </Flex>
                        </Flex>
                    </Card>
                );
            }
            return {default: () => (<>{quizCards}</>)}
        })
        .catch((error) => ({default: () => (<>{error}</>)}));
});

然后将它与 Suspense 一起使用,您可以在其中定义在等待请求响应时要显示的内容。

const Parent: React.FC = () => {
    return (
        <React.Suspense fallback={<div>Loading...</div>}>
            <Lazy />
        </React.Suspense>
    )
}

评论

1赞 AKX 11/6/2023
或者可以使用像 swr 等这样的数据获取钩子,但重点是:没有组件处于状态!