Перенаправление на страницу ошибки ReactJS и react-router

Я пытаюсь отправить пользователя на общую страницу ошибки, когда приложение ломается, дело в том, что я пытаюсь использовать ErrorBoundary, а затем рендеринг Redirect;

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 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>

КомпонентDidCatch никогда не срабатывает, поэтому никогда не покидает текущую страницу ошибки ни в версии для разработчиков, ни в рабочей версии. Как я могу отправить пользователя на маршрут X, когда приложение ломается или пытается выдать ошибку?

Чтобы вызвать ошибку, я оставляю один компонент с пустой опорой, а затем щелкаю, пытаясь использовать функцию, которая должна быть передана в опоре.


person Nicolas M. Pardo    schedule 03.04.2018    source источник
comment
что именно не работает?   -  person Sagiv b.g    schedule 04.04.2018
comment
componentDidCatch никогда не срабатывает, поэтому никогда не покидает текущую страницу ошибки.   -  person Nicolas M. Pardo    schedule 04.04.2018
comment
Где вы определили компонент ErrorBoundary   -  person Aaqib    schedule 04.04.2018
comment
не могли бы вы поделиться кодом, который также выдает ошибку?   -  person Sagiv b.g    schedule 04.04.2018
comment
Извините, сделал небольшое редактирование, так как у меня была копия вставлена ​​из другого компонента, я сохранил имя класса, но это не влияет, так как это экспорт по умолчанию, а неф дается при импорте в комп маршрутизатора import ErrorBoundary from "./ErrorBoundary";   -  person Nicolas M. Pardo    schedule 04.04.2018
comment
Чтобы выдать ошибку, я намеренно оставляю реквизит пустым, а позже вызываю этот пустой реквизит как обратный вызов взаимодействия.   -  person Nicolas M. Pardo    schedule 04.04.2018
comment
я бы не стал устанавливать состояние внутри рендера this.setState({ has_error: false });   -  person Sagiv b.g    schedule 04.04.2018
comment
Я только что заметил, что это действительно не нужно, так как после того, как я попытался с помощью инструментов разработчика реагировать, чтобы изменить has_error на true, изменение маршрутизации заставляет комп ErrorBoundary вернуть has_error значение false, удалит его из вопроса и мой собственный код   -  person Nicolas M. Pardo    schedule 04.04.2018
comment
ну, не видя всего соответствующего кода (включая ошибку), трудно догадаться.   -  person Sagiv b.g    schedule 04.04.2018
comment
Дело в том, что это должна быть общая обработка ошибок, поэтому, что бы это ни было, оно должно быть перенаправлено на путь URL-адреса X, где маршрутизатор покажет им Упс, это не сработало.   -  person Nicolas M. Pardo    schedule 04.04.2018
comment
@ NicolasM.Pardo Но не все ошибки вызывают componentDidCatch. ошибки, вызванные, например, обработчиками событий или запросами ajax, не вызовут его. по этой причине я попросил посмотреть, где у вас ошибка.   -  person Sagiv b.g    schedule 04.04.2018


Ответы (1)


componentDidCatch срабатывает только в том случае, если ошибка выдается внутри метода render.

Причина, по которой ваш componentDidCatch не запускается, заключается в том, что события, такие как onClick, не входят в жизненный цикл render. Так что componentDidCatch не сможет поймать такую ​​ошибку.

Один из способов проверить ваш componentDidCatch — выдать ошибку внутри метода render.

Для ошибок вне метода рендеринга вы должны быть осторожны и добавлять try/catches в местах, где, по вашему мнению, могут быть ошибки в ваших обработчиках действий.

Также хороший способ предотвратить неопределенный onClick — добавить flow или typescript.

https://reactjs.org/blog/2017/07/26/обработкаошибок-в-реагировании-16.html#component-stack-traces

React 16 выводит все ошибки, возникшие во время rendering, в консоль в процессе разработки, даже если приложение их случайно проглотит. В дополнение к сообщению об ошибке и стеку JavaScript он также предоставляет трассировку стека компонентов. Теперь вы можете увидеть, где именно в дереве компонентов произошел сбой:

person Kenneth Truong    schedule 03.04.2018
comment
в яблочко. но без кода трудно догадаться, что это проблема. - person Sagiv b.g; 04.04.2018