未捕获的不变违规:与之前的渲染相比,渲染了更多的钩子

2023-12-27

我有一个如下所示的组件(非常简化的版本):

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

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


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

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 运行,我收到错误 - 钩子渲染的次数比之前的渲染次数多。

一个简单的改变就解决了这个问题:

const Table = (listings) => {
    
    const {isLoading} = useSelector(state => state.tableReducer);
        
    useEffect(() => {
        console.log("Run something")
    }, [])
    
    if(isLoading){
        return <h1>Loading...</h1>
    }
    return (<table>{listings}</table>)
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

未捕获的不变违规:与之前的渲染相比,渲染了更多的钩子 的相关文章

随机推荐

  • JPA Buddy 逆向工程工具未显示表格

    当我单击 来自数据库的实体 时 它正确连接到数据库 并且成功执行内省 以便我可以从侧面视图看到表列表 但在弹出窗口中我得到 0 个表 0 个视图和 0 个映射关系 0tables https i stack imgur com Gl0Ua
  • Linux 中使用 pipeline() 的链式管道

    我知道如何使用 C 在 Linux 中创建一个管道 如下所示cat tmp txt grep foo 但是我在实现像这样的多个链式管道时遇到问题cat tmp 1 txt uniq c sort 如何使用 C 来做到这一点pipe 在 Li
  • 为什么 PHP 被认为是面向对象的?

    我一直在阅读 OOP 的定义 但不明白为什么 PHP 被认为是面向对象的 这与 PHP 的 基础级别 不具备而更高级的功能却有什么关系吗 在大部分标准库已经创建并且该语言已经建立之后 OO 特性通过版本 3 5 分阶段添加到 PHP 中 背
  • 计算平均值或将 ArrayList 作为函数的参数

    是否有内置方法来计算整数 ArrayList 的平均值 如果没有 我可以创建一个函数 通过获取 ArrayList 的名称并返回其平均值来实现此目的吗 这真的很简单 Better use a List It is more generic
  • php 获取数组的数据大小

    拥有这个数组 Array block1 gt Array list gt Array sub list gt Array links gt Number total gt Number block2 gt Array attributes
  • 如何指定 Android 模拟器应在我的开发计算机上使用哪个网络接口?

    我的开发机器同时连接到两个不同的网络 一种是通过以太网 eth0 另一种是通过 WiFi en1 在这种情况下 Android 模拟器似乎总是想要连接 eth0 上的网络 从命令行启动模拟器时 是否有一个选项可以告诉它使用开发计算机上的特定
  • java中非静态块有什么用? [复制]

    这个问题在这里已经有答案了 可能的重复 实例初始值设定项与构造函数有何不同 https stackoverflow com questions 1355810 how is an instance initializer different
  • 使用捆绑属性增强图形库

    我是 BGL 的新手 尝试使用 BGL 设置一个简单的最短路径查找程序 其中无向图被定义为具有自定义定义的 EdgeProperty 和 VertexProperty 的邻接列表 我收到编译时错误 我将其归因于我在模板和 Boost 方面的
  • spring data jpa @query 和可分页

    我正在使用 Spring Data JPA 当我使用 Queryto 定义查询WITHOUT Pageable 有用 public interface UrnMappingRepository extends JpaRepository
  • 通过instance-id获取实例

    我需要通过实例 ID 获取实例 是否可以在不请求所有实例的列表的情况下完成此操作 我试过了 ec2 conn boto connect ec2 aws access key id key aws secret access key acce
  • 如何提高winform的加载时间?

    我有一个 WinForms 应用程序 主窗体有很多控件 这也是加载速度非常慢的原因之一 我想做的是使表单加载速度更快 我已经设置了beginupdate和endupdate 该表单不会在后台工作线程中呈现 因为这是主表单 没有初始形式 当用
  • 如何控制android中的视频捕获属性?

    我正在使用以下意图捕获视频 Intent takeVideoIntent new Intent MediaStore ACTION VIDEO CAPTURE if takeVideoIntent resolveActivity getPa
  • 允许匿名访问受保护的 Subversion 存储库的部分内容

    我们目前面临的问题是允许人们访问 subversion 存储库的某些部分 1 5 x 很快是 1 6 x 而其他部分是安全的 让我给你一些细节 我们有一个生产服务器 其中许多项目都有自己的颠覆存储库 对于每个项目 我们的 Apache 配置
  • Docker Compose 与多阶段构建

    有了这个新版本 https blog docker com 2017 06 announcing docker 17 06 community edition ce Docker 引入了多阶段构建 至少我以前从未听说过 我现在的问题是 我应
  • 使用 Spring Data Rest 时如何从组件扫描中排除 @Repository

    在 Spring Boot 项目中 我在从组件扫描中排除某些存储库时遇到问题 我有一个包含一些实体和一些存储库 JpaRepositories 的库 由于某种原因 我实现了一个小型 Spring Boot Data Rest 应用程序 用于
  • 如何在 Rust 中打印 sha256 哈希值? (通用数组)

    我正在测试 sha2 箱子 https docs rs sha2 0 9 3 sha2 https docs rs sha2 0 9 3 sha2 let base2 i32 2 let total size base2 pow 24 le
  • UISearchController 推送时不会隐藏视图

    我正在使用 UISearchController 在 UITableView 中显示搜索栏和结果 我设法正确设置它 但是当我搜索结果 然后选择表视图中的一行 并将新的视图控制器推送到导航堆栈时 我希望搜索栏不再可见 但是 当我尝试此操作时
  • 将数据框列转换为存储在列表中的向量

    我的数据由许多列 变量和三行组成 每个变量都是一个整数 其值随行和列的不同而变化 下面是我的数据的一个最小示例 Minimal example of data frame I have df lt data frame x1 c 1 2 3
  • 通过 Spotify Web API 和 JavaScript 播放歌曲时出现问题

    我正在致力于构建一个与 Spotify 交互的基于 Web 的应用程序 我从 C 开始 访问 API 拉出我的播放列表并从中拉出曲目都没有问题 但似乎您无法使用位于此处的 Spotify Web API 来播放歌曲 https develo
  • 未捕获的不变违规:与之前的渲染相比,渲染了更多的钩子

    我有一个如下所示的组件 非常简化的版本 const component props PropTypes gt const allResultsVisible setAllResultsVisible useState false const