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


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

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

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

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

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

    什么是异常边界?

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

    异常边界如何实现

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

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

    1. class ErrorWrapper extends React.Component {
    2. constructor(props) {
    3. super(props);
    4. this.state = {
    5. hasError: false,
    6. };
    7. }
    8. static getDerivedStateFromError(error) {
    9. return {
    10. hasError: true,
    11. };
    12. }
    13. componentDidCatch(error, errorInfo) {
    14. // 一些错误上报的操作
    15. // ......
    16. }
    17. render() {
    18. if (this.state.hasError) {
    19. return (
    20. <Result
    21. status="error"
    22. title="哇哦,出现了错误"
    23. subTitle="请联系管理员"
    24. >Result>
    25. );
    26. }
    27. return this.props.children;
    28. }
    29. }
    30. export default ErrorWrapper;
    怎么使用异常组件

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

    1. // 定义一个需要渲染的组件
    2. const Child = () => {
    3. return <div>子组件div>
    4. }
    5. const Child2 = () => {
    6. return <div>子组件2div>
    7. }
    8. // 在父页面使用异常边界组件包裹该子组件
    9. const Parent = () => {
    10. return <>
    11. <ErrorWrapper><Child />ErrorWrapper>
    12. <ErrorWrapper><Child2 />ErrorWrapper>
    13. }

    有哪些限制

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

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

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

  • 相关阅读:
    从Qt源码看event/event handler/eventFilter
    微服务学习|初识Docker、使用Docker、自定义镜像、DockerCompose、Docker镜像仓库
    Python:实现lorenz transformation 洛伦兹变换算法(附完整源码)
    浅识java多线程
    leetcode每天5题-Day20
    安科瑞基于物联网技术的基站能耗监控解决方案-Susie 周
    如何在 Windows 10 中安装 Azure Data Studio 1.39.1
    MDPI论文投稿全流程实例讲解
    为什么大家想要晋升职称?工程师职称有什么用?
    模拟退火算法
  • 原文地址:https://blog.csdn.net/qq_37268201/article/details/139319505