首页 > 其他分享 >Error Boundary实现原理

Error Boundary实现原理

时间:2024-08-16 17:49:44浏览次数:14  
标签:update callback Error 原理 Boundary 执行 方法

Error Boundary的定义

Error Boundary是一种组件,或者说是类组件。它需要定义 getDerivedStateFromError 或者 componentDidCatch 生命周期方法。
它自身有三种功能:

  • 捕获渲染期间的错误
  • 打印这些错误
  • 降级展示UI

Error Boundary捕获错误的原理

React的工作流程分为render阶段和commi阶段。所以React需要分别捕获这两个阶段抛出的错误。

在render阶段的入口函数中,renderRootSync和renderRootConcurrent在分别调用workLoopSync和WorkLoopConcurrent方法时都会通过tryCatch语句进行包裹。
这样就能捕获同步执行render阶段和commit阶段抛出的错误了。

捕获render阶段错误的方法叫handleError,捕获commit阶段错误的方法叫captureCommitPhaseError。

不管是handleError还是captureCommitPhaseError,都会从当前发生错误的节点的父节点开始向上遍历,找到最近的Error Boundary。

找到Error Boundary后会做两件事:构建callback 和 执行callback。

构建callback

通过createClassErrorUpdate方法会创建update对象,然后针对

  • 定义getDerivedStateFromError方法,将update.payload属性赋值为匿名函数,在匿名函数中会执行getDerivedStateFromError这个方法。再将update.callback属性复制为一个匿名函数,在函数中会执行logCapturedError方法抛出React的提示信息、
  • 定义componentDidCatch方法,将update.callback属性赋值为匿名函数,在匿名函数中将执行logCapturedError抛出React的提示信息,并将错误信息和栈信息作为参数执行componentDidCatch生命周期函数

如果没有找到Error Boundary,将遍历到根节点,在根节点构建callback。创建update对象,然后赋值update.callback属性为匿名函数,在函数中执行onUncaughtError方法抛出未捕获的错误,和执行logCapturedError抛出React的提示信息。

执行callback

在render阶段的beginWork方法中执行processUpdateQueue将计算这些update,主要是执行保存在update.payload的匿名函数,间接执行getDerivedStateFromError方法将返回值合并到this.state中。

并将构造的回调函数update.callback都保存在fiber.updateQueue.effects数组中。

在commit阶段的layout阶段,执行commitUpdateQueue方法依次执行fiber.updateQueue.effects中保存的callback。在此时将执行上述构造的各个回调函数。

包括:getDerivedStateFromError构造的logCapturedError、componentDidCatch构造的logCapturedError和componentDidCatch,根节点构造的onUncaughtError和logCapturedError。

降级展示UI

在handleError方法中会先调用throwException方法。在throwException方法中对于ClassComponent类型的组件会执行 workInProgress.flags |= ShouldCapture,然后创建update (和构造callback的update逻辑一致),然后将update插入到workInProgress fiber.updateQueue中构成单向环状链表。

执行完throwException方法后会执行completeUnitOfWork方法,在completeUniOfWork方法中会执行unwindWork方法。unwindWork方法会针对包含ShouldCapture的workInProgress fiber节点(即在throwException方法中赋值)再执行 workInProgress.flags = (flags & ~ShouldCapture) | DidCapture(意思就是把ShouldCapture从flags中删除再合并DidCapture)。然后返回 workInProgress。

因为整个 try catch 语句被包裹在do while循环中,所以会再次执行workLoopConcurrent方法再开始执行beginWork方法。首先会根据ClassComponent执行updateClassComponent。调用processUpdateQueue计算update(即getDerivedStateFromError方法拿到返回的结果)得到最新的state(将结果合并到this.state)然后执行finishClassComponent方法执行this.render方法。直到最后执行完commit阶段就会页面上展示降级后的UI。

总结

捕获渲染期间的错误 是通过 handError 方法结合 try catch语句实现的。
打印这些错误 是通过 logCapturedError 方法和 componentDidCatch 生命周期函数实现的。
降级展示UI 是通过getDerivedStateFromError实现的。

标签:update,callback,Error,原理,Boundary,执行,方法
From: https://www.cnblogs.com/rocenjs/p/18359452

相关文章

  • 【A GUIDE TO CRC ERROR DETECTION ALGORITHM】 (译文3-Todo)
    11."Reflected"Table-DrivenImplementations“反射”表驱动实现Despitethefactthattheabovecodeisprobablyoptimizedaboutasmuchasitcouldbe,thisdidnotstopsomeenterprisingindividualsfrommakingthingsevenmorecomplicated.Toundersta......
  • CRC算法原理、推导及实现
    CRC,CyclicRedundancyCheck,循环冗余校验1.基本原理CRC的本质是除法,把待检验的数据当作一个很大(很长)的被除数,两边选定一个除数(有的文献叫poly),最后得到的余数就是CRC的校验值。判定方法:将消息和校验和分开。计算消息的校验和(在附加W个零后),并比较两个校验和。把校验......
  • InstructGPT: Training language models to follow instructions with human feedback
    文章目录1.InstructGPT目标2.数据集2.1SFT数据集2.2RM数据集2.3PPO数据集3.训练细节3.1SFT训练3.2RM训练3.3RLHF训练4.结论1.InstructGPT目标InstructGPT探讨了如何通过人类反馈来训练语言模型以更好地遵循用户的意图。通过对模型进行监督学习和强化......
  • 深入探讨核密度估计(KDE):从原理到应用
    在数据分析中,理解数据分布是一个重要的步骤。传统的直方图虽然简单直观,但其依赖于bin的划分,可能会对数据分布产生偏差。核密度估计(KDE)作为一种非参数方法,可以更平滑、更准确地估计数据的概率密度函数(PDF)。本文将深入探讨KDE的原理、实现方法以及其在实际中的应用,帮助你更......
  • eureka-client注册exception——Error creating bean with name ‘scopedTarget.eurek
    错误没有截图,不过去看idea内置的日志可以看到“Errorcreatingbeanwithname‘scopedTarget.eurekaClient‘definedinclass……”或者“ErrorstartingApplicationContext.Todisplaytheconditionsreportre-run...”或者Errorprocessingconditiononorg.sprin......
  • redis启动失败报错:Job for redis.service failed because the control process exited
    问题描述启动报错如下:查看redis的启动信息:systemctlstatusredis.service或journalctl-xe由提示可以看不是配置文件,内存等原因造成的。解决方案原因:linux的一个安全子系统(SELinux)阻止了服务的启动。查看SELinux的工作模式cat /etc/selinux/configSELinu......
  • 你真的懂Mybatis分页原理吗?
    目录一、Mybatis如何实现分页?1.1在SQL中添加limit语句1.2基于PageHelper分页插件,实现分页1.3 基于RowBounds实现分页1.4基于MyBatis-Plus实现分页二、RowBounds的分页原理三、PageHelper的分页原理四、Mybatis-Plus的分页原理五、Mybatis-Plus实现分页5.1添加分......
  • PD快充协议芯片原理
    PD诱骗芯片的原理工作如下:当设备插入type-C接口时,芯片会自动检测接入电压和电流,并根据设备的实际需求调整输出电压和电流,这使得小家电设备能够实现多种充电方式的管理,如9V、12V、15V、20V等,从而确保设备能够达到最佳充电的体验。这种芯片通过内置的通讯模块与供电端进行握手通......
  • pd协议的工作原理和应用
    PD协议通过type-C接口的CC线进行通信,协商电压、电流及供电方向。通信过程需要按照特定的数据包格式进行,存在相互认证的过程,当电缆接通后PD协议的SOP通信在CC线上进行从此来选择电源传输的规格。PD协议的优势在于其通用性和智能控制方式,使得一个充电器可以配置多个设备。XSP08Q......
  • 混合策略改进的蜣螂算法(IDBO)优化长短期记忆神经网络原理及matlab代码
    目录0引言1数学模型2模型对比3matlab代码3.1改进的主代码3.2IDBO-LSTM4视频讲解0引言针对DBO算法全局探索能力不足、易陷入局部最优以及收敛精度不理想等问题,多为学者提出了混合多策略改进的蜣螂优化算法(IDBO)。主要混合策略改进首先是采用混沌映射结合随机反......