在我的 ReactJS 代码中超出了最大调用堆栈大小
maximum call stack size exceeded in my reactjs code
我是反应的初学者.js,我正在尝试实现一个简单的嘶嘶声示例。总的来说,我想我了解了 react 及其组件的工作原理,但是当我尝试在代码笔上运行此代码时,出现此错误:
超出最大调用堆栈大小
这是我的代码:
class App extends React.Component {
constructor(props){
super(props);
this.state = {
value : '',
number: 0
};
this.handleIncrement = this.handleIncrement.bind(this);
this.handleDecrement = this.handleDecrement.bind(this);
this.fizzBuzz = this.fizzBuzz.bind(this);
}
fizzBuzz(nb){
if(nb % 15 == 0 && nb!= 0)
this.setState({value : `FizzBuzz `});
else if(nb % 5 == 0 && nb!= 0)
this.setState({value : `Buzz `});
else if(nb % 3 == 0 && nb!= 0)
this.setState({value : `Fizz `});
else
this.setState({value : ''});
}
handleIncrement() {
let nb = this.state.number + 1;
this.setState({number: nb});
this.fizzBuzz(nb);
}
handleDecrement() {
let nb = this.state.number-1;
if(nb >= 0)
{ this.setState({number: nb});
this.fizzBuzz(nb);
}
else
{
this.setState({number: 0});
}
}
render() {
return (
<div>
<h1> {this.state.number} </h1>
<h1> {this.state.value} </h1>
<input type="button" value="add" onClick={this.handleIncrement()} />
<input type="button" value="sub" onClick={this.handleDecrement()} />
</div>
);
}
}
ReactDOM.render(<App/>,document.getElementById('app'));
任何人都可以指出我犯了什么错误? 在过去的两个小时里,我一直感到困惑。
此致敬意
onClick={this.handleIncrement()}
表示函数handleIncrement
立即被计算,其返回值被分配给onClick
。
但是,handleIncrement
通过调用 this.setState({number: nb})
来更新组件的状态。每次更新组件的状态时,都会重新呈现该组件。因此,在您的情况下,您会得到一系列调用render -> handleIncrement -> render -> handleIncrement ...
等等,因此您的错误(超出最大调用堆栈大小(。
您不希望在 render
函数中立即计算onIncrement
方法。相反,您希望在发生onClick
事件时对其进行评估。因此,您需要将对函数的引用handleIncrement
传递给您的onClick
道具。
所以,你的代码应该是
<div type="button" value="add" onClick={this.handleIncrement} />
和类似的handleDecrement
.
相关文章:
- 是什么让一个“;Uncaught RangeError:超过了最大调用堆栈大小“;错误(Chrome,在其他浏览器中显示
- 超过了async.detect最大调用堆栈大小
- 如何远程检查JavaScript应用程序的函数调用堆栈
- 超过了最大调用堆栈大小,循环无限
- 超过了最大调用堆栈大小.递归标签
- 日志:未捕获的范围错误:超过了最大调用堆栈大小
- 未捕获的范围错误:setTimeout()超过了最大调用堆栈大小
- JavaFX+WebView/Javascript:setTimeOut不起作用调用堆栈来自Java
- JavaScript继承:未捕获的范围错误:超过了最大调用堆栈大小
- 使用$cookies和$stateChangeStart检查sessionID是否超过了最大调用堆栈
- jQuery捕获"RangeError:超过了最大调用堆栈大小“;
- 设置这个.RangeError:超过了最大调用堆栈大小
- 收到“范围错误: 超出最大调用堆栈大小”错误
- 递归 - 测试最大堆栈大小时,调用堆栈无法弹出
- 轮询 ajax 函数超出调用堆栈
- Chrome RangeError:使用jQuery$.map时超过了最大调用堆栈大小
- 要求JS 2.1.9引起“;最大调用堆栈"使用Grunt时出错
- Chrome/jQuery未捕获范围错误:超过了最大调用堆栈大小(函数循环)
- 超过了最大调用堆栈大小-没有明显的递归
- 警告:字体加载过程中出错:轨道上的PDFJS超过了最大调用堆栈大小错误