Ошибки в React
Как обрабатывать ошибки в React-приложении с помощью Error Boundary?
Error Boundary — это компонент, который отлавливает ошибки в
дочерних компонентах и предотвращает их распространение на всю иерархию.
Основные шаги:
-
Создание Error Boundary:
- Создайте классовый компонент с методами
componentDidCatchиgetDerivedStateFromError.
import React, { Component } from 'react'; class ErrorBoundary extends Component { constructor(props) { super(props); this.state = { hasError: false }; } static getDerivedStateFromError(error) { // Обновляем состояние, чтобы следующий рендер показал запасной UI return { hasError: true }; } componentDidCatch(error, errorInfo) { // Вы можете отправить ошибку на сервер console.error("Error caught by ErrorBoundary:", error, errorInfo); } render() { if (this.state.hasError) { // Рендер запасного UI при ошибке return <h1>Something went wrong.</h1>; } return this.props.children; } } export default ErrorBoundary; - Создайте классовый компонент с методами
-
Использование Error Boundary:
- Оберните компоненты, которые могут вызвать ошибки, в Error Boundary.
import React from 'react'; import ErrorBoundary from './ErrorBoundary'; import MyComponent from './MyComponent'; const App = () => ( <ErrorBoundary> <MyComponent /> </ErrorBoundary> ); export default App;
Error Boundary позволяет обрабатывать ошибки в React-приложении, предотвращая их распространение и предоставляя возможность отображения запасного UI, обеспечивая более стабильное приложение.
Как обрабатывать ошибки при использовании хуков (hooks) в React?
Для обработки ошибок при использовании хуков в React можно использовать блоки try...catch внутри эффектов или пользовательских хуков.
Основные способы:
-
Обработка ошибок в
useEffect:- Используйте блок
try...catchвнутри эффекта.
import React, { useEffect, useState } from 'react'; const MyComponent = () => { const [data, setData] = useState(null); const [error, setError] = useState(null); useEffect(() => { const fetchData = async () => { try { const response = await fetch('https://api.example.com/data'); const result = await response.json(); setData(result); } catch (err) { setError(err); } }; fetchData(); }, []); if (error) { return <div>Error: {error.message}</div>; } return <div>{data ? JSON.stringify(data) : 'Loading...'}</div>; }; export default MyComponent; - Используйте блок
-
Обработка ошибок в пользовательских хуках:
- Создайте пользовательский хук, который включает обработку ошибок.
import { useState, useEffect } from 'react'; const useFetch = (url) => { const [data, setData] = useState(null); const [error, setError] = useState(null); useEffect(() => { const fetchData = async () => { try { const response = await fetch(url); const result = await response.json(); setData(result); } catch (err) { setError(err); } }; fetchData(); }, [url]); return { data, error }; }; export default useFetch; -
Использование Error Boundary:
- Error Boundary перехватывает ошибки рендера дочерних компонентов. Ошибки обработчиков событий и отклонения обычных асинхронных запросов обрабатывайте отдельно через try/catch или catch; само наличие хуков не делает их защищёнными.
import React from 'react'; import ErrorBoundary from './ErrorBoundary'; import MyComponent from './MyComponent'; const App = () => ( <ErrorBoundary> <MyComponent /> </ErrorBoundary> ); export default App;
Для обработки ошибок при использовании хуков в React применяйте блоки try...catch внутри эффектов и пользовательских хуков, а также используйте Error Boundary для защиты компонентов от неожиданных ошибок.