Mid #forms#react-hook-form#validation
Xử lý form phức tạp trong React: vì sao dùng react-hook-form (kèm Zod)?
⚡ Trả lời nhanh
react-hook-form dựa chủ yếu vào uncontrolled input + ref, nên hầu như không re-render theo từng phím; validation khai báo qua `register` hoặc schema (Zod/Yup qua resolver). Dùng `Controller` để bọc component controlled như Select của UI library.
const schema = z.object({ email: z.string().email(), age: z.coerce.number().min(18) });
type Form = z.infer<typeof schema>;
const { register, handleSubmit, formState: { errors, isSubmitting } } =
useForm<Form>({ resolver: zodResolver(schema) });
<form onSubmit={handleSubmit(async (v) => { await save(v); })}>
<input {...register("email")} />
{errors.email && <span>{errors.email.message}</span>}
<button disabled={isSubmitting}>Gửi</button>
</form>
- Ít re-render: chỉ subscribe phần cần dùng (
formState,watch,useWatch). Controller/useControllercho component không exposerefinput.- Dùng chung schema Zod cho client và server để validate hai phía.
useFieldArraycho danh sách field động.