当前位置: 首页 > 面试题库 >

React中的“无法在现有状态转换期间更新”错误

狄河
2023-03-14
问题内容

我正在尝试执行本ReactJS教程的第15步:对只了解足够的jQuery的人们的React.js简介

作者建议以下内容:

overflowAlert: function() {
  if (this.remainingCharacters() < 0) {
    return (
      <div className="alert alert-warning">
        <strong>Oops! Too Long:</strong>
      </div>
    );
  } else {
    return "";
  }
},

render() {
  ...

  { this.overflowAlert() }

  ...
}

我尝试执行以下操作(对我来说似乎不错):

// initialized "warnText" inside "getInitialState"


overflowAlert: function() {
  if (this.remainingCharacters() < 0) {
    this.setState({ warnText: "Oops! Too Long:" });
  } else {
    this.setState({ warnText: "" });
  }
},

render() {
  ...

  { this.overflowAlert() }
  <div>{this.state.warnText}</div>

  ...
}

而且我在Chrome开发者工具的控制台中收到以下错误:

在现有状态转换期间(例如在内部render或另一个组件的构造函数中)无法更新。渲染方法应该纯粹是道具和状态的函数;构造函数的副作用是反模式,但可以移至componentWillMount

这是一个JSbin演示。为什么我的解决方案不起作用,该错误是什么意思?


问题答案:

您的解决方案不起作用,因为从逻辑上讲没有意义。您收到的错误可能有点含糊,所以让我分解一下。第一行指出:

在现有状态转换期间(例如在渲染或另一个组件的构造函数中)无法更新。

每当React
Component的状态更新时,该组件都会重新呈现到DOM。在这种情况下,会出现错误,因为您尝试在overflowAlert内部调用render,即调用setState。这意味着您尝试更新渲染中的状态,然后将调用渲染overflowAlert并更新状态并再次调用渲染,等等,从而导致无限循环。该错误告诉您由于首先要更新状态而导致尝试更新状态,从而导致循环。这就是为什么不允许这样做的原因。

相反,请采取另一种方法并记住您要完成的工作。您是否要在用户输入文本时向用户发出警告?如果是这样,请将其设置overflowAlert为输入的事件处理程序。这样,当输入事件发生时,状态将被更新,并且组件将被重新呈现。



 类似资料:
  • 在我的渲染返回()我有这些: 这个功能是什么: ^我现在必须注释掉setState,否则我会得到上面发布的错误,应用程序会崩溃。 我的构造器中有:

  • 无法在现有状态转换期间更新(例如在“呈现”中)。呈现方法应该是道具和状态的纯函数。 我如何修复这种情况,使它将加载项目,并单击链接将重新呈现表单?

  • 当我试图插入一个新的食谱元素时,我的项目总是崩溃。我使用在能够根据需要更新食谱(例如删除,编辑等)。 如果我将语句切换到,我可以插入元素而没有问题,但是由于删除,我无法删除触发状态更改,并需要状态更改来反映更新而不是道具。有人对这个问题有什么建议吗?谢谢! 配方列表: 配方容器: 配方表:

  • 我已经创建了以下代码,但是我经常得到以下错误(很多)。看起来应用程序进入了一个循环: 下面是我使用的代码:

  • 我正在开发一个简单的待办事项列表反应应用程序(新的React.js)。我已经将项目添加到工作列表中,但删除项目会引起一个问题。在我的父反应组件中,我有以下代码: 我的组件: 运行此代码将带来: 警告:setState(...):无法在现有状态转换期间更新 问题: 为什么的渲染在添加项时立即执行回调,即: 但是,添加以删除Callback ie。

  • 将此添加到函数组件并报告错误:警告:无法在现有状态转换期间更新(例如在内)。渲染方法应该是道具和状态的纯粹功能。