Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >componentDidUpdate....why内部出现无限循环错误?

componentDidUpdate....why内部出现无限循环错误?
EN

Stack Overflow用户
提问于 2020-02-28 15:43:19
回答 2查看 43关注 0票数 0

我收到这个错误:错误:超过最大更新深度。当组件在componentWillUpdate或componentDidUpdate中重复调用setState时,可能会发生这种情况。React限制嵌套更新的数量,以防止无限循环。

为什么?我将setState封装在一个if语句中,以防止它导致无限循环,但显然情况并非如此。为了解决这个错误,你有什么建议吗?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
componentDidUpdate(prevProps: any, prevState: any) {
    if (this.props.submissions !== prevState.submissions) {
        let uniqueOrganizations: any = [];
        let uniqueWindows: any = [];
        if (this.props.submissions !== null) {
            this.props.submissions.filter((submission: any, index: number) => {
                !uniqueOrganizations.some((o: any) => o.organizationId === submission.user.organization.organizationId) && uniqueOrganizations.push(submission.user.organization);
                !uniqueWindows.some((w: any) => w.windowId === submission.window.windowId) && uniqueWindows.push(submission.window);
            });
            this.setState({
                uniqueOrganizations: uniqueOrganizations,
                uniqueWindows: uniqueWindows
            });
        }
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-02-28 16:00:19

您的if语句实际上并没有将前面的道具与实际的道具进行比较。您正在将先前的道具与先前的状态进行比较。请参阅文档here

你可以试试这个。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
componentDidUpdate(prevProps: any, prevState: any) {
    if (this.props.submissions !== prevProps.submissions) {
        let uniqueOrganizations: any = [];
        let uniqueWindows: any = [];
        if (this.props.submissions !== null) {
            this.props.submissions.filter((submission: any, index: number) => {
                !uniqueOrganizations.some((o: any) => o.organizationId === submission.user.organization.organizationId) && uniqueOrganizations.push(submission.user.organization);
                !uniqueWindows.some((w: any) => w.windowId === submission.window.windowId) && uniqueWindows.push(submission.window);
            });
            this.setState({
                uniqueOrganizations: uniqueOrganizations,
                uniqueWindows: uniqueWindows
            });
        }
    }
}
票数 2
EN

Stack Overflow用户

发布于 2020-02-28 15:48:19

保护componentDidUpdate

如果您setState内部组件确实更新了,并且没有检查更改是否相同,就会发生这种情况。

任何状态更改都将调用componentDidUpdate。

所以这条线

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
this.setState({
  uniqueOrganizations: uniqueOrganizations,
  uniqueWindows: uniqueWindows
});

会无限地自我触发。

添加保护,使其不会再次调用此setState。

一些如果在内部会有帮助

if(prevProps.uniqueOrganizations !== this.props.uniqueOrganizations)

但你把事情搞得很复杂。对于每个州,if语句中都会有一堆&&||语句。

替代解决方案

我建议制作功能组件并使用新的钩子,特别是这个useEffect

您可以很容易地使用hooks api来完成这项工作,因为您可以告诉每个钩子在特定更改时触发。但是你不能使用一个类。

示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import React, { useState, useEffect } from 'react';

function Example() {
  const [count, setCount] = useState(0);

  // Similar to componentDidMount and componentDidUpdate:
  useEffect(() => {
    // Update the document title using the browser API
    document.title = `You clicked ${count} times`;
  }, [count]);

  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(count + 1)}>
        Click me
      </button>
    </div>
  );
}

请看这里的代码行}, [count]);,这告诉我们只有当count改变时才会触发这个效果。这样,你就不必编写所有这些疯狂的条件来让你的更新在没有无限循环的情况下工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60455005

复制
相关文章
出现“内部错误,无法显示”
This page contains the following errors: error on line 2 at column 6: XML declaration allowed only at the start of the document Below is a rendering of the page up to the first error. 提示信息是头部有错误,我登录后台查看我修改过的页面,然后找到home.php我看了十几分钟没有发现那里有错误~~ 莫非头部不能有空格? 去掉试试
苦咖啡
2018/05/07
3.2K0
无限循环
#!/usr/bin/python # -*- coding: UTF-8 -*- var = 1 while var == 1 : # 该条件永远为true,循环将无限执行下去 num = raw_input("Enter a number :") print "You entered: ", num print "Good bye!"
用户8442333
2021/05/26
1.9K0
onResume无限循环
查看Log,onResume和onPause在不停的执行,debug排查发现是因为请求权限导致的。
全栈程序员站长
2022/09/05
1.5K0
[android] 轮播图-无限循环
在getCount()方法中,返回一个很大的值,Integer.MAX_VALUE
唯一Chat
2019/09/10
1.8K0
树莓派 安装 Nextcloud 出现“内部服务器错误”
直接找到 php 的 congfig.php 文件,把配置 数据库那块修改掉,就重新出现配置页面,应该是我之前配置数据写的不对。网上还有一种说法是 data 目录权限问题。
卓越笔记
2023/02/18
2.8K0
树莓派 安装 Nextcloud 出现“内部服务器错误”
css动画无限循环
想要实现CSS动画的无限循环,其实主要就是要使用animation-iteration-count这个属性,将其设置为infinite,动画就会一直循环播放。
IT工作者
2022/02/15
6.3K0
Go常见错误集锦 | 循环内部使用defer的正确姿势
本文给大家介绍一些在使用循环语句内部使用defer会遇到的坑以及如何避免。下面是一个在循环中打开一组文件的函数例子。在该函数中,会从一个通道中不断的接收文件路径。然后通过遍历该通道,打开对应路径的文件,然后在使用完毕后关闭该文件资源。代码如下:
Go学堂
2023/01/31
1.1K0
自定义无限循环ViewPager(三)――ViewPager方法改造实现无限循环
在前面两篇文章中,已经对ViewPager的实现原理有了分析,相信大家对于ViewPager的页面切换也有了一定的了解,接下来就是在ViewPager的基础上对其进行改造,达到无限循环的目的。
用户3106371
2018/09/12
3.6K0
自定义无限循环ViewPager(三)――ViewPager方法改造实现无限循环
matlab如何循环_左手转笔教程无限循环
其中1:4代表一个行向量1 2 3 4,在matlab中,行向量的另外一个表示方法是[1 2 3 4],即for i=1:4等价于for i=[1 2 3 4],编写程序时牢记一个点:对于某次固定的迭代,i会从这个向量中取一个值,该值可以参与循环中的计算。
全栈程序员站长
2022/11/08
1.8K0
C++ do while无限循环~
i大于0|| i++,可以无限递增,我也只是刚好看到,写了一个试试,如果你们有更好的,欢迎留言,一起交流!
用户7886150
2021/02/03
2K0
js图片横排无限循环滚动
一个好的插件地址:http://www.superslide2.com/demo.html
全栈程序员站长
2022/09/09
9.6K0
出现500错误
早上闲来无事,在cpanel后台转悠,看到了hotlink保护,想想是不是设置一下防盗链呢,这个博客开始到现在也没有几张有价值的图片,其实防盗链没所谓的,凑凑热闹设置一下,以前用过cpanel后台的免费空间,设置过hotlink,所以就没在意,设置完关掉了。
空空裤兜
2023/03/03
1.6K0
UGUI Scrollrect滚动优化:无限循环利用
在做排行榜类似界面时,item非常多,可能有几百个,一次创建这么多GameObject是非常卡的。为此,使用只创建可视区一共显示的个数,加上后置准备个数。如图所示
立羽
2023/08/24
3720
UGUI Scrollrect滚动优化:无限循环利用
自定义无限循环的LayoutManager
在日常开发的过程中,同学们都遇到过需要RecyclerView无限循环的需求,但是在官方提供的几种LayoutManager中并未支持无限循环。
Rouse
2021/01/27
2.4K0
自定义无限循环的LayoutManager
Unity-UGUI无限循环列表
简介: UGUI使用ScrollView、GridLayoutGroup实现无限循环列表,支持数据刷新,支持跳转,支持动态插入/删除
祝你万事顺利
2019/07/26
5K0
点击加载更多

相似问题

数组中出现javascript无限循环错误

50

开关情况输入错误时出现无限循环

31

而在for循环内部会产生无限循环?

40

无限循环错误

11

基于.htaccess的内部服务器错误/无限循环

22
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文