当前位置: 首页 > 知识库问答 >
问题:

反应无限渲染循环

颛孙和悌
2023-03-14

我创建了一个需要在应用程序的多个部分中单独显示的组件-(在我的导航内部、主页和单独的路由上)。因此,我在此组件中的一个use中进行了所有操作调度(用于读取数据的api调用)效果:

useEffect(() => {
    dispatch(time.read())
    dispatch(pause.read())
    dispatch(travel.read())
    dispatch(distances.read())
}, [])

如您所见,此效果应该只运行一次(当组件装载时)。

在其他任何地方,我都不会在此组件内部或外部调度这些特定操作。

该组件在3个位置渲染(导航内部、其自身的时间路径和主组件内部)。我可以在导航内部同时在时间上渲染它,没有问题。它的作用应该是这样的(当我从导航中进行更改时,它们会实时镜像,因为它们都与redux绑定在一起)。最后是主页组件。

当我第一次尝试在主组件上渲染时,加载需要一段时间,然后我尝试通过v4地址(同一网络)从移动设备打开它,加载时间太长。此时,我的笔记本电脑开始听起来像直升机,所以我打开了htop,内存使用和CPU使用几乎达到了最大值,我打开了服务器日志,每秒看到数百个请求。以下是我如何在我的主组件中渲染此组件:

import React from "react"
import { useSelector } from "react-redux"
import { NavLink } from "react-router-dom"
import "./Home.css"

import {
    FaCarCrash,
    CgProfile,
    AiOutlineShop,
    TiVideo,
} from 'react-icons/all'
import Tracking from "../TimeTracking/Tracking" /*This is the component which causes all the toruble*/

export default function Home(props) {

    const current = useSelector(state => state.user.currentUser)

    return (
        <div className="Home container">
            <div id="links">
                <NavLink to="/create_job/">
                    <FaCarCrash />
                    <p> CREATE JOB </p>
                </NavLink>
                <NavLink to={"/profile/" + current._id}>
                    <CgProfile />
                    <p> PROFILE </p>
                </NavLink>
                <NavLink to="/shop/view/">
                    <AiOutlineShop />
                    <p> SHOP </p>
                </NavLink>
                <NavLink to="/tutorials/">
                    <TiVideo />
                    <p> TRAINING </p>
                </NavLink>
            </div>
            <Tracking /> /*This is the component which causes all the toruble*/
        </div>
    )
}

如您所见,没有什么不寻常的——一个简单的功能组件,甚至没有调度任何操作。这里只有与redux的通信是useSelector。

这是我渲染Home组件的地方:

import React, { Fragment } from 'react'
import { Route } from 'react-router-dom'

/*...other imports...*/
import Home from "../components/Mobile/Home"
/*...other imports...*/

export default props => (
    <Fragment>
        /*...other routes...*/
        <Route path="/home" component={Home} />
        /*...other routes...*/
    </Fragment> /* just a fragment wrapper around the routes for the user. This component is later rendered inside of my <Router> </Router>. This is done because the app has a lot of different routes. */
)

出于某种原因,即使我没有与应用程序交互,该组件也会不断地重复渲染。我已经检查过,看我是否从两个地方发送过可能导致此问题的相同操作,但我没有。我知道我没有付出太多,但在这个问题上真的没有那么多,我只是希望有人以前遇到过。我以前处理过无限渲染循环,它们通常很明显,也很容易解决,但这一个有点奇怪。

共有1个答案

苍温文
2023-03-14

我已经解决了我的问题。我实际上使用的是我的根路由器的旧版本。js其中的主组件声明如下:

<Route path="/home" component={<Home user={this.props.user} />} />

我正在渲染的Home组件也是一个旧版本(它是一个类组件,而不是我在问题中编写的函数组件)。

所以这是导致问题的原因:

user prop在声明Home路由时向下传递,它保存state.user的值

然后在主页组件中,我使用MapStateTops,将用户映射到道具,并将其设置为状态。使用者当前用户。

这会导致user prop在渲染组件时声明一次,然后在渲染组件时更改,然后在下一次渲染时再次更改,依此类推。反应没有响应渲染循环的原因是因为userprop为每个渲染保存不同的值。

 类似资料:
  • 我很困惑为什么Iam会出现这个错误:太多的重新呈现。React限制呈现次数以防止无限循环。当我尝试调用USESTAT保存checkBoxList数据时,就会发生这种情况。如果我注释掉行setListOptions(checkBoxList);错误消失了。我希望发生的是,setListoptions应该保存在本地,然后我可以调用listOptions来映射我的数据。谢谢你的协助。

  • 如何防止以下错误: 太多的重新渲染。React限制渲染的数量,以防止无限循环。' 我刚刚将一个基于类的组件更改为功能组件,但它不起作用 我的源代码 我只是将一个基于类的组件更改为功能组件,我得到了这些错误。 0个 如何防止以下错误: 太多的重新渲染。React限制渲染的数量,以防止无限循环。'

  • 这是来自物料界面的模板。我从GitHub的注册中选择了这个模板,我只导入了useState并尝试使用它。 它抛出“太多的重新渲染。React限制渲染数量以防止无限循环材质”, 我尝试过使用反应钩子,因为我不能实现类。

  • 当我试图设置状态,然后得到一个错误。错误:太多的重新渲染。React限制渲染的数量以防止无限循环。 我已经用

  • 问题内容: 我有一个应用程序,需要动态设置元素的高度(让我们说“ app-content”)。它获取应用程序“ chrome”的高度,然后减去它的高度,然后将“ app- content”的高度设置为在这些限制内适合100%。这对于香草JS,jQuery或Backbone视图来说非常简单,但是我正在努力弄清楚在React中执行此操作的正确过程是什么? 以下是一个示例组件。我希望能够将的高度设置为窗

  • 问题内容: 我在弄清楚为什么我的应用程序执行无尽渲染时遇到问题。 在内部,我的有状态组件,我正在componentDidMount方法中调用redux动作(调用componentWillMount也可以进行无尽渲染) 在CoinCard中,我实际上不做任何事情(在Flat列表内注意CoinCard) 现在,当我控制台登录我的硬币卡渲染时,我可以 在此处* 看到 Inside rende的 无限日志