场景:当前端项目报错时返回统一当错误页面,防止页面崩溃。
涉及到的生命周期:getDerivedStateFromError
,componentDidCatch
getDerivedStateFromError
React 16引入了Error Boundaries
来处理React渲染中抛出的错误。我们已经有了componentDidCatch
生命周期方法,在发生错误后会被触发。它非常适合将错误记录到服务器。现在您可以通过getDerivedStateFromError
的调用向用户显示不同的UI 。
例子:
class ErrorBoundary extends React.Component {
constructor(props) {
super(props);
this.state = { hasError: false };
}
static getDerivedStateFromError(error) {
// 更新异常
return { hasError: true };
}
render() {
if (this.state.hasError) {
return <h1>Something went wrong.</h1>;
}
return this.props.children;
}
}
import React, { ReactChildren, useEffect, useState } from 'react';
import ErrorBoundary from '@/layouts/components/ErrorBoundary';
const BasicLayout = (props: Props) => {
return (
<ErrorBoundary>
<Layout>
// ....
</Layout>
</ErrorBoundary>
);
};
export default BasicLayout;
componentDidCatch
React 16 将提供一个内置函数 componentDidCatch
,如果 render()
函数抛出错误,则会触发该函数。
错误在渲染阶段中被捕获,但在事件处理程序中不会被捕获。
class PotentialError extends React.Component {
constructor(props) {
super(props);
this.state = { error: false };
}
componentDidCatch(error, info) {
this.setState({ error, info });
}
render() {
if (this.state.error) {
return <h1>Error: {this.state.error.toString()}</h1>;
}
return this.props.children;
}
}
参考:
React V16 错误处理(componentDidCatch 示例)
React16.6 正式发布,等了一年的Suspense终于来了!