最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • React和React Native页面级崩溃处理:componentDidCatch(错误边界)

    正文概述 掘金(Zyellen)   2021-06-18   719

    部分 UI 的 JavaScript 错误不应该导致整个应用崩溃,为了解决这个问题,React 16 引入了一个新的概念 —— 错误边界。

    错误边界是一种 React 组件,这种组件可以捕获发生在其子组件树任何位置的 JavaScript 错误,并打印这些错误,同时展示降级 UI,而并不会渲染那些发生崩溃的子组件树。错误边界在渲染期间、生命周期方法和整个组件树的构造函数中捕获错误。

    这里用rn举例一下具体用法

    使用方式一:组件方式

    class ErrorBoundary extends React.Component {
        constructor(props) {
            super(props);
            this.state = {
                error: null,
            };
        }
    
        componentDidCatch(error, info) {
            alert('1111')
            this.setState({
                error
            });
    
            // 设置崩溃以后显示的UI
            // 上传错误日志
        }
    
        render() {
    
            if (this.state.error) { // 如果页面崩溃,则显示下面的UI
                return (
                    <View style={{justifyContent: 'center', alignItems: 'center'}}>
                        <Text style={{color: 'red'}}>
                            {this.state.error && this.state.error.toString()}
                        </Text>
    
                    </View>
                );
            }
            return this.props.children;
        }
    }
    class RNTestPage extends React.Component {
        constructor(props) {
            super(props);
    
            this.state = {
                count: 0
            }
            this.onPress = this.onPress.bind(this);
        }
    
        onPress(){
                    throw new Error('这个应用崩溃了!!!')
        }
        render() {
            return (
                <ErrorBoundary>
                    <View style={styles.container}>
                        <TouchableOpacity onPress={this.onPress}>
                            <Text>点击我就崩溃啦</Text>
                        </TouchableOpacity>
                        <Text style={styles.text}>这里是正常显示的页面</Text>
                    </View>
                </ErrorBoundary>
    
    
            )
        }
    }
    export default class RNTest extends React.Component {
    
        render() {
            return (
                <ErrorBoundary>
                  <RNTestPage />
                </ErrorBoundary>
    
    
            )
        }
    }
    

    使用方式二:高阶组件方式

    import React from 'react'
    import {
        View,
        Text
    } from 'react-native'
    
    function getDisplayName(WrappedComponent) {
        return WrappedComponent.displayName || WrappedComponent.name || 'Component';
    }
    
    export default (WrappedComponent)=> {
    
        class Component extends React.Component {
    
           
            state = {
                    error: new Error(),
                    hasError: false // UI级代码是否崩溃
                }
            
    
            componentDidCatch(error, info){
                this.setState({
                    error,
                    hasError: true
                })
            }
    
            render() {
               if (this.state.hasError){
                   return <View>
                       <Text>
                           {this.state.error.toString()}
                       </Text>
                   </View>
               }
                return <WrappedComponent {...this.props}/>
            }
        }
    
        Component.displayName = `HOC(${getDisplayName(WrappedComponent)})`;
    
        return Component
    }
    

    使用

    /*
    * 高阶组件方式使用
    * */
    
    @HocErrorCatch
    export default class RNTestPage extends React.Component {
        
    
        onPress(){
                    throw new Error('这个应用崩溃了!!!')
                }
            
        
        render() {
    
            return (
                <View style={styles.container}>
                    <TouchableOpacity onPress={this.onPress}>
                        <Text>点击我就崩溃啦</Text>
                    </TouchableOpacity>
                    <Text style={styles.text}>这里是正常显示的页面</Text>
                </View>
    
            )
        }
    }
    

    日常使用更加推荐高阶函数形式


    起源地下载网 » React和React Native页面级崩溃处理:componentDidCatch(错误边界)

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元