我正在做这个康威的生活游戏react项目,它工作得很好,但当我添加最后几个按钮来清除棋盘和其他一些功能时,react给了我这个错误
Maximum update depth exceeded. This can happen when a component
repeatedly calls setState inside componentWillUpdate or
componentDidUpdate. React limits the number of nested updates to
prevent infinite loops.
从代码片段来看,它向我展示了Clear()函数似乎是这里的问题所在,但我认为我没有在渲染()中设置状态来触发无限循环。这里是Clear和的所有代码,我的应用程序中没有
组件WillUpdate
或组件迪迪更新
。
主类中的clear()和Play函数
编辑1:它告诉我play()函数中的setState有问题,但是,我总是这样实现play函数,而且从一开始它就一直在工作。。。。
clear = ()=>{
var g = Array(this.rows).fill().map(()=> Array(this.cols).fill(false));
this.setState({
generations:0,
fullGrid: g
})
}
.....
play = () => {
let g1 = this.state.fullGrid;
let g2 = arrayClone(this.state.fullGrid);
for (let i = 0; i < this.rows; i++) {
for (let j = 0; j < this.cols; j++) {
let count = 0;
if (i > 0)
if (g1[i - 1][j]) count++;
if (i > 0 && j > 0)
if (g1[i - 1][j - 1]) count++;
if (i > 0 && j < this.cols - 1)
if (g1[i - 1][j + 1]) count++;
if (j < this.cols - 1)
if (g1[i][j + 1]) count++;
if (j > 0)
if (g1[i][j - 1]) count++;
if (i < this.rows - 1)
if (g1[i + 1][j]) count++;
if (i < this.rows - 1 && j > 0)
if (g1[i + 1][j - 1]) count++;
if (i < this.rows - 1 && this.cols - 1)
if (g1[i + 1][j + 1]) count++;
if (g1[i][j] && (count < 2 || count > 3)) g2[i][j] = false;
if (!g1[i][j] && count === 3) g2[i][j] = true;
}
}
this.setState({
fullGrid: g2,
generations: this.state.generations + 1
});
}
playButton = ()=>{
clearInterval(this.intervalId);
this.intervalId = setInterval(this.play, this.speed);
}
pauseButton = ()=>{
clearInterval(this.intervalId);
}
slow = ()=>{
this.speed = 1000;
this.playButton();
}
fast = ()=>{
this.speed = 100;
this.playButton();
}
clear = ()=>{
var g = Array(this.rows).fill().map(()=> Array(this.cols).fill(false))
this.setState({
generations:0,
fullGrid: g
})
}
按钮类
class Buttons extends React.Component{
handleSelect = (evt) =>{
this.props.gridSize(evt);
}
render(){
return (
<div className="center">
<ButtonToolbar>
<button className='btn btn-info' onClick={this.props.playButton}>
PLAY
</button>
<button className='btn btn-info' onClick={this.props.pauseButton}>
PAUSE
</button>
<button className='btn btn-info' onClick={this.props.clear}>
CLEAR
</button>
<button className='btn btn-info' onClick={this.props.slow}>
SLOW
</button>
<button className='btn btn-info' onClick={this.props.fast}>
FAST
</button>
<button className='btn btn-info' onClick={this.props.seed}>
SEED
</button>
<DropdownButton
title="Grid Size"
id="size-menu"
onSelect={this.handleSelect}
>
<MenuItem eventKey="1">20x10</MenuItem>
<MenuItem eventKey="2">50x30</MenuItem>
<MenuItem eventKey="3">70x50</MenuItem>
</DropdownButton>
</ButtonToolbar>
</div>
)
}
}
您的onClick
处理程序正在不断被调用。将它们更改为返回您希望调用的函数的函数,这样可以解决您的问题。
例:
<button className='btn btn-info' onClick={() => this.props.playButton}>
PLAY
</button>
已经有一些人问了这个问题,但是他们几乎都是由相同的原因引起的(例如< code > 附言:一些实用程序函数是在幕后定义的。 错误出在中。我找不到我无限地重新渲染的地方。
有很多类似的问题,尽管我在这里发布。 我收到以下错误: 未捕获的不变量冲突:超过最大更新深度。当组件在componentWillUpdate或componentDidUpdate内重复调用setState时,可能会发生这种情况。React限制嵌套更新的数量,以防止无限循环。 请注意,我还没有在page中使用过这样的功能。 选择时出错: 已编辑:我刚刚从setState中移除了矩函数。现在它工作正常
我对JS的反应有点陌生。我有两个问题。我来了 现在我要做的是,当应用程序组件挂载时,我生成一个对后端服务器的ajax调用,当它返回时,它更新道具,并设置状态,这样子组件也会重新呈现,但子组件不会重新呈现。谁能告诉我出了什么问题。 问题2 现在让我们假设我将进入组件二路由,它将呈现组件二,我在应用程序组件中生成一个ajax调用,根据ajax调用返回的数据,我在应用程序组件中设置了一些道具,我还希望组
我在React中运行我的应用程序时收到一个错误。这个错误有很多问题,但我不知道如何解决它。当我按下链接时,它会指向登录组件。“http://localhost:3000/login” 这是我在网站上得到的错误: “已超出最大更新深度。当组件重复调用组件内部的 setState 时,可能会发生这种情况“组件将更新”或“组件更新”。React 限制了嵌套更新的数量,以防止无限循环。 这是我的登录页面:
我正在尝试将基于类的组件转换为功能组件。如果在useEffect钩子中使用与componentDidMount下相同的代码,则会出现上述错误。 以下是发生错误的功能组件 抛出以下错误,浏览器崩溃未捕获(promise)错误:重新渲染过多。React限制渲染的数量以防止无限循环。
问题内容: 我在某处有几千行代码,并且我注意到当我对其进行过多更新时,我的JTextPane会闪烁。我在这里写了一个简化版: 这是针对终端(cmd)样式的GUI组件- 我想我已经在这里进行了所有优化,包括将其作为最终变量,这样它就不会被构造数百次。仍然,闪烁是明显的和不可接受的。几分钟后,组件完全冻结。我必须非常快速地更新组件,并且更新时必须将窗格滚动到底部。 我一直在考虑从头开始制作我自己的JT