为什么Hook没有ErrorBoundary?

为什么Hook没有ErrorBoundary?插图亿华云

大家好,我卡颂。

在很多全面使用Hooks开发的团队,唯一使用ClassComponent的场景就是「使用ClassComponent创建ErrorBoundary」。

可以说,如果Hooks存在如下两个生命周期函数的替代品,就能全面抛弃ClassComponent了:

getDerivedStateFromErrorcomponentDidCatch

那为什么还没有对标的Hook呢?

今天我们从上述两个生命周期函数的实现原理,以及要移植到Hook上需要付出的成本来谈论这个问题。

ErrorBoundary实现原理

ErrorBoundary可以捕获子孙组件中「React工作流程」内的错误。

「React工作流程」指:

render阶段,即「组件render」、「Diff算法」发生的阶段。commit阶段,即「渲染DOM」、「componentDidMount/Update执行」的阶段。

这也是为什么「事件回调中发生的错误」无法被ErrorBoundary捕获 —— 事件回调并不属于「React工作流程」。

如何捕获错误

「render阶段」的整体执行流程如下:

do {

try {

// render阶段具体的执行流程

workLoop();

break;

} catch (thrownValue) {

handleError(root, thrownValue);

}

} while (true);

可以发现,如果「render阶段」发生错误,会被捕获并执行handleError方法。

类似的,「commit阶段」的整体执行流程如下:

try {

// ...具体执行流程

} catch (error) {

captureCommitPhaseError(current, nearestMountedAncestor, error);

}

如果「commit阶段」发生错误,会被捕获并执行captureCommitPhaseError方法。getDerivedStateFromError原理。

捕获后的错误如何处理呢?

我们知道,ClassComponent中this.setState第一个参数,除了可以接收「新的状态」,也能接收「改变状态的函数」作为参数:

// 可以这样

this.setState(this.state.num 1)

// 也可以这样

this.setState(num =

THE END
Copyright © 2024 亿华云