reactjs - 为什么抛出错误的 React 组件会渲染两次?

标签 reactjs

我一直在尝试使用react-cache风格的组件,并在渲染方法中直接调用Web服务,向React.Suspense组件抛出一个 promise ,并在数据存在时重新渲染。他们调用 Web 服务,检查响应,然后根据响应呈现或抛出错误,直至达到错误边界。我注意到,每当组件中抛出错误时,它都会呈现两次。第一次调用堆栈看起来正常,第二次调用堆栈包含对 invokeGuardedCallbackDev 和 invokeGuardedCallback 的调用,这似乎与 React 有关,确保即使在开发构建中被错误边界“捕获”时,错误也会出现在控制台中.

我可以通过react和react-dom 16.8.6重现这个,只需渲染一个像这样的组件:https://codesandbox.io/s/components-that-throw-render-twice-i26qc .

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

最佳答案

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

查看version history ,似乎修复了一些与 React 中的错误处理相关的错误,因此这次重新渲染似乎是针对其中一个错误的解决方法的结果。

但是,这对于您的应用程序来说应该不是问题,因为 React 应用程序中的渲染函数应该是纯的(无副作用)。所以基本上,React 可以随时调用你的渲染函数。

要解决此问题,您应该避免依赖不重新渲染的组件,而应使用效果钩子(Hook)或类似的方法,仅在某些 Prop /状态更改时才获取。

来源:https://github.com/facebook/react/issues/16130#issuecomment-521637592

关于reactjs - 为什么抛出错误的 React 组件会渲染两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57717298/

相关文章:

javascript - 如何通过 this.props.children() 而不是 this.props.children 传递 props

javascript - 列表中的每个 child 都应该有唯一的 'key' prop

reactjs - 如何使用axios获取redux中的api项?

reactjs - 如何将我的 native 应用程序连接到蓝牙打印机

reactjs - Material-ui Typography with router link always underlined

javascript - root id 中没有呈现任何内容

javascript - React Native slider onValueChange 调用 setState 使 slider 滞后

javascript - 在 React 中单击选项卡时如何使选项卡处于事件状态

javascript - 以字符串形式返回 React 的方法 'return'

reactjs - 用 "Actions"或 "other text"覆盖 Material 表头上的文本 "icon"