Обработка ошибки Not Found в React Router

При создании приложения нужно обратить внимание и на появление различных ошибок в процессе его дальнейшего использования. В этом уроке мы научимся работать с ошибкой 'Not Found'. Такая ошибка может выскочить, к примеру, если пользователь кликнет по ссылке, ведущей на несуществующую страницу.

Для начала давайте откроем наше приложение, которое мы делали на прошлых уроках, и заменим верстку компонента Root. Теперь при запуске приложения у нас будет отображаться список из двух продуктов:

routes/root.jsxfunction Root() {
  return (
    <nav>
      <a href={`/products/1`}>Product1</a>
      <a href={`/products/2`}>Product2</a>
    </nav>
  );
}

export default Root;

Добавим немного стилей в index.css:

index.cssbody {
  font-size: 18px;
  line-height: 1.5;
}

nav {
  display: flex;
  flex-direction: column;
}

a {
  text-decoration: none;
  color: blue;
}

А сейчас покликайте по ссылкам. Поскольку у нас нет макетов страничек для наших продуктов, то ссылки приведут нас только на экран с ошибкой '404 Not Found' и упреком в том, что мы могли бы придумать сами что-то покрасивей и поинтересней, чем то, что React Router отобразил нам по умолчанию.

Давайте сделаем нашу собственную страничку, которая будет отображаться в случае появления ошибки 404. Для этого в папке src создадим файлик error-page-404.jsx.

Внутри React компонента ErrorPage404 мы воспользуемся хуком useRouteError для отлавливания ошибки, которую мы будем выводить в консоль:

error-page-404.jsximport { useRouteError } from 'react-router-dom';

function ErrorPage404() {
  const error = useRouteError();
  console.error(error);

}

export default ErrorPage404;

Далее в верстке компонента ErrorPage404 мы будем отображать пару заголовков, сообщающих об ошибке и выведем такие свойства объекта error, как statusText и data (объект error и его свойства вы также можете увидеть, если откроете консоль и начнете кликать по нашим ссылкам в приложении).

error-page-404.jsxreturn (
  <div>
    <h1>Hi! It is an Error Page</h1>
    <h2>404 Not Found Error</h2>
    <p>
      <i>{error.statusText}</i>
    </p>
    <p>
      <i>{error.data}</i>
    </p>
  </div>
);

Обязательно не забудьте открыть файл main.jsx и добавить еще одну строчку импорта с ErrorPage404:

main.jsximport ErrorPage404 from './error-page-404';

А также добавьте еще одно свойство errorElement в объект Router - этот элемент выводится, когда на данном маршруте возникает ошибка. Значением элемента ошибки будет наш компонент ErrorPage404:

main.jsxconst router = createBrowserRouter([
  {
    path: '/',
    element: <Root />,
    errorElement: <ErrorPage404 />,
  },
]);
Задание 1

Возьмите приложение, созданное вами в задании к прошлому уроку. Добавьте на главную страницу список, состоящий из пары ссылок, как это показано в уроке. Пусть значениями href ссылок будут - /students/1 и /students/2, а текстом ссылок - 'Student1' и 'Student2' соответсвенно. Убедитесь, что при клике по ссылкам у вас появляется экран с ошибкой, которую React Router выводит по умолчанию.

Задание 2

А теперь создайте свою отдельную страничку с ошибкой 404, можете вывести на ней то, что хотите. Подключите ее, как показано в уроке. А теперь убедитесь, что при клике по ссылкам вы попадаете именно на нее.