กลับไปหน้าหลัก

บทที่ 11: React Hook Form

Minimal Re-renders
Easy Validation
TypeScript
Bundle Size
📝 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
รายชื่อพนักงาน
พนักงานคนที่ 1

บาท


สรุปข้อมูล

จำนวนพนักงาน: 1 คน
เงินเดือนรวม: 15,000 บาท/เดือน

💡 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