简体   繁体   English

反应错误:重新渲染太多。 React 限制渲染次数以防止无限循环

[英]React Error: Too many re-renders. React limits the number of renders to prevent an infinite loop

The code was originally supposed to just display a different greeting using the time of the day ( Date().getHours() ) and some conditions.该代码最初应该使用一天中的时间( Date().getHours() )和一些条件来显示不同的问候语。 However, I tried to simplify the code to just check if the state would change, it gives the same error mentioned above.但是,我尝试简化代码以检查 state 是否会更改,它会给出上述相同的错误。

The state does get displayed as is if I don't include the conditions setting the state.如果我不包括设置 state 的条件,state 会按原样显示。

import React from 'react'
import Cards from './cards'

function Main() {

    const [greeting, setGreeting] = React.useState("Hello")
    const user = false
    if (user) {
        setGreeting("Welcome")
    } else {
        setGreeting("You dont belong here")
    }
    return (
        <main role="main" className="col-md-9 ml-sm-auto col-lg-10 px-md-4">
            <div className="d-flex flex-wrap flex-md-nowrap pt-2 mt-2 mb-4">
                <h1> {greeting} Random Dude!</h1>
            </div>
            <Cards />
        </main>
    )
}


export default Main

I tried to wrap this in a function as well but no luck which makes sense because every time the code gets rendered, the function is called again and it loops我也尝试将其包装在 function 中,但运气不好,因为每次呈现代码时,都会再次调用 function 并循环

import React from 'react'
import Cards from './cards'

function Main() {

    const [greeting, setGreeting] = React.useState("Hello")
    const user = false
    function greetingMessage() {
        if (user) {
            setGreeting("Welcome")
        } else {
            setGreeting("You dont belong here")
        }
        return (greeting)
    }
    return (
        <main role="main" className="col-md-9 ml-sm-auto col-lg-10 px-md-4">
            <div className="d-flex flex-wrap flex-md-nowrap pt-2 mt-2 mb-4">
                <h1> {greetingMessage()} Random Dude!</h1>
            </div>
            <Cards />
        </main>
    )
}


export default Main

You need to perform setting your React state inside either an event handler or inside a useEffect hook.您需要在事件处理程序或 useEffect 挂钩内执行设置 React state。

What's happening in your code is this:-您的代码中发生的情况是:-

1) const user = false :- This assignment happens every time the component re-renders so I think user should be React state and not a simple variable. 1) const user = false :- 每次组件重新渲染时都会发生此分配,所以我认为用户应该是 React state 而不是一个简单的变量。

2) <h1> {greetingMessage()} Random Dude!</h1> - This means that whenever your component renders, greetingMessage() is called and the state is set as per your logic. 2) <h1> {greetingMessage()} Random Dude!</h1> - 这意味着每当您的组件呈现时,都会调用greetingMessage()并根据您的逻辑设置 state。 Now since, the state is set, the component will re-render, which will trigger everything again and the cycle will go on.现在,由于设置了 state,组件将重新渲染,这将再次触发一切,并且循环将打开 go。 To solve this do this in a useEffect like so:-要解决此问题,请在useEffect中执行此操作,如下所示:-

//Just after your state definitions
useEffect(()=>{
        if (user) {
            setGreeting("Welcome")
        } else {
            setGreeting("You dont belong here")
        }
},[])

So your final code can be something like:-所以你的最终代码可能是这样的: -

function Main() {

    const [greeting, setGreeting] = React.useState("Hello")
    //Implement the logic for how you want to set this user state
    const [user,setUser] = React.useState(false)


    useEffect(() => {
    if (user) {
            setGreeting("Welcome")
        } else {
            setGreeting("You dont belong here")
        }
    }, [])

    return (
        <main role="main" className="col-md-9 ml-sm-auto col-lg-10 px-md-4">
            <div className="d-flex flex-wrap flex-md-nowrap pt-2 mt-2 mb-4">
                <h1> {greeting} Random Dude!</h1>
            </div>
            <Cards />
        </main>
    )
}

My best bet for you is to once go through React docs about hooks before you jump directly into code.我对你最好的选择是在你直接跳入代码之前通过 React 文档中关于钩子的 go 一次。 These will clear out a lot of things for you:-这些将为您清除很多东西:-

https://reactjs.org/docs/hooks-intro.html https://reactjs.org/docs/hooks-intro.html

See if this works看看这是否有效

import React from 'react'
import Cards from './cards'

function Main() {
    const user = false
    const [greeting, setGreeting] = React.useState(user ? "Welcome" : "You dont belong here")

    return (
        <main role="main" className="col-md-9 ml-sm-auto col-lg-10 px-md-4">
            <div className="d-flex flex-wrap flex-md-nowrap pt-2 mt-2 mb-4">
                <h1> {greeting} Random Dude!</h1>
            </div>
            <Cards />
        </main>
    )
}


export default Main

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 React - 错误:重新渲染太多。 React 限制渲染次数以防止无限循环 - React - Error: Too many re-renders. React limits the number of renders to prevent an infinite loop React-Error:重新渲染太多。 React 限制渲染次数以防止无限循环 - React-Error: Too many re-renders. React limits the number of renders to prevent an infinite loop 错误:重新渲染过多。 React 限制了渲染的数量以防止无限循环。 - 反应 JS - Error: Too many re-renders. React limits the number of renders to prevent an infinite loop. - React JS 错误:重新渲染过多。 React 限制渲染次数以防止无限循环。 反应 - Error: Too many re-renders. React limits the number of renders to prevent an infinite loop. React 错误:重新渲染过多。 React 限制了渲染的数量以防止无限循环。 - 反应 - Error: Too many re-renders. React limits the number of renders to prevent an infinite loop. - React 反应:错误:重新渲染太多。 React 限制渲染次数以防止无限循环 - React: Error: Too many re-renders. React limits the number of renders to prevent an infinite loop 服务器错误错误:重新渲染太多。 React 限制渲染次数以防止无限循环 - Server Error Error: Too many re-renders. React limits the number of renders to prevent an infinite loop “未捕获的错误:重新渲染过多。React 限制渲染次数以防止无限循环。” - "Uncaught Error: Too many re-renders. React limits the number of renders to prevent an infinite loop." 错误:重新渲染过多。 React 限制渲染次数以防止无限循环 - Error: Too many re-renders. React limits the number of renders to prevent an infinite loop 错误:重新渲染过多。 React 限制了渲染的数量以防止无限循环。 内部使用效果 - Error: Too many re-renders. React limits the number of renders to prevent an infinite loop. Inside useEffect
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM