React捕获ErrorBoundary后仍然显示错误

时间:2018-08-30 12:13:21

标签: javascript reactjs create-react-app

我的React应用正在捕获错误并正确显示我的自定义错误消息,但过一秒钟后,它仍显示原始错误日志记录。因此,后备UI会被初始错误屏幕替换。

测试组件:

import React, { Component } from 'react';

export class Test extends React.Component {
    constructor(props) {
        super(props);
    }

    render() {
        return (
        <ErrorBoundary>

        <Error></Error>

        </ErrorBoundary>);
    }
}

错误组件:

import React, { Component } from 'react';

export class Error extends React.Component {
    constructor(props) {
        super(props);
    }

    render() {
        return ({ test });
    }
}

在错误组件中,测试未定义,因此将引发未定义的错误。

ErrorBoundary:

import React, { Component } from 'react';

export class ErrorBoundary extends React.Component {
    constructor(props) {
        super(props);
        this.state = { error: null, errorInfo: null };
        console.log('initiated');
    }

    componentDidCatch(error, errorInfo) {
        // Catch errors in any components below and re-render with error message
        console.log('ERROR');
        this.setState({
            error: error,
            errorInfo: errorInfo
        })
        // You can also log error messages to an error reporting service here
    }

    render() {
        console.log('STATE');
        console.log(this.state.error);
        if (this.state.errorInfo) {
            // Error path
            return (
                <div>
                    <h2>Something went wrong.</h2>
                    <details style={{ whiteSpace: 'pre-wrap' }}>
                        {this.state.error && this.state.error.toString()}
                        <br />
                        {this.state.errorInfo.componentStack}
                    </details>
                </div>
            );
        }
        // Normally, just render children
        return this.props.children;
    }
}

首先显示此信息:

custom error

然后一秒钟后显示此信息:

initial error

我该如何解决?

如果某个组件崩溃,ErrorBoundaries可以防止所有组件崩溃,并在该组件中显示自定义消息,并使其他组件保持活动状态(正常),对吧?

1 个答案:

答案 0 :(得分:15)

我想我明白了。 create-react-app软件包有一个名为react-overlay-error的工具。这会将来自控制台的错误消息显示为应用程序的覆盖,因此您可以轻松地检查堆栈跟踪和调试。

这不会在生产模式下显示,它只是复制普通浏览器控制台的开发工具。

您可以按 Escape (隐藏)以再次查看您的叠加层。

如果您想摆脱它,this answer可能会有所帮助。