表单处理
20.1 受控组件
javascript
function ControlledForm() {
const [formData, setFormData] = useState({
name: "",
email: "",
message: "",
subscribe: false,
});
const handleChange = (e) => {
const { name, type, value, checked } = e.target;
setFormData((prev) => ({
...prev,
[name]: type === "checkbox" ? checked : value,
}));
};
const handleSubmit = (e) => {
e.preventDefault();
console.log("Form data:", formData);
};
return (
<form onSubmit={handleSubmit}>
<input
type="text"
name="name"
value={formData.name}
onChange={handleChange}
required
/>
<input
type="email"
name="email"
value={formData.email}
onChange={handleChange}
required
/>
<textarea
name="message"
value={formData.message}
onChange={handleChange}
/>
<label>
<input
type="checkbox"
name="subscribe"
checked={formData.subscribe}
onChange={handleChange}
/>
Subscribe to newsletter
</label>
<button type="submit">Submit</button>
</form>
);
}20.2 表单验证
javascript
function FormWithValidation() {
const [values, setValues] = useState({ email: "", password: "" });
const [errors, setErrors] = useState({});
const validateForm = () => {
const newErrors = {};
if (!values.email) newErrors.email = "Email is required";
else if (!/\S+@\S+\.\S+/.test(values.email))
newErrors.email = "Email is invalid";
if (!values.password) newErrors.password = "Password is required";
else if (values.password.length < 6)
newErrors.password = "Password must be at least 6 characters";
setErrors(newErrors);
return Object.keys(newErrors).length === 0;
};
const handleChange = (e) => {
const { name, value } = e.target;
setValues((prev) => ({ ...prev, [name]: value }));
};
const handleSubmit = (e) => {
e.preventDefault();
if (validateForm()) {
console.log("Form is valid:", values);
}
};
return (
<form onSubmit={handleSubmit}>
<div>
<input
type="email"
name="email"
value={values.email}
onChange={handleChange}
/>
{errors.email && <span style={{ color: "red" }}>{errors.email}</span>}
</div>
<div>
<input
type="password"
name="password"
value={values.password}
onChange={handleChange}
/>
{errors.password && (
<span style={{ color: "red" }}>{errors.password}</span>
)}
</div>
<button type="submit">Login</button>
</form>
);
}