React设置错误边界后,仍然报错

发布于 2022-09-11 23:09:59 字数 1280 浏览 26 评论 0

题主开发了一个safeComponent组件,使用错误边界来捕获render错误,防止整个页面的crash。但是我设置static getDerivedStateFromErrorcomponentDidCatch 这两个函数后,将他应用在一个错误的组件中,还是报错。
希望有相关使用经验的大神帮帮忙~~~~

safeComponent源码

import React, {Component} from  'react'
import {View} from  'react-native'

export default class SafeComponent extends Component {
    constructor(props) {
      super(props);
      this.state = { error: null, errorInfo: null, isError:false};
    }

    static getDerivedStateFromError(error) {
        return { isError: true };
      }
    
    componentDidCatch (error) {
        this.setState({isError: true});
        console.log('get the error', error);
    }
    
    render() {
        console.log('render', this.state.isError);
      if (this.state.isError) {
        return (
          <View/>
        );
      }
      return this.props.children;
    }  
  }

errorComponent render源码

render() {
    throw new Error('baocuola!')
}

调用:

<safeComponent>
    <errorComponent/>
</safeComponent>

在rn中的报错信息:
image.png

react version 16.11.0
reactnative version 0.61.2

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

Oo萌小芽oO 2022-09-18 23:09:59

我试了几次, 发现在开发模式下仍旧报错, 但是build出来后就好了.

class One extends Component {
  state = { error: false, count: 0 };
  handler = () => this.setState(d => ({ count: d.count + 1 }));

  render() {
    const { count } = this.state;
    if (count > 3) {
      throw new Error('I crashed!');
    }
    return (
      <>
        <h1>One {count}</h1>
        <button onClick={this.handler}>Click</button>
      </>
    );
  }
}

class ErrorComponent extends Component {
  state = { error: false, count: 0 };

  static getDerivedStateFromError() {
    return { error: true };
  }

  componentDidCatch(err) {
    console.log(err);
  }

  render() {
    const { error } = this.state;
    const { children } = this.props;
    return <>{error ? <h1>Error</h1> : children}</>;
  }
}

class App extends Component {
  render() {
    return (
      <div>
        <ErrorComponent>
          <One></One>
        </ErrorComponent>
      </div>
    );
  }
}

export default App;
圈圈圆圆圈圈 2022-09-18 23:09:59

找到问题了,直接在组件中throw一个错误无论是在dev 还是 prod 环境都是捕获不到的;写了一个渲染错误,在dev环境可以捕获,在prod就直接catch住了。react设计者太牛逼了!!!!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文