Атрыманне дадзеных загрузніка па 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, падключыце яго, скарыстайцеся дадзенымі з яго для старонкі са студэнтам.