问题中的陈述大部分是正确的。目前 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 不是一个大问题,因为它可以被视为边缘情况。