【React篇】组件错误边界处理(组件错误引起的页面白屏)

我们知道在生产环境react错误会导致整个页面崩溃,显示为空白页面。

比如下图的错误,导致了左侧页面直接白屏:

由于某一个组件报错导致整个页面崩溃是很严重的问题,那么我们应该如何去降低代码报错带来的影响呢?

我们希望当页面的某一个组件发生报错时,不要影响到其他组件的显示,比如像下图所示的这种模式 。

通过上图可以看到,某一个组件报错了,但是页面的其他内容还是可以正常显示出来的,并没有受到影响。而实现这种效果就需要使用到异常边界了。

什么是异常边界?

异常边界是React 16以后推出的新特性,使用异常组件可以捕获子组件js的错误,并可以展示备用UI的class组件。

异常边界如何实现

下面代码实现了一个简单的异常边界组件,需要注意的是,异常边界组件必须使用class组件,不能使用函数式组件。

下面咱们举个例子封装一个异常边界组件:

javascript 复制代码
class ErrorWrapper extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      hasError: false,
    };
  }

  static getDerivedStateFromError(error) {
    return {
      hasError: true,
    };
  }

  componentDidCatch(error, errorInfo) {
    // 一些错误上报的操作
    // ......
  }

  render() {
    if (this.state.hasError) {
      return (
        <Result
          status="error"
          title="哇哦,出现了错误"
          subTitle="请联系管理员"
        ></Result>
      );
    }
    return this.props.children;
  }
}

export default ErrorWrapper;
怎么使用异常组件

只需要将组件作为ErrorWrapper的子组件来使用就可以了,如下代码:

javascript 复制代码
// 定义一个需要渲染的组件
const Child = () => {
  return <div>子组件</div>
}
const Child2 = () => {
  return <div>子组件2</div>
}


// 在父页面使用异常边界组件包裹该子组件
const Parent = () => {
  return <>
    <ErrorWrapper><Child /></ErrorWrapper>
    <ErrorWrapper><Child2 /></ErrorWrapper>
  </>
} 

有哪些限制

虽然异常捕获可以捕获子组件的错误,但是它还是存在一些限制,比如:

  1. 事件里面的报错
  2. 捕获不了异步代码(比如setTimeout,Promise)中的异常
  3. 捕获不了服务端渲染的错误
  4. 假如异常边界组件ErrorWrapper自身报错了,也不能被捕获

请大家根据自身业务需求选择性使用。

相关推荐
kyriewen12 小时前
我手写了一个 EventEmitter,面试官追问了 6 个问题——第 4 个我没答上来
前端·javascript·面试
IT_陈寒12 小时前
Java的Date类又坑了我一次,改用时间戳真香
前端·人工智能·后端
山河木马12 小时前
矩阵专题2-怎么创建视图矩阵(uViewMatrix)
javascript·webgl·计算机图形学
小林攻城狮12 小时前
使用 Transport 节流解决 Vercel AI SDK 流式渲染卡死问题
前端·react.js
前端缘梦13 小时前
告别 TS 运行时类型漏洞!Zod 完整入门实战教程(前端 / 全栈必备)
前端·react.js·全栈
the_answer13 小时前
Webpack vs Vite 深度对比分析
前端·webpack
转转技术团队13 小时前
验证码识别实战:前端不写页面,改训模型了?
前端
MomentYY13 小时前
Temperature:AI 的“脑洞旋钮”
前端·llm·ai编程
远航_13 小时前
OpenSpec 完整详细介绍
前端·后端
召钱熏14 小时前
状态枚举正确≠渲染正确:一个语音按钮的状态机边界修复实录
android·前端