1.1.2 • Published 8 months ago

react-native-component-boundary v1.1.2

Weekly downloads
-
License
MIT
Repository
github
Last release
8 months ago

react-native-component-boundary

React native error boundary component.

Usage

import useErrorBoundary from 'react-native-component-boundary';
import ReactNative from 'react-native';

export default useErrorBoundary(ReactNative, {
    fallbackRender: function (fallback) {
         Alert.alert("Uncaught Exception", `${fallback.pointcut ? fallback.pointcut.name : ""}\n${fallback.error}\n${fallback.errorInfo ? fallback.errorInfo.componentStack : ""}`);
    },
    fallbackComponent: function (fallback) {
        return React.createElement(ReactNative.Text, {style: {color: 'red'}}, `${fallback.pointcut.name}: ${fallback.error}`);
    }
});

import at the top of the entry point.

import 'path/useErrorBoundary';

import {AppRegistry} from 'react-native';
import App from './App';
import {name as appName} from './app.json';

// ....

Watch custom component

import ErrorBoundary from "path/useErrorBoundary";

function BadComponent() {
    return <Text>{[1, 2, null].map(i => i.toString()).join(' ,')}</Text>
}

export default ErrorBoundary.withErrorBoundary({
    component: BadComponent,
    name: 'BadComponent'
});
import BadComponent from "path";

function App() {
    return (
        <View>
            <BadComponent/>
        </View>
    );
}

Fallback properties

  • error: Error;
  • errorInfo?: React.ErrorInfo;
  • pointcut: { name:string, component: React.ComponentType };
  • resetError?: Function

Inside component handler

catch asynchronous code.

export default useErrorBoundary(ReactNative, {
    enable: true,
    components: [
        {
            name: "Text",
            handlers: ["onPress", "onPressIn", "onPressOut"]
        }
    ],
    fallbackRender: function (fallback) {
        // ...
    },
    fallbackComponent: function (fallback) {
        // ...
    }
});

Note: React.Children as a prop

The children node as a prop has already been created by parent component. The exception from parent component cannot be caught in the child component.

function SimpleComponent({ children }) {
    return (
        <View>
            { children }
        </View>
    );
}

const BadPracticeComponent = ErrorBoundary.withErrorBoundary({
    component: SimpleComponent,
    name: 'BadPracticeComponent'
});

// There is no perfect solution to save fucking code
<BadPracticeComponent>
    <Text>{ [null][0].toString() }</Text>
</BadPracticeComponent>

Is not recommend to use logic inside render.

function getRenderText() {
    try {
        // ....
        return "Normal";
    } catch (e) {
        return "Error";
    }
}

// follow the best practices
<BadPracticeComponent>
    <Text>{ getRenderText() }</Text>
</BadPracticeComponent>
1.1.1

8 months ago

1.1.2

8 months ago

1.0.2

9 months ago

1.0.1

9 months ago

1.0.0

9 months ago