Опанувати концепцію “Керованих компонентів” (Controlled Components) у React. Навчитися прив’язувати стан форми до хука useState, обробляти зміни полів вводу (onChange) та кастомно валідувати дані (наприклад, форму оформлення замовлення Checkout з ПР №6) перед їхньою відправкою onSubmit.
CheckoutForm.jsx.useState (об’єкт formData).value={formData.fullName}).handleChange для всіх текстових полів.onSubmit та скасування стандартної поведінки браузера (e.preventDefault()).Увага: Продовжуємо роботу над інтернет-магазином “TechShop” на React. Якщо раніше форма у checkout.html надсилала дані напряму на сервер (і сторінка перезавантажувалась), то тепер ми маємо повний контроль над даними завдяки useState.
components створіть файл CheckoutForm.jsx.class на className, for (у мітках) на htmlFor.useState з React.Створіть ОДИН об’єкт стану formData для збереження значень усіх полів, щоб не створювати 10 окремих змінних:
import { useState } from "react";
export function CheckoutForm() {
const [formData, setFormData] = useState({
fullName: "",
email: "",
phone: "",
delivery: "nova_poshta",
city: "kyiv",
comment: "",
});
// Інший код...
}
handleChange:
Напишіть функцію, яка спрацьовуватиме при кожному натисканні клавіші в будь-якому <input> чи <select>.
const handleChange = (e) => {
// Деструктуруємо властивості події (який інпут був змінений і що в нього ввели)
const { name, value, type, checked } = e.target;
// Якщо це чекбокс - беремо checked, інакше - value
const finalValue = type === "checkbox" ? checked : value;
setFormData((prevState) => ({
...prevState, // Копіюємо всі попередні дані: ПІБ, Місто, Телефон...
[name]: finalValue, // Перезаписуємо лише ТЕ поле, ім'я (name="") якого співпало!
}));
};
<input> повинен мати дві властивості: value (щоб React показував значення зі стану) та onChange (щоб React знав, що робити при введенні тексту). Крім того, атрибут name МУСИТЬ відповідати ключам в об’єкті formData (напр., “fullName”, “email”).
{
/* Приклад з ПІБ */
}
<input
type="text"
id="fullName"
name="fullName"
value={formData.fullName}
onChange={handleChange}
required
/>;
Submit (Відправка):
<form onSubmit={handleSubmit}>.Напишіть функцію handleSubmit:
const handleSubmit = (e) => {
e.preventDefault(); // Дуже важливо! Зупиняє перезавантаження сторінки
// Валідація (наприклад, перевірка чи номер містить більше 10 цифр)
if (formData.phone.length < 10) {
alert("Номер телефону занадто короткий!");
return; // Зупиняємо функцію
}
// Якщо все добре:
console.log("Дані готові до відправки на бекенд:", formData);
alert(`Дякуємо за замовлення, ${formData.fullName}!`);
};
<CheckoutForm /> в App.jsx. Заповніть форму, натисніть “Підтвердити” і подивіться в консоль — ви побачите красиво зібраний JS-об’єкт.git add . та git commit -m "Create controlled Checkout Form using useState".main.Форма замовлення “TechShop” стала “Керованою”. Жоден символ не може бути надрукований на екрані без відома React. Ми зібрали всі дані в єдиний об’єкт, готовий для відправки через fetch() на сервер у майбутньому.
handleChange ми використовуємо [name]: value у квадратних дужках? Як це називається в JavaScript (Обчислювальні імена властивостей - Computed property names)?...prevState перед оновленням конкретного поля? Що залишилося б у нашому об’єкті formData після введення імені?e.preventDefault(), який ми викликаємо першим у перехоплювачі handleSubmit? Розкажіть про стандартну поведінку тегу <form>.htmlFor в React відрізняється від for у звичайному HTML, і чому слово for не можна використовувати в JSX?