Создание маршрута для редактирования данных в React Router

На прошлом уроке мы создали форму для редактирования в отдельном React компоненте EditProduct.

Давайте теперь напишем функцию загрузчика для нового маршрута сразу после импорта и перед функцией EditProduct. Она будет такой же, как и в product.jsx. В функцию будут передаваться URL параметры и далее мы будем получать продукт по его id:

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

Импортируем getProduct из forStorage.js:

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

А сейчас мы откроем наш main.jsx и импортируем созданный нами компонент EditProduct и загрузчик:

main.jsximport EditProduct, { loader as editProductLoader } from './routes/edit';

Затем добавим в массив children объект маршрута для редактирования сразу после маршрута для продукта:

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

Теперь запустим приложение, создадим продукт, кликнем по нему, а затем по кнопке редактирования и увидим нашу формочку.

Единственное, еще нам нужно сделать так, чтобы в полях формы перед редактированием были загружены текущие данные. Для этого мы импортируем в edit.jsx хук useLoaderData:

routes/edit.jsximport { Form, useLoaderData } from 'react-router-dom';

И применим его для получения данных из загрузчика в функции EditProduct. Добавим его перед командой return:

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

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

routes/edit.jsx<input
  placeholder="name"
  type="text"
  name="name"
  defaultValue={product.name}
/>

Для двух оставшихся инпутов значения будут соответственно 'product.cost' и 'product.amount'. Правда пока что данных в форме у нас нет.

Задание 1

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

Задание 2

Добавьте в массив children объект маршрута для редактирования.

Задание 3

Добавьте для вашей функции EditStudent требуемый в уроке код.