默认情况下,若一个组件在渲染期间(render)发生错误,则会导致整个组件树被全部卸载(看不到整个页面)
所以,有时需要对其进行特殊处理。因为没必要因为一个特别小的组件的错误而导致整个页面不可见
错误边界:本质上,就是一个组件,该组件会捕获到 渲染期间(render)子组件 发生的错误,并有能力阻止错误继续向上层组件传播
如何让某个组件捕获错误
- 给 ErrorBound 组件编写生命周期函数 static getDerivedStateFromError
- 静态函数
- 该函数的运行时间点:渲染子组件过程中,发生错误之后,在更新到页面之前
- 注意:只有子组件发生错误时,才会运行该函数
- 该函数得返回一个对象,React会将该对象的属性覆盖掉当前组件的state的属性
- 该函数的参数是一个错误对象
- 通常,在该函数中改变状态
- 给 ErrorBound 组件编写生命周期函数 componentDidCatch
- 实例方法
- 该函数的运行时间点:渲染子组件的过程中,子组件发生错误,在页面更新完之后,由于其运行时间点比较靠后,因此不太会在该函数中改变状态
- 通常,该函数用于记录错误消息 ```jsx import React, { Component } from ‘react’
export default class ErrorBound extends Component {
state = {
hasError: false,
}
static getDerivedStateFromError(error){
console.error('发生错误了', error);
return {
hasError: true,
}
}
// componentDidCatch(error, info){
// console.error('发生错误了', error);
// console.dir('记录错误信息: ', info);
// this.setState({
// hasError: true,
// })
// }
render() {
if(this.state.hasError){
return <h1>该部分组件出现错误了!</h1>
}
return this.props.children
}
}
```
细节
某些错误,错误边界组件无法捕获,即那俩函数不会运行
- 错误边界组件自身的错误
- 异步中的错误
- 事件中的错误
因为除了第一种,都不是在渲染期间的错误,所以得老老实实用try-catch处理
总结
ErrorBound只处理渲染期间子组件发生的同步错误