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

未捕获的游侠错误:在 React 中超出最大调用堆栈大小

傅阿苏
2023-03-14

我已经收到了

错误:“未捕获的RangeError:超出最大调用堆栈大小”

我怀疑我的组件WillUpdate方法中的这个代码块是原因,因为我只是在添加代码后才收到错误。我在这里做错了什么吗?

componentWillUpdate(nextProps, nextState) {

...

if (nextProps.show) {
  for (var i = 0; i < this.props.data.actions.length; i++) {
    if (this.props.data.actions[i].assignedTo !== this.state.userId && this.state.showActions === true) {
      this.setState({ showActions: false })
    }
    if (this.props.data.actions[i].assignedTo === this.state.userId && this.state.showActions === false) {
      this.setState({ showActions: true })
    }
  }
 }

...

}

当单击一个按钮时,nextProps.show被设置为true,然后它检查被分配一个动作的人是否与登录的用户相同,然后它将showActions状态设置为true。如果满足代码中的条件,此状态用于显示/隐藏行

共有3个答案

曾山
2023-03-14

根据React组件WillUpdate文档:

请注意,您不能在这里调用this.setState();也不应该在组件WillUpdate()返回之前执行任何其他操作(例如分派Redux操作)来触发对React组件的更新。如果您需要更新状态以响应道具更改,请改用组件WillReceiveProps()。

您应该将代码移动到< code > componentWillReceiveProps 方法中。

龚昊然
2023-03-14

此状态尚未在组件更新中发生突变

作为重用,在使用< code>this.setState后,使用< code>nextState而不是< code>this.state来验证值是否正确:

componentWillUpdate(nextProps, nextState) {

...

if (nextProps.show) {
  for (var i = 0; i < this.props.data.actions.length; i++) {
    if (this.props.data.actions[i].assignedTo !== this.state.userId && nextState.showActions === true) {
      this.setState({ showActions: false })
    }
    if (this.props.data.actions[i].assignedTo === this.state.userId && nextState.showActions === false) {
      this.setState({ showActions: true })
    }
  }
 }

...

}
邢小云
2023-03-14

由于您正在设置状态,这将再次调用组件WillUpdate,因此此递归调用是堆栈超出的原因。

组件WillMount()不同,我们不应该在组件WillUpdate()中调用this.setState()。我们不调用this.setState()的原因是该方法触发了另一个组件WillUpdate()。如果我们在组件WillUpdate()中触发状态更改,我们将最终陷入无限循环。

 类似资料:
  • 我在react中工作,基本上我想做一个带工具提示的按钮,现在我正在做工具提示。我正在更改css显示属性,以使它在鼠标进入和离开时可见或不可见。但是有一个错误,我不知道该怎么办... 这是我的代码: 在控制台中,我收到了这个错误: 我找不到问题出在哪里。我知道这可能是关于调用一个函数,而这个函数又调用另一个函数。但是我在代码中看不到这样的东西,我不确定是否都是这样。谢谢帮助:)

  • 我在玩React,我得到了我想要的功能,但是由于某个地方的无限循环,它非常慢。我相信它在组件生命周期方法中,但我不知道如何重新格式化下面的代码,使其具有相同的功能,但没有无限循环。任何关于最佳实践的建议都将不胜感激。

  • 我是React的初学者。js并试图理解道具的概念 我有两个组件 - UserData.jsx UserDataResult.jsx 在UserData中。jsx我用过这个。用户记录的状态。我想通过子组件UserDataResult.jsx显示此记录。 不知道我做错了什么,所以我在控制台日志中得到错误。 错误是:未捕获的范围错误:超出最大调用堆栈大小 代码: **UserData.jsx** **用

  • 下面的代码抛出了问题标题中提到的堆栈溢出。我正试图让一个方框阴影以脉冲效果显示在一个圆形图像的周围。有人能指出递归吗?我是一个Javascript新手,看不出来。谢谢你。 断续器 CSS 脚本

  • 我刚刚开始使用角度2。所以我尝试使用Web服务从数据库显示类别。 这是我的论坛.服务.ts文件 forum.component.ts: forum.component.html: 请帮忙,先谢了

  • 问题内容: 我正在做反应,基本上我想用工具提示制作一个按钮,现在我正在制作工具提示。我正在更改css display属性,以使其在鼠标进入和离开时不可见。但是有一个错误,我不知道该怎么办… 这是我的代码: 在控制台中,我收到此错误: 我找不到问题所在。我知道这可能与调用一个函数有关,后者又调用另一个函数。但是我在代码中看不到这样的东西,而且不确定是否全部。感谢帮助 :) 问题答案: 每当您看到从函