面试题答案
一键面试React确定捕获错误的错误边界的过程
- 错误传播路径:当子组件抛出错误时,React会沿着组件树向上查找最近的定义了
componentDidCatch
生命周期方法的组件,该组件就是负责捕获错误的错误边界。 - 多层嵌套情况:如果存在多层嵌套的错误边界,错误会被最近的上层错误边界捕获。例如,在组件树
A -> B -> C
中,如果C
抛出错误,且B
和A
都是错误边界,那么B
会捕获该错误,因为B
距离C
更近。
举例及处理
- 简单嵌套示例:
在这个例子中,class ErrorBoundaryB extends React.Component { componentDidCatch(error, errorInfo) { console.log('Error caught by ErrorBoundaryB:', error, errorInfo); } render() { return this.props.children; } } class ErrorBoundaryA extends React.Component { componentDidCatch(error, errorInfo) { console.log('Error caught by ErrorBoundaryA:', error, errorInfo); } render() { return ( <div> <ErrorBoundaryB> <ChildComponent /> </ErrorBoundaryB> </div> ); } } class ChildComponent extends React.Component { render() { throw new Error('Simulated error'); } } ReactDOM.render(<ErrorBoundaryA />, document.getElementById('root'));
ChildComponent
抛出错误,由于ErrorBoundaryB
是最近的错误边界,所以ErrorBoundaryB
会捕获该错误,ErrorBoundaryA
不会捕获到。 - 处理情况:错误边界捕获错误后,可以进行日志记录(如上述例子中的
console.log
),还可以渲染备用UI。例如:
这样,当子组件抛出错误时,错误边界会渲染一个提示错误发生的备用UI。class ErrorBoundary extends React.Component { constructor(props) { super(props); this.state = { hasError: false }; } componentDidCatch(error, errorInfo) { console.log('Error caught:', error, errorInfo); this.setState({ hasError: true }); } render() { if (this.state.hasError) { return <div>An error occurred.</div>; } return this.props.children; } }