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

为什么抛出错误的React组件会呈现两次?

段干跃
2023-03-14

我一直在尝试一些组件,这些组件执行react-cache风格的事情,并在render方法中执行web服务调用,将promise抛出到React.Suspense组件,并在数据存在时重新呈现。它们调用web服务,检查响应,并根据响应呈现或抛出错误到错误边界。我注意到,每当在组件中抛出错误时,它都会呈现两次。第一次callstack看起来正常,第二次callstack包括对invokeGuardedCallbackDev和invokeGuardedCallback的调用,这似乎与React有关,即使在开发版本中被错误边界“捕获”,也要确保错误出现在控制台中。

我可以用react和React-DOM16.8.6复制这个内容,只需呈现如下组件:https://codesandbox.io/s/components-that-throw-render-twice-i26qc。

我想知道为什么会发生这种情况,因为它导致组件从web服务中重新获取数据,重新抛出另一个promise,并导致控制台中出现“未捕获的promise”错误。

共有1个答案

李俭
2023-03-14

这似乎是由react/react-dom中最近的一个变化引起的。如果将两者都恢复到版本16.0.0,您将看到它只呈现组件一次。参见:https://codesandbox.io/s/components-that-throw-render-twice-03fdb

查看版本历史,在React中似乎修复了几个与错误处理有关的bug,因此重新呈现似乎是针对其中一个bug的变通方法的结果。

然而,这对你的应用程序来说不应该是一个问题,因为在React应用程序中渲染功能应该是纯粹的(没有副作用)。所以基本上,React可以在任何需要/需要的时候调用渲染函数。

 类似资料:
  • 我使用的是React v.16.12.0和@MaterialUI/Core v4.8.1。 我正在尝试为React传单标记创建自定义图标。图标是来自Material-UI的组件。为此,我需要将HTML字符串传递给(DivIcon Docs)传单组件,因此我使用方法从。 它会抛出一个错误: 警告:UseLayouteFffect在服务器上不执行任何操作,因为它的效果无法编码为服务器呈现器的输出格式。

  • 错误:第 1 行的解析错误:函数搜索(sour ^ 期望“字符串”、“数字”、“空”、“真”、“假”、“{”、“[”,得到“未定义” 代码:

  • 我实现了以下REST调用: 也是一个提供和使用application/x-protobuf的提供者类: 我的pom。xml看起来像: 我的小部件。原型: 选项java_package=“example”;选项java\u outer\u classname=“WidgetsProtoc”; 对于http://localhost:8080/RESTfulExample/widgets我得到以下错误消

  • 问题内容: 我已经阅读了 为什么在尝试在数据库中加载Blob时会出现java.lang.AbstractMethodError?,下载了我能找到的所有11g jdbc驱动程序,并将它们作为库和/或jar文件添加到了我的NetBeans应用程序中。我仍然不断收到相同的AbstractMethodError,这让我很生气!任何指导将不胜感激! 错误信息: 问题答案: 问题的原因是软件不兼容(jar文件

  • 问题内容: 以下是JSX中我的render方法的一部分-为什么在抛出错误后分号为何?在普通的JavaScript中完全可以 问题答案: 这是因为JSX 表达式仅限于单个表达式。 ..将引发错误。 但是,您可以通过使用两个表达式来解决此问题 如果只有一个表达式,则不需要分号。 如果您希望对此有所了解,可以在返回以逗号分隔的最后一个表达式之前,在表达式中使用鲜为人知的逗号运算符进行一些本地工作: 将显

  • react class组件在componentDidMount中调用初始化接口,有些时候会调用两次,通过断点发现顺序是componentDidMount->componentWillUnmount->componentDidMount,但不能稳定复现,调用的组件是页面的主入口,并非某个组件的子组件,请问有知道这个问题的么?