Форма для рэдагавання даных у 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. Унясіце
ў яго змены, як паказана ў уроку.