错误边界的简介

  1. React v16 中引入了错误边界,错误边界是一个组件,该组件会捕获到渲染期间 (render) 子组件发生的错误,并有能力阻止错误继续传播;
  2. 默认情况下,若一个组件在 渲染期间 (render) 发生错误,会导致整个组件树全部被卸载,用户只会看到一个空白网页,这并不理想;
  3. 注意⚠️:某些错误,错误边界组件无法捕获:
    1. 自身的错误
    2. 异步的错误
    3. 事件中的错误

错误边界的原理

  1. 错误边界是 React 中一种能够捕获并处理渲染错误的机制;

    1. 当渲染期间发生错误时,React 会中止渲染并显示错误信息,以防止错误的影响传播到整个应用程序;
    2. 使用错误边界有助于提高应用程序的可靠性和稳定性,特别是在处理大型复杂应用程序时,单个组件的错误可能会导致整个应用程序的崩溃‌;
  2. 使用错误边界:

    1. 需要创建一个继承自 React.Component 的类组件,并实现 static getDerivedStateFromError(error) 或者 componentDidCatch(error, errorInfo) 生命周期方法;
    2. getDerivedStateFromError 静态方法在渲染子组件的过程中发生错误之后,更新页面之前运行,用于改变状态 (该函数返回一个对象,React 会将该对象的属性覆盖掉当前组件的 state)
    3. componentDidCatch 实例方法在渲染子组件的过程中发生错误后运行,通常用于记录错误消息‌;

案例

  1. 示例代码

    <!DOCTYPE html>
    <html>
    
    <head>
      <meta charset="UTF-8" />
      <title>Hello World</title>
      <script src="https://lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/react/18.2.0/umd/react.production.min.js"></script>
      <script src="https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-M/react-dom/18.2.0/umd/react-dom.production.min.js"></script>
      <script src="https://lf9-cdn-tos.bytecdntp.com/cdn/expire-1-M/babel-standalone/6.26.0/babel.min.js"></script>
    </head>
    
    <body>
      <div id="root"></div>
      <script type="text/babel">
        class ErrorBoundary extends React.Component {
          constructor(props) {
            super(props);
            this.state = { error: null, errorInfo: null };
          }
    
          componentDidCatch(error, errorInfo) {
            this.setState({
              error: error,
              errorInfo: errorInfo,
            });
          }
    
          render() {
            if (this.state.errorInfo) {
              return (
                <div>
                  <h2>错误信息:</h2>
                  <details style={{ whiteSpace: "pre-wrap" }}>
                    {this.state.error && this.state.error.toString()}
                    <br />
                    {this.state.errorInfo.componentStack}
                  </details>
                </div>
              );
            }
            return this.props.children;
          }
        }
    
        class BuggyCounter extends React.Component {
          constructor(props) {
            super(props);
            this.state = { counter: 0 };
            this.handleClick = this.handleClick.bind(this);
          }
    
          handleClick() {
            this.setState(({ counter }) => ({
              counter: counter + 1,
            }));
          }
    
          render() {
            if (this.state.counter === 5) {
              throw new Error("I crashed!");
            }
            return <h1 onClick={this.handleClick}>{this.state.counter} 点击</h1>;
          }
        }
    
        function Err() {
          return (
            <div>
              <ErrorBoundary>
                <p>
                  这两个计数器位于相同的错误边界内。如果一崩溃时,错误边界将替换这两个错误。
                </p>
                <BuggyCounter />
                <BuggyCounter />
              </ErrorBoundary>
              <hr />
              <p>
                这两个计数器都在各自的误差边界内。因此,如果一个崩溃,另一个不会受到影响
              </p>
              <ErrorBoundary>
                <BuggyCounter />
              </ErrorBoundary>
    
              <ErrorBoundary>
                <BuggyCounter />
              </ErrorBoundary>
            </div>
          );
        }
    
        ReactDOM.render(<Err />, document.getElementById("root"));
      </script>
    </body>
    
    </html>
    
  2. 效果展示

打赏作者
您的打赏是我前进的动力
微信
支付宝
评论

中午好👏🏻,我是 ✍🏻   疯狂 codding 中...

粽子

这有关于前端开发的技术文档和你分享。

相信你可以在这里找到对你有用的知识和教程。

了解更多

目录

  1. 1. 错误边界的简介
  2. 2. 错误边界的原理
  3. 3. 案例