Тема: Валідація введених даних
Мета: Навчитися працювати з формами в React, опанувати концепцію керованих компонентів (controlled components) та реалізувати кастомну логіку валідації без використання сторонніх бібліотек для глибокого розуміння процесів обробки даних.
Необхідні інструменти: Проєкт, розроблений на попередніх заняттях (Vite + React), редактор коду (VS Code).
На цьому занятті ми додамо функціонал додавання нового студента до нашого списку, забезпечивши перевірку коректності введених даних (імені, балів тощо).
Створіть нову гілку для роботи з формами:
git checkout -b feature/form-validation
У React стан форми зазвичай зберігається в state компонента.
AddStudentForm.jsx.useState для кожного поля (ім’я, бал) або один об’єкт для всієї форми.value інпутів до стану та додайте обробник onChange.Реалізуйте перевірку даних перед тим, як дозволити їх збереження.
errors (об’єкт) для зберігання повідомлень про помилки.&&.Для створення надійної форми необхідно реалізувати три аспекти:
Функція валідації повинна приймати об’єкт із даними форми та повертати об’єкт із помилками. Якщо поле проходить перевірку, відповідний ключ в об’єкті помилок залишається порожнім.
Приклад логіки валідації:
const validate = (values) => {
const errors = {};
// Перевірка імені
if (!values.name.trim()) {
errors.name = "Ім'я є обов'язковим для заповнення";
} else if (values.name.length < 2) {
errors.name = "Ім'я повинно містити принаймні 2 символи";
}
// Перевірка балів (від 0 до 100)
if (values.score === "") {
errors.score = "Будь ласка, введіть бал";
} else if (isNaN(values.score) || values.score < 0 || values.score > 100) {
errors.score = "Бал повинен бути числом від 0 до 100";
}
return errors;
};
Використовуйте раніше створений компонент Input та стан для відстеження помилок.
Покроковий алгоритм у коді:
import { useState } from "react";
import Input from "./atoms/Input"; // Використовуємо ваш компонент
import Button from "./atoms/Button";
function AddStudentForm({ onAddStudent }) {
const [formData, setFormData] = useState({ name: "", score: "" });
const [errors, setErrors] = useState({});
const handleChange = (e) => {
const { name, value } = e.target;
setFormData({ ...formData, [name]: value });
// Очищення помилки під час введення (опціонально)
if (errors[name]) {
setErrors({ ...errors, [name]: "" });
}
};
const handleSubmit = (e) => {
e.preventDefault();
// Виклик валідації перед відправкою
const validationErrors = validate(formData);
if (Object.keys(validationErrors).length === 0) {
// Якщо помилок немає — додаємо студента
onAddStudent({
id: Date.now(),
name: formData.name,
score: Number(formData.score),
});
setFormData({ name: "", score: "" }); // Очищення форми
} else {
setErrors(validationErrors); // Відображення помилок
}
};
return (
<form onSubmit={handleSubmit}>
<Input
label="Прізвище та ім'я:"
name="name"
value={formData.name}
onChange={handleChange}
placeholder="Введіть ПІБ"
/>
{/* Використання умовного рендерингу для помилок */}
{errors.name && <p style=>{errors.name}</p>}
<Input
label="Бал студента:"
name="score"
type="number"
value={formData.score}
onChange={handleChange}
placeholder="0-100"
/>
{errors.score && <p style=>{errors.score}</p>}
<Button type="submit">Додати студента</Button>
</form>
);
}
trim(): Завжди використовуйте .trim() при перевірці текстових полів, щоб користувач не міг обійти валідацію, ввівши лише пробіли.onSubmit: Переконайтеся, що обробник призначений саме тегу <form>, а не кнопці submit. Це дозволить формі спрацьовувати також при натисканні клавіші Enter.errors порожній), не забувайте очищати стан formData, щоб підготувати форму до наступного введення.Перед завершенням роботи перевірте:
onSubmit до тегу <form>.event.preventDefault(), щоб запобігти перезавантаженню сторінки.git add .
git commit -m "feat: implement student form with validation"
main.disabled), якщо форма містить помилки або обов’язкові поля не заповнені.useRef при роботі з формами і в яких випадках це виправдано?event.preventDefault() при обробці події submit?Реалізована форма з валідацією, яка дозволяє динамічно додавати нові об’єкти до інтерфейсу, гарантуючи цілісність та коректність даних.