📝 Basic React Hook Form
'use client';
import { useForm } from 'react-hook-form';
interface FormData {
firstName: string;
lastName: string;
email: string;
}
export default function BasicForm() {
const {
register,
handleSubmit,
formState: { errors },
} = useForm<FormData>();
const onSubmit = (data: FormData) => {
console.log(data);
};
return (
<form onSubmit={handleSubmit(onSubmit)}>
<input
{...register('firstName', { required: 'ชื่อจำเป็น' })}
placeholder="ชื่อ"
/>
{errors.firstName && <p>{errors.firstName.message}</p>}
<input
{...register('lastName', { required: 'นามสกุลจำเป็น' })}
placeholder="นามสกุล"
/>
{errors.lastName && <p>{errors.lastName.message}</p>}
<input
{...register('email', {
required: 'อีเมลจำเป็น',
pattern: {
value: /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}$/i,
message: 'รูปแบบอีเมลไม่ถูกต้อง'
}
})}
placeholder="อีเมล"
type="email"
/>
{errors.email && <p>{errors.email.message}</p>}
<button type="submit">ส่งข้อมูล</button>
</form>
);
}🎯 Interactive Demos
📋 Basic Form with React Hook Form + Zod
🔍 Live Data Preview
{
"firstName": "",
"lastName": "",
"email": "",
"age": 18
}👥 Dynamic Form with useFieldArray
💡 Best Practices สำหรับ React Hook Form
- ใช้ Zod สำหรับ validation
Type-safe validation และ better error messages
- กำหนด defaultValues เสมอ
ป้องกัน controlled/uncontrolled component warnings
- ใช้ Controller สำหรับ custom components
MUI, Ant Design หรือ custom components ที่ไม่รองรับ ref
- แยก form sections เป็น components
ใช้ FormProvider สำหรับ large forms
- ใช้ watch() อย่างระมัดระวัง
อาจทำให้ re-render บ่อย ให้ใช้ selector pattern