Ваш React-сайт упал? Error Boundary спешит на помощь!
Представьте: вы заходите на сайт, а вместо красивого интерфейса видите пустой белый экран. Знакомо? Это «белый экран смерти» — страшный сон любого React-разработчика. Одна маленькая ошибка в одном компоненте, и всё приложение рушится. К счастью, у React есть встроенный механизм защиты — Error Boundary.
Error Boundary (или предохранитель) — это специальный React-компонент, который отлавливает ошибки JavaScript в своих дочерних компонентах, логирует их и отображает запасной UI вместо аварийного дерева компонентов.
Проще говоря, это как try...catch
, но для компонентов.
“Настоящий профессионал — это тот, кто знает, как изящно обработать свои ошибки.”
Error Boundary — это классовый компонент, который реализует один или оба из следующих методов:
static getDerivedStateFromError(error)
— для обновления состояния, чтобы при следующем рендере показать запасной UI.componentDidCatch(error, errorInfo)
— для выполнения «побочных эффектов», например, для логирования ошибки.Вот как выглядит простейший Error Boundary:
import React from 'react';
class ErrorBoundary extends React.Component {
constructor(props) {
super(props);
this.state = { hasError: false };
}
static getDerivedStateFromError(error) {
// Обновляем состояние, чтобы следующий рендер показал запасной UI.
return { hasError: true };
}
componentDidCatch(error, errorInfo) {
// Можно также сохранить информацию об ошибке в соответствующую службу
console.error("Uncaught error:", error, errorInfo);
}
render() {
if (this.state.hasError) {
// Можно отрендерить любой запасной UI
return <h1>Что-то пошло не так.</h1>;
}
return this.props.children;
}
}
Очень просто! Оберните им любой компонент или группу компонентов, которые могут вызвать ошибку.
import ErrorBoundary from './ErrorBoundary';
import MyRiskyComponent from './MyRiskyComponent';
function App() {
return (
<div>
<h1>Добро пожаловать в моё приложение!</h1>
<ErrorBoundary>
<MyRiskyComponent />
</ErrorBoundary>
</div>
);
}
Теперь, если MyRiskyComponent
или любой его дочерний компонент выбросит ошибку во время рендеринга, пользователь увидит <h1>Что-то пошло не так.</h1>
, а остальная часть приложения (заголовок h1
) продолжит работать как ни в чём не бывало.
Error Boundaries не ловят ошибки в:
try...catch
).setTimeout
, requestAnimationFrame
).✅ Используйте Error Boundaries как подушки безопасности: размещайте их в стратегически важных местах вашего приложения, чтобы защитить пользовательский опыт от неожиданных сбоев.