Получение данных загрузчика по URL параметрам в React Router

На прошлом уроке мы написали функцию для получения данных странички продукта, давайте импортируем getProduct в файле product.jsx:

routes/product.jsximport { getProduct } from '../forStorage';

Напишем функцию загрузчика loader сразу после импорта и перед функцией Product. Передадим в нее URL параметры:

routes/product.jsxexport async function loader({ params }) {
  const product = await getProduct(params.productId);
  return { product };
}

Также импортируем хук useLoaderData для использования данных, полученных загрузчиком:

routes/product.jsximport { useLoaderData } from 'react-router-dom';

Применим useLoaderData, соответственно заменив строку с созданием объекта product в начале функции Product на следующую:

routes/product.jsxconst { product } = useLoaderData();

И, конечно же, поменяем немного нашу верстку, поскольку мы убрали старый объект product. Заменим содержимое абзацев:

routes/product.jsx<p>Name: {product.name}</p>
<p>Cost: {product.cost}</p>
<p>Amount: {product.amount}</p>

На следующее:

routes/product.jsx<p>Name: {product.name ? product.name : <i>unnamed</i>}</p>
<p>Cost: {product.cost ? product.cost : <i>unknown</i>}</p>
<p>Amount: {product.amount ? product.amount : <i>unknown</i>}</p>

Нам осталось открыть main.jsx и добавить туда импорт loader, назовем его productLoader:

main.jsximport Product, {
  loader as productLoader,
} from './routes/product';

И прописать его в качестве загрузчика для объекта маршрута страницы с продуктом, добавив его в children после свойства element:

main.jsxchildren: [
  {
    path: 'products/:productId',
    element: <Product />,
    loader: productLoader,
  },
],

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

Задание 1

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