重定向到错误页面 ReactJS 和 react-router

Posted

技术标签:

【中文标题】重定向到错误页面 ReactJS 和 react-router【英文标题】:Redirect to error page ReactJS and react-router 【发布时间】:2018-09-13 08:23:51 【问题描述】:

当应用程序中断时,我试图将用户发送到通用错误页面,我正在尝试使用 ErrorBoundary 方法,然后呈现重定向;

export default class ErrorBoundary extends Component 
    state =  has_error: false 

    componentDidCatch(error, info)
        this.setState( has_error: true );
    


    render() 
        if (this.state.has_error)
            return <Redirect to="/somewhere/else" />
        
        return this.props.children;
    
;

然后使用ErrorBoundary将Router内部的所有路由和子组件包裹起来

<Router history=history>
    <ErrorBoundary>
        <Header />
        <Switch>
            <Route exact path="/" component=Home />
            <Route
                path="/createManager/:managerId"
                component=CreateManager
            />
            <Route path="/login" component=LoginComp />
            <Route path="/test" component=Test />
            <Route path="/register" component=RegisterAccount />
            <Route component=NotFound />
        </Switch>
        <Footer />
    </ErrorBoundary>
</Router>

componentDidCatch 永远不会被触发,因此永远不会离开当前的错误页面,无论是在 dev 还是 prod 版本中。当应用程序中断或尝试抛出错误时,如何将用户发送到 X 路由?

为了触发错误,我给一个组件留了一个空的 prop,然后点击尝试使用应该在 prop 中传递的函数。

【问题讨论】:

究竟是什么不起作用? componentDidCatch 永远不会被触发,因此永远不会离开当前的错误页面 你在哪里定义了ErrorBoundary组件 你能分享一下引发错误的代码吗? 对不起,做了一个小编辑,因为我从另一个组件复制粘贴了我保留了类名,但它不影响因为它是默认导出并且在路由器 comp 中导入时给出了中殿import ErrorBoundary from "./ErrorBoundary"; 【参考方案1】:

componentDidCatch 仅在 render 方法内抛出 错误 时触发。

您的componentDidCatch 没有被触发的原因是因为像onClick 这样的事件 不在render 生命周期中。所以componentDidCatch 将无法捕捉到这种错误。

测试componentDidCatch 的一种方法是在render 方法中抛出错误。

对于渲染方法之外的错误,您必须小心,并在您认为在您的操作处理程序中可能有错误的地方添加 try/catch。

另外一个防止未定义 onClick 的好方法是添加 flowtypescript

https://reactjs.org/blog/2017/07/26/error-handling-in-react-16.html#component-stack-traces

React 16 将 rendering 期间发生的所有错误打印到开发中的控制台,即使应用程序不小心吞下了它们。除了错误消息和 javascript 堆栈之外,它还提供组件堆栈跟踪。现在您可以看到失败发生在组件树中的确切位置:

【讨论】:

完全正确。但是没有代码很难猜到这是问题所在。

以上是关于重定向到错误页面 ReactJS 和 react-router的主要内容,如果未能解决你的问题,请参考以下文章

如何在提交表单时将结果重定向到React中的另一个页面

执行IF条件时如何重定向到ReactJS中的另一个页面?

如何使用 react-redux 将错误 500 全局重定向到页面

405 - 用于访问此页面的 http 动词在 reactjs 应用程序中不允许 iis

ReactJS 发送 GET 请求,响应 302 重定向,收到 CORS 错误

在网络环境中收到 401 错误时 React Relay Modern 重定向到另一个页面