Маршрут без пути в React Router

На этом уроке мы рассмотрим еще одно полезное свойство маршрута без пути.

Вы знаете, что для каждого объекта маршрута вы можете добавить свойство errorElement и в качестве значения установить тот элемент, который хотите отображать при возникновении ошибки.

Но что если у нас errorElement будет одинаковым для всех маршрутов? Можно, конечно наляпать одно и тоже для каждого, а можно воспользоваться маршрутом без пути, обернуть в него интересующие нас дочерние маршруты. Тогда в случае возникновения ошибки на одном из них, наш маршрут без пути будет их отлавливать и отображать свой errorElement.

Зайдем в main.jsx файл и обернем в маршрут без пути все наши дочерние маршруты, сделав их дочерними для него (в свою очередь этот маршрут станет дочерним для корневого), не забудем добавить ему также свойство errorElement:

const router = createBrowserRouter([ { path: '/', element: <Root />, errorElement: <ErrorPage404 />, loader: rootLoader, action: rootAction, children: [ { errorElement: <ErrorPage404 />, children: [ { index: true, element: <Index /> }, { path: 'products/:productId', element: <Product />, loader: productLoader, }, { path: 'products/:productId/edit', element: <EditProduct />, loader: editProductLoader, action: editAction, }, { path: 'products/:productId/delete', action: deleteAction, }, ], }, ], }, ]);

Как проверить теперь работу этого кода? Можно добавить строчку с выбрасыванием ошибки (не забудьте потом ее убрать, когда проверим ;) ). Давайте, к примеру, добавим ее первой строчкой в функцию action для маршрута удаления продукта, тогда при попытке удалить продукт мы увидим ошибку:

export async function action({ params }) { throw new Error('error'); await deleteProduct(params.productId); return redirect('/'); }

Теперь попробуйте удалить какой-нибудь продукт.

Возьмите приложение, созданное вами в заданиях к прошлым урокам. Пользуясь материалами урока, оберните ваши дочерние маршруты в маршрут без пути со свойством errorElement и проверьте, что это работает.



Чат с GPT Компилятор