【问题标题】:Uncaught RangeError: Maximum call stack size exceeded - ReactJS未捕获的 RangeError:超出最大调用堆栈大小 - ReactJS
【发布时间】:2018-12-26 16:23:21
【问题描述】:

我已经检查了所有类似我的问题,但找不到任何对这个案例有用的东西。

请帮忙。

这是我的功能:

renderFields() {
    if (this.props.field) { // some prop

      return (
        <SelectBox
          className="selectbox"
          value={this.state.selectId}
        />
      );
    }
  }

使用地点:

renderAllFields() {
  <div>{this.renderFields()}</div>
}

这会生成以下消息:

Uncaught RangeError: Maximum call stack size exceeded

这可能与 React 中的生命周期有关,但我不确定。

例如当我检查时:

componentDidUpdate = (prevProps) => {
    console.log('prevProps', prevProps);
    console.log('this.props', this.props);
  };

它们看起来一样。

谢谢。

编辑:

render() {
  return (
    <div>
      <Formsy.Form
         ref="form"
         onChange={this.checkForChange}>
        <Grid fluid className="container__seven--holder">
          {this.renderAllFields()}
        </Grid>
     </Formsy.Form>
    </div>
  )
}

checkForChange() 从表单获取值并设置更新状态:

this.setState(updatedState);

我认为问题在于每次更改都会更新。即使我移动鼠标,它也会不断更新。

【问题讨论】:

  • 你能添加代码你在哪里打电话renderAllFields()
  • 请一分钟,编辑。
  • @SvenWritesCode,已更新,请查看上方。
  • 我尝试重新创建您的课程here,它似乎没有出错。这似乎是onChange 函数和setState 不断相互触发。我将从删除checkForChange() 中的setState 调用开始,看看它是否继续发生。
  • @SvenWritesCode,要不要继续聊天,真的很棘手?

标签: javascript html reactjs react-lifecycle


【解决方案1】:

由于您没有分享足够的信息或完整的组件代码,我怀疑可能是以下原因

改变

   <Formsy.Form
     ref="form"
     onChange={this.checkForChange}>
    <Grid fluid className="container__seven--holder">
      {this.renderAllFields()}
    </Grid>
 </Formsy.Form>

如果您期望 checkForChange 函数发生事件,则以下解决方案将起作用

    <Formsy.Form
     ref="form"
     onChange={e => this.checkForChange(e)}>
    <Grid fluid className="container__seven--holder">
      {this.renderAllFields()}
    </Grid>
 </Formsy.Form>

如果您不希望 checkForChange 函数发生事件,则以下解决方案将起作用

    <Formsy.Form
     ref="form"
     onChange={() => this.checkForChange()}>
    <Grid fluid className="container__seven--holder">
      {this.renderAllFields()}
    </Grid>
   </Formsy.Form>

【讨论】:

  • 谢谢,需要解释一下吗?
  • 如果你不使用 () => 那么在没有用户操作的情况下,该函数在每次渲染时都会被调用,并且该函数会设置状态,这意味着 onChange 在每次渲染时都会被调用。要控制这种行为,您需要像我在回答中解释的那样使其成为箭头方式
  • 没有帮助.. 想继续聊天吗?
猜你喜欢
  • 2022-01-25
  • 2018-01-24
  • 2014-08-01
  • 2015-10-28
  • 2013-05-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多