Форма для редактирования данных в Redux

Теперь у нас есть редьюсер для изменения данных в store. На этом уроке мы создадим форму, с помощью которой мы сможем редактировать данные продукта.

Давайте откроем наше приложение с продуктами и создадим в папке products файл EditProductForm.jsx. Создание компонента EditProductForm будет аналогично NewProductForm, за исключением некоторых отличий, на которых мы будем останавливаться. Поэтому скопируйте полностью код NewProductForm.jsx и вставьте его в созданный файл EditProductForm.jsx. Теперь начнем по порядку.

Уберите из импорта nanoid, здесь нам не нужно генерировать id. Замените импорт productAdded на productUpdated, ведь здесь мы будем использовать action для обновления, а не для добавления продукта.

Далее поменяем название функции нашего компонента с NewProductForm на EditProductForm.

Перед тем, как мы заведем локальные стейты в функции EditProductForm для name, desc, price и amount, давайте вставим еще несколько строчек кода. Как мы уже упомянали ранее, здесь нам не нужно генерировать id. Теперь наша задача получить его из данных изменяемого продукта. Мы уже так делали при создании отдельной странички для продукта. Итак, получим id при помощи хука useParams, а затем найдем нужный нам продукт, используя хук useSelector (не забудьте импортировать оба хука в начале файла):

let params = useParams() const { productId } = params const product = useSelector((state) => state.products.find((product) => product.id === productId) )

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

const [name, setName] = useState(product.name)

После назначения переменной для useDispatch давайте внесем еще одну строчку кода на этот раз для хука useNavigate. Мы будем его использовать для возврата на страницу с продуктом, когда пользователь сохранит внесенные в форме изменения:

const navigate = useNavigate()

Также импортируем этот хук в начале файла:

import { useNavigate, useParams } from 'react-router-dom'

Далее у нас идут обработчики для полей ввода. А после них нам необходимо подправить функцию onSaveProductClick. Теперь в ней при клике мы будем отправлять экшен productUpdated с полученным id и измененными данными в виде объекта. После добавим наш navigate, для перехода на страничку измененного продукта:

const onSaveProductClick = () => { if (name && desc && price && amount) { dispatch( productUpdated({ id: productId, name, desc, price, amount, }) ) navigate(`/products/${productId}`) } }

Осталось только в нашей возвращаемой верстке найти строчку:

<h2>Add a New Product</h2>

И заменить ее на:

<h2>Edit Product</h2>

Откройте ваше приложение со студентами. Создайте файл EditStudentForm.jsx по аналогии с NewStudentForm.jsx. Внесите в него изменения, как показано в уроке.



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