使用 API 的 React 中发生了太多的重新渲染

Posted

技术标签:

【中文标题】使用 API 的 React 中发生了太多的重新渲染【英文标题】:Too much rerendering happeing in React with APIs 【发布时间】:2021-12-26 20:59:57 【问题描述】:

我只是 React 的初学者,正在学习如何将 API 与 React 结合使用。

我的问题是在我的代码中发生了太多的重新渲染。我是在添加console.log("test"); 行时才知道的。

我应该怎么做才能克服这个问题?

import * as React from "react";
import Table from "@mui/material/Table";
import TableBody from "@mui/material/TableBody";
import TableCell from "@mui/material/TableCell";
import TableContainer from "@mui/material/TableContainer";
import TableHead from "@mui/material/TableHead";
import TableRow from "@mui/material/TableRow";
import Paper from "@mui/material/Paper";

const Home = () => 
    const [data, setData] = React.useState([]);

    useEffect(() => 
        fetch("https://61924463aeab5c0017105ebe.mockapi.io/test")
            .then((res) => res.json())
            .then(
                (result) => 
                    if (result) 
                        console.log("test");
                        setData(result);
                    
                ,
                (error) => 
                    console.log(error);
                
            );
    );

    return (
        <div>
            <TableContainer component=Paper>
                <Table sx= minWidth: 650  aria-label="simple table">
                    <TableHead>
                        <TableRow>
                            <TableCell align="center">ID</TableCell>
                            <TableCell align="center">Name</TableCell>
                            <TableCell align="center">Avatar</TableCell>
                        </TableRow>
                    </TableHead>
                    <TableBody>
                        data.map((row) => (
                            <TableRow
                                key=row.name
                                sx= "&:last-child td, &:last-child th":  border: 0  
                            >
                                <TableCell align="center">row.id</TableCell>
                                <TableCell align="center">row.name</TableCell>
                                <TableCell align="center">
                                    <img src=row.avatar  />
                                </TableCell>
                            </TableRow>
                        ))
                    </TableBody>
                </Table>
            </TableContainer>
        </div>
    );
;

export default Home;

【问题讨论】:

【参考方案1】:

您的useEffect 每次在组件内发生渲染时都会被执行。

您需要在useEffect 中添加空依赖项,这样它就不会被第二次执行。

useEffect(() => 
    fetch("https://61924463aeab5c0017105ebe.mockapi.io/test")
        .then((res) => res.json())
        .then(
            (result) => 
                if (result) 
                    console.log("test");
                    setData(result);
                
            ,
            (error) => 
                console.log(error);
            
        );
, []);

【讨论】:

非常感谢!

以上是关于使用 API 的 React 中发生了太多的重新渲染的主要内容,如果未能解决你的问题,请参考以下文章

默然回首繁忙而充实的2016

Spark ALS 算法给出了太多的零因子

太多的重新渲染。 React 限制了渲染的数量以防止无限循环。?

打不开微赚因为发生了太多重定位是啥意思?

C# WPF 在构建时创建了太多的文化文件夹

太多的重新渲染。 React 限制了渲染的数量以防止无限循环。 UI 和控制台错误