АКЦЫЯ: бясплатныя месячныя курсы па стварэнні сайтаў
на выбар: вёрстка, JavaScript, PHP, Python або фрэймворкі. Сёння апошні дзень для запісу! Націскай!
⊗jsrxPmRDEF 24 of 57 menu

Форма для рэдагавання даных у 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. Мы будзем яго выкарыстоўваць для вяртання на старонку з прадуктам, калі карыстальнiк захоча ўнесеныя ў форме змены:

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(`/by/products/${productId}`); } }

Засталося толькі ў нашай якая вяртаецца вёрстцы знайсці радок:

<h2>Add a New Product</h2>

І замяніць яе на:

<h2>Edit Product</h2>

Адкрыйце ваша прыкладанне са студэнтамі. Стварыце файл EditStudentForm.jsx па аналогіі з NewStudentForm.jsx. Унясіце ў яго змены, як паказана ў уроку.

byenru