国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

Nicht erfasste invariante Verletzung: Mit mehr Hooks gerendert als beim vorherigen Rendern
P粉477369269
P粉477369269 2024-03-25 16:50:53
0
2
903

Ich habe eine Komponente, die so aussieht (sehr vereinfachte Version):

const component = (props: PropTypes) => {

    const [allResultsVisible, setAllResultsVisible] = useState(false);

    const renderResults = () => {
        return (
            <section>
                <p onClick={ setAllResultsVisible(!allResultsVisible) }>
                    More results v
                </p>
                {
                    allResultsVisible &&
                        <section className="entity-block--hidden-results">
                            ...
                        </section>
                }
            </section>
        );
    };

    return <div>{ renderResults() }</div>;
}

Wenn ich eine Seite lade, die diese Komponente verwendet, erhalte ich diese Fehlermeldung: Uncaught Invariant Violation: Rendered more hooks than during the previous render. Ich habe versucht, eine Erkl?rung für diesen Fehler zu finden, aber meine Suche hat keine Ergebnisse zurückgegeben.

Wenn ich die Komponente leicht ver?ndere:

const component = (props: PropTypes) => {

    const [allResultsVisible, setAllResultsVisible] = useState(false);

    const handleToggle = () => {
        setAllResultsVisible(!allResultsVisible);
    }

    const renderResults = () => {
        return (
            <section>
                <p onClick={ handleToggle }>
                    More results v
                </p>
                {
                    allResultsVisible &&
                        <section className="entity-block--hidden-results">
                            ...
                        </section>
                }
            </section>
        );
    };

    return <div>{ renderResults() }</div>;
}

Ich bekomme diesen Fehler nicht mehr. Liegt es daran, dass ich in der renderResults 返回的 jsx 中包含了 setState-Funktion bin? Es w?re toll, wenn es eine Erkl?rung g?be, warum dieser Fix funktioniert.

P粉477369269
P粉477369269

Antworte allen(2)
P粉729198207

我也遇到了同樣的問(wèn)題。我正在做的事情是這樣的:

const Table = (listings) => {

    const {isLoading} = useSelector(state => state.tableReducer);

    if(isLoading){
        return <h1>Loading...</h1>
    }

    useEffect(() => {
       console.log("Run something")
    }, [])

    return (<table>{listings}</table>)
}

我認(rèn)為發(fā)生的情況是在第一次渲染時(shí),組件提前返回并且 useEffect 沒(méi)有運(yùn)行。當(dāng) isLoading 狀態(tài)更改時(shí),useEffect 運(yùn)行,我收到錯(cuò)誤 - 鉤子渲染的次數(shù)比之前的渲染次數(shù)多。

一個(gè)簡(jiǎn)單的更改就解決了這個(gè)問(wèn)題:

const Table = (listings) => {
    
    const {isLoading} = useSelector(state => state.tableReducer);
        
    useEffect(() => {
        console.log("Run something")
    }, [])
    
    if(isLoading){
        return <h1>Loading...</h1>
    }
    return (<table>{listings}</table>)
}
P粉448346289

該修復(fù)之所以有效,是因?yàn)榈谝粋€(gè)代碼示例(出錯(cuò)的代碼)調(diào)用了 onClick 內(nèi)的函數(shù),而第二個(gè)代碼示例(有效的代碼示例)則將函數(shù)傳遞給了 onClick。區(qū)別在于那些非常重要的括號(hào),在 JavaScript 中意味著“調(diào)用此代碼”。

這樣想:在第一個(gè)代碼示例中,每次渲染 component 時(shí),都會(huì)調(diào)用 renderResults。每次發(fā)生這種情況時(shí),都會(huì)調(diào)用 setAllResultsVisible(!allResultsVisible),而不是等待單擊。由于 React 按照自己的時(shí)間表執(zhí)行渲染,因此無(wú)法確定會(huì)發(fā)生多少次。

來(lái)自 React 文檔:

React 處理事件文檔

注意:在沙箱中運(yùn)行第一個(gè)代碼示例時(shí),我無(wú)法獲得確切的錯(cuò)誤消息。我的錯(cuò)誤涉及無(wú)限循環(huán)。也許較新版本的 React 會(huì)產(chǎn)生所描述的錯(cuò)誤?

Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage