Научись управлять каждым полем формы через состояние React, чтобы проверять и отправлять надёжные данные.
Открыть этот урок в KodokonВ React форма становится предсказуемой, когда каждое поле контролируемое: отображаемое значение приходит из состояния компонента, и каждое нажатие клавиши проходит через onChange, чтобы обновить это состояние. DOM больше не источник истины - им становится твоё состояние. На практике ты связываешь проп value с переменной состояния и передаёшь обработчик, который вызывает функцию обновления.
import { useState } from "react";
function EmailField() {
const [email, setEmail] = useState("");
return (
<input
type="email"
value={email}
onChange={(e) => setEmail(e.target.value)}
/>
);
}В настоящей форме редко бывает всего одно поле. Вместо того чтобы нагромождать вызовы useState, собери значения в один объект и напиши универсальный обработчик. Атрибут name каждого поля должен точно совпадать с ключом объекта: именно это подсказывает обработчику, какое свойство обновить.
const [form, setForm] = useState({
username: "",
password: "",
});
function handleChange(e) {
const { name, value } = e.target;
setForm((prev) => ({ ...prev, [name]: value }));
}Остаётся отправка. По умолчанию браузер перезагружает страницу при отправке формы: вызывай e.preventDefault() в начале своего обработчика onSubmit. Это же и самое подходящее место, чтобы проверить данные перед отправкой, ведь всё состояние формы уже под рукой.
function handleSubmit(e) {
e.preventDefault();
if (form.username.trim() === "") {
alert("Username is required.");
return;
}
console.log("Submitting:", form);
}
return (
<form onSubmit={handleSubmit}>
<input
name="username"
value={form.username}
onChange={handleChange}
/>
<button type="submit">Create account</button>
</form>
);value={email} в <input>, не указав onChange. Что произойдёт?e.preventDefault() в обработчике onSubmit?