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

未捕获的不变量冲突:呈现的钩子比上一次呈现的钩子多

阚亮
2023-03-14

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

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

加载使用此组件的页面时,出现以下错误:未捕获的不变冲突:呈现的钩子比上一次呈现时多。我试图找到此错误的解释,但搜索未返回任何结果。

当我稍微修改组件时:

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函数吗?如果能有一个解释为什么修复是有效的,那就太好了。

共有1个答案

屠晟睿
2023-03-14

修复工作是因为第一个代码示例(出错的代码示例)调用onclick中的函数,而第二个代码示例(工作的代码示例)将函数传递给onclick。不同之处在于那些非常重要的括号,在JavaScript中,括号的意思是“调用此代码”。

这样想:在第一个代码示例中,每次呈现component时,都会调用renderresults。每次发生这种情况,都会调用setAllResultsVisible(!AllResultsVisible),而不是等待单击。由于React按照自己的时间表执行呈现,所以不知道会发生多少次。

React文档中:

使用JSX,您将函数作为事件处理程序传递,而不是字符串。

反应处理事件文档

注意:在沙箱中运行第一个代码示例时,我无法得到这个确切的错误消息。我的错误涉及到无限循环。也许React的最新版本会产生上述错误?

 类似资料:
  • 一个组件,它呈现已填好的表单的预览,当您单击左侧的表单时,它会在右侧显示它们。 第一个handleSwitchReview向我抛出了React钩子,所呈现的钩子比上一个呈现错误时要多 第二个不是。当我控制台日志道具,例如,我得到他们4-5次时,第一个函数的视图显示,但没有第二次,第二次只显示1次在控制台日志。 尝试移动setState并在控制台中记录父组件,但这个组件是唯一一个启动了很多次并中断的

  • 我有一个组件,我在其中调用我的自定义钩子。 自定义钩子如下所示: 而我在其中使用的导致错误的组件是: 有什么想法吗?

  • 我目前正在实现useSWR,以便从我的express和mongo-db后端获取数据。我能够顺利地从数据库中提取数据没有问题。下面是我用来实现这一点的代码: 然后通过以下方式访问: ,其中username是集合中的一个字段。 当我尝试将此信息添加到状态钩子中时,问题就出现了,然后状态钩子返回的错误呈现的钩子比上一次呈现的钩子要多。 删除行:和使用状态变量displayNumber的任何行就可以完全修

  • 我正在使用 React 的钩子,我希望有一个从数据库中检索到的值作为初始值。但是,我收到以下错误: 不变冲突:不变冲突:与上一次渲染相比,渲染的钩子更多。 我用的是反应阿波罗钩。 更新

  • 我能用钩子解决这个问题吗? 为什么它不能正常工作? 我开始使用REACT DND,在我尝试使用拖放后,所有的事情都出了问题。 我将其用作依赖项: > “@testing-library/jest-dom”:“^4.2.4”, "@testing-library/react":"^9.5.0", 已部署项目-hunger-tree.surge.sh src/components/todos/crea

  • 在此处输入图像描述我正在使用use效果挂钩来使用获取api,但它不起作用。当只有一个api时,它可以正常工作,但当我使用另一个api使用createData函数中的use效果挂钩获取数据时,它会出错。 我做了一些研究,我认为这是因为react中的组件重新渲染引起的一些问题,我试图搜索修复,但没有找到它,所以我发布它,如果有任何问题,请在评论中问我,我会给出更多的细节。