问题中的大部分陈述是正确的。目前,错误边界在SSR中不受支持,getDerivedStateFromError
和componentDidCatch
不会影响服务器端。
它们是否都捕获相同类型的错误?还是每个生命周期将捕获不同的错误?
它们捕获相同的错误,但在不同的阶段。之前只能使用componentDidCatch
实现:
static getDerivedStateFromError() {
return { hasError: true };
}
和
componentDidCatch() {
this.setState({ hasError: true });
}
做同样的事情,componentDidCatch
在支持异步渲染的ReactDOMServer
被添加之前,在服务器端将没有机会得到支持。
我应该总是同时使用它们(可能在同一个“错误捕获”组件中)吗?
您可以同时使用它们。 文档中的示例显示:
class ErrorBoundary extends React.Component {
state = { hasError: false };
static getDerivedStateFromError(error) {
return { hasError: true };
}
componentDidCatch(error, info) {
logComponentStackToMyService(info.componentStack);
}
render() {
if (this.state.hasError) {
return <h1>Something went wrong.</h1>;
}
return this.props.children;
}
}
在这种情况下,它们之间的责任被分开。
getDerivedStateFromError
只做它擅长的事情,即在发生错误时更新状态,而
componentDidCatch
提供副作用并且在需要时可以访问此组件实例的
this
。
"使用 componentDidCatch 进行错误恢复不是最佳选择,因为它强制回退 UI 始终同步呈现" 那有什么问题吗?
新的 React 发布旨在异步渲染,这更有效率。正如在
评论中提到的那样,同步渲染对于回退 UI 来说不是一个大问题,因为它可以被视为边缘情况。
getDerivedStateFromError
在服务器端渲染期间不会被调用。我已经在React 16.4和16.7中进行了测试。React文档https://reactjs.org/docs/error-boundaries.html指出:“错误边界不会捕获...服务器端渲染的错误”。 - Overlook MotelcomponentDidCatch
? - JonathangetDerivedStateFromError
是静态的吗?如果状态不是静态的,它如何能够返回新的状态?非静态字段不能被静态方法访问,对吗? - steak_Overcooked