当前位置: 首页 > news >正文

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

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

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

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

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

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

什么是异常边界?

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

异常边界如何实现

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

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

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 (<Resultstatus="error"title="哇哦,出现了错误"subTitle="请联系管理员"></Result>);}return this.props.children;}
}export default ErrorWrapper;
怎么使用异常组件

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

// 定义一个需要渲染的组件
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自身报错了,也不能被捕获

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

相关文章:

  • 智狐联创-AI知识库:AI数字化转型的领航者
  • 【linux深入剖析】进程间通信
  • Spark 核心编程之 RDD 介绍
  • 独家首发 | 基于 KAN、KAN卷积的轴承故障诊断模型
  • 【SpringMVC】_简单示例计算器
  • PMP认证与NPDP认证哪个含金量高?
  • Redis 和 Mysql 如何保证两者数据一致性
  • Android下HWC以及drm_hwcomposer普法(下)
  • 2024盘古石初赛(服务器部分)
  • 前后端联调小细节
  • Go 如何通过 Kafka 客户端库 生产与消费消息
  • 2023年西安交通大学校赛(E-雪中楼)
  • 【深度学习】YOLOv10实战:20行代码将笔记本摄像头改装成目标检测监控
  • 实现样式一键切换
  • 超融合架构下,虚拟机高可用机制如何构建?
  • ➹使用webpack配置多页面应用(MPA)
  • Angularjs之国际化
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • github从入门到放弃(1)
  • Hexo+码云+git快速搭建免费的静态Blog
  • HTTP中的ETag在移动客户端的应用
  • Java方法详解
  • Java教程_软件开发基础
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • Linux快速复制或删除大量小文件
  • mongo索引构建
  • pdf文件如何在线转换为jpg图片
  • PermissionScope Swift4 兼容问题
  • PHP变量
  • Python连接Oracle
  • spring boot 整合mybatis 无法输出sql的问题
  • vue脚手架vue-cli
  • 将回调地狱按在地上摩擦的Promise
  • 微信小程序--------语音识别(前端自己也能玩)
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • 学习使用ExpressJS 4.0中的新Router
  • python最赚钱的4个方向,你最心动的是哪个?
  • 阿里云服务器购买完整流程
  • ​LeetCode解法汇总518. 零钱兑换 II
  • #git 撤消对文件的更改
  • #if和#ifdef区别
  • #NOIP 2014# day.2 T2 寻找道路
  • #pragma 指令
  • $.each()与$(selector).each()
  • (Git) gitignore基础使用
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (转)甲方乙方——赵民谈找工作
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • ****三次握手和四次挥手
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • .net core 的缓存方案
  • .Net 高效开发之不可错过的实用工具
  • .NET/C# 使用 SpanT 为字符串处理提升性能