Введение в пакет response-error-boundary с примерами
Ошибки - это то, с чем вы сталкиваетесь каждый день при программировании. Некоторые можно решить просто, а на выяснение других уходит часы.
В этой статье мы рассмотрим, как бороться с ошибками в приложениях React. Мы начнем с изучения границ ошибок, а затем увидим, как с ними бороться с помощью пакета response-error-граница.
Что такое границы ошибки?
Согласно официальной документации React,
«Границы ошибок - это компоненты React, которые перехватывают ошибки JavaScript в любом месте своего дочернего дерева компонентов, регистрируют эти ошибки и отображают резервный пользовательский интерфейс вместо дерева компонентов, в котором произошел сбой. Границы ошибок обнаруживают ошибки во время рендеринга, в методах жизненного цикла и в конструкторах всего дерева под ними ».
По сути, любые ошибки JavaScript, возникающие в жизненном цикле компонента, можно отловить с помощью границ ошибок. Затем вместо прерывания работы приложения React отобразит для вас резервный компонент пользовательского интерфейса.
Концепция границ ошибок все еще довольно нова, поскольку она была выпущена в React 16. До этого выпуска не существовало хорошего способа изящной обработки ошибок.
Пример
Продемонстрируем ошибку на простом примере. Мы создадим компонент Counter с кнопкой увеличения и уменьшения. Если счетчик равен 5, мы выдадим ошибку.
Мы отобразим этот компонент Counter в нашем компоненте App. В компоненте App мы объявим переменную состояния count.
Если мы запустим наше приложение, у нас будет счетчик с двумя кнопками для увеличения и уменьшения. Если наш счетчик равен 5, мы получим ошибку, которую добавили в наш компонент Counter.
Как видно из сообщения внизу рисунка, «Этот экран виден только в разработке. Он не появится, если приложение выйдет из строя в производственной среде ». Если мы закроем этот экран, останется пустой экран. Единственный способ сбросить состояние и повторно отрисовать наш компонент - это полностью обновить страницу.
Компоненты класса для обработки ошибок
Официальная документация рекомендует использовать компонент класса для создания границы ошибки. Это можно сделать с помощью static getDerivedStateFromError()
или componentDidCatch()
.
Вот простой пример, который они приводят.
Честно говоря, я не писал компонент класса с тех пор, как впервые начал изучать React. Я уверен, что это решение отлично работает, но должен быть другой способ.
реакция-ошибка-граница
Быстрый поиск в Google приводит нас к пакету реакция-ошибка-граница. На npm еженедельно загружается более 600 000 загрузок, а на GitHub сейчас 2,3 тысячи звезд.
Этот пакет дает нам компонент-оболочку, который мы можем использовать вокруг любых компонентов, где мы хотим обработать ошибку. Вы можете использовать это для обертывания отдельного компонента или дерева компонентов. Любые ошибки, возникающие в компоненте или любом из его дочерних элементов, будут обрабатываться этой оболочкой. Вы также можете использовать это, чтобы обернуть все ваше приложение и предоставить общее сообщение об ошибке.
Чтобы использовать этот компонент, все, что вам нужно сделать, это импортировать его из библиотеки и обернуть компоненты, которые могут вызвать ошибку.
import { ErrorBoundary } from 'react-error-boundary'; const errorComponent = ( <ErrorBoundary FallbackComponent={ErrorFallback} onReset={() => { // reset the state of the app }} > <Component that may cause an error /> </ErrorBoundary> );
Компонент ErrorBoundary
принимает FallbackComponent
опору. Компонент, который вы передаете ему, будет отображаться в случае ошибки. Вы также можете передать функцию обратного вызова onReset
. Эта функция будет вызвана до того, как компонент ErrorBoundary
сбросит свое внутреннее состояние. В этой функции вы захотите сделать что-то, чтобы сбросить состояние вашего приложения, чтобы ошибка больше не повторялась.
Теперь вернемся к нашему примеру компонента Counter и поймем эту ошибку с помощью пакета response-error-boundary.
Мы начнем с создания запасного компонента для рендеринга в случае какой-либо ошибки. Этому компоненту будет передано свойство error
и свойство resetErrorBoundary
из компонента Error Boundary. Мы отобразим сообщение об ошибке и добавим кнопку, которая будет вызывать resetErrorBoundary
.
const ErrorFallback = ({ error, resetErrorBoundary }) => { return ( <div role="alert"> <p>Something went wrong:</p> <pre>{error.message}</pre> <button onClick={resetErrorBoundary}>Try again</button> </div> ); };
Затем мы обернем наш компонент Counter границей ошибки и передадим FallbackComponent
prop и onReset
prop. В onReset
мы установим состояние переменной count равным 0.
const App = () => { const [count, setCount] = useState(0); return ( <div className="App"> <ErrorBoundary FallbackComponent={ErrorFallback} onReset={() => setCount(0)} > <Counter count={count} setCount={setCount} / </ErrorBoundary> </div> ); };
Компонент приложения теперь будет выглядеть так.
Если мы увеличим наш счетчик и он станет равным 5, мы увидим тот же экран ошибки, что и раньше. Однако, если мы закроем этот экран, мы увидим созданный нами ErrorFallback
компонент.
Если мы нажмем кнопку «Повторить попытку», состояние нашего счетчика будет сброшено до 0, и наше приложение выполнит повторную визуализацию.
Заключение
Обработка ошибок важна в любом приложении. Здесь следует отметить, что эти границы ошибок обрабатывают только ошибки JavaScript. Они не обнаруживают ошибок для обработчиков событий, асинхронного кода, рендеринга на стороне сервера или ошибок, возникающих в самой границе ошибки.
Спасибо за прочтение! Надеюсь, вы узнали один способ обрабатывать ошибки в своих приложениях React. Пакет response-error-граница действительно полезен, и я считаю его намного чище, чем использование жизни компонента класса, рекомендованного в документации. Попробуйте в следующем приложении!
Если вы хотите узнать больше о других полезных пакетах React, ознакомьтесь со статьей ниже.