我最近试用了React的错误边界。根据react-的文档
错误边界的粒度取决于您。您可以包装顶级路由组件,以向用户显示"出现问题"消息,就像服务器端框架经常处理崩溃一样。您还可以将单个窗口小部件封装在错误边界中,以保护它们不破坏应用程序的其余部分。
封装顶级路由很好,可以解决我的目的,但一个组件的中断会使其他正常工作的组件变得无用,并用错误边界的回退UI替换所有组件。
例如,我有一个顶级路由组件<Component1 />
并且它呈现了另外四个子分量——<Component2 />
<Component3 />
<Component4 />
<Component5 />
现在,我的子组件有条件渲染,如果我想单独使用错误边界,我需要用错误边界包装所有的条件渲染。我不喜欢。
我还有一个问题:错误边界是否捕获了像ComponentDidMount
这样的(子组件的(生命周期挂钩中引起的错误?
例如
cont Component1 = () => {
return (
<ErrorBoundary>
<Component2 />
<Component3 />
<Component4 />
<Component5 />
</ErrorBoundary>
)
}
这个ErrorBoundary
是否捕获了像Component2
的componentDidMount这样的生命周期挂钩中的错误?
就像您引用的文本一样,如果您想呈现所有"工作"的子组件,但用回退替换不工作的子组件时,您需要用错误边界包裹每个子组件。对此没有真正的解决办法。也许可以使用更方便的模式,例如渲染道具或高阶组件,但效果是一样的。
放置"错误边界"的"理想位置"取决于如果分支失败,您希望回退渲染在组件树中的何处启动。也许你有一个对整个应用程序非常关键的组件——在这种情况下,也许只有一个顶级错误边界就足够了,因为渲染其余部分毫无意义。也许你有一个不那么重要的组件-在这种情况下,将其封装在错误边界中,因为应用程序的其他部分应该可以工作,即使没有它
错误边界是否捕获(子组件的(生命周期挂钩(如
ComponentDidMount
(中引起的错误?
是。顶级错误边界将捕获由子组件生成的错误,但整个Component1
渲染将替换为回退渲染。
错误边界只捕捉通过React的生命周期方法(如componentDidMount
(触发的错误,包括render
方法。错误边界不会捕捉事件处理程序或任何异步代码(如fetch
(内部触发的错误。