Компонент Error Boundary для React
7 августа 2023 г.
Это мой вариант компонента error boundary, приспособленный под приложение с функциональными компонентами. Возвращение на предыдущую страницу я сделала через универсальный window.history.back(); , но у react-router должна быть своя функция для этого.
Документация
React https://react.dev/reference/react/Component#catching-rendering-errors-with-an-error-boundary
Next https://nextjs.org/docs/pages/building-your-application/configuring/error-handling
JavaScript | Error-Boundary.jsx
1import React, { Component } from "react";2import { ReactComponent as Icon } from "../../commons/svg/emojiError2.svg";3import "./index.scss";45const ErrorComponent = () => {6 const onClick = () => {7 window.history.back();8 setTimeout(() => {9 window.location.reload();10 }, 400);11 };1213 return (14 <div className="error_boundry">15 <p className="title"> Упс! Что-то пошло не так...</p>16 <div className="error_emoji">17 <Icon />18 </div>19 <div className="flex flex--align-items-end">20 <button21 className="btn btn--blue"22 type="button"23 onClick={onClick}24 >25 Вернуться назад26 </button>27 <a className="btn" href="/">28 Вернуться на главную29 </a>30 </div>31 </div>32 );33};3435export default class ErrorBoundry extends Component {36 constructor(props) {37 super(props);38 this.state = { hasError: false };39 }4041 // You can also log the error to an error reporting service42 // componentDidCatch(error, info) {43 // logErrorToMyService(error, info);44 // }4546 static getDerivedStateFromError(error) {47 // Update state so the next render will show the fallback UI.48 return { hasError: true };49 }5051 render() {52 if (this.state.hasError) {53 // You can render any custom fallback UI54 return <ErrorComponent />;55 }56 return this.props.children;57 }58}59
В файле index.js оборачиваем App в ErrorBoundary компонент.
JavaScript | index.jsx
1import * as ReactDOMClient from "react-dom/client";2import ErrorBoundary from './components/error-boundary';34const container = document.getElementById("root");5const root = ReactDOMClient.createRoot(container);67root.render(8 <Provider store={store}>9 <ErrorBoundary>10 <App />11 </ErrorBoundary>12 </Provider>13);