gpt4 book ai didi

javascript - 未捕获的不变违规 : Rendered more hooks than during the previous render

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:39:03 30 4
gpt4 key购买 nike

我有一个看起来像这样的组件(非常简化的版本):

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>;
}

当我加载使用此组件的页面时,出现此错误:Uncaught Invariant Violation: Rendered more hooks than the previous render. 我试图找到对此错误的解释,但是我的搜索没有返回任何结果。

当我稍微修改组件时:

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>;
}

我不再收到该错误。是因为我在 renderResults 返回的 jsx 中包含了 setState 函数吗?如果能解释为什么该修复有效,那就太好了。

最佳答案

我遇到了同样的问题。我正在做的是这样的:

const Table = (listings) => {

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

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

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

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

我认为发生的事情是在第一次渲染时,组件提前返回并且 useEffect 没有运行。当 isLoading 状态改变时,useEffect 运行并且我收到错误 - 钩子(Hook)渲染的次数比之前的渲染次数多。

一个简单的更改修复了它:

const Table = (listings) => {

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

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

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

关于javascript - 未捕获的不变违规 : Rendered more hooks than during the previous render,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55622768/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com