React Hook Form dengan Claude Code
Pelajari tentang react hook form menggunakan Claude Code. Dilengkapi tips praktis dan contoh kode.
React Hook Formでハイperformaなformをpembangunan
React Hook Form 非制御komponenベース formlibrary 、rendering回数 最小限 抑えたcepatなform pembangunan bisa dilakukan.Claude Code 使えば、kompleksなform設計 juga 素早くimplementasidimungkinkan.
dasar的なform構成
Claude Code form全体 設計 依頼し.
> React Hook Form dan Zod dengan 問い合わせform buatkan.
> 名前、メール、kategori選択、本文 含めて。errortampilan juga つけて。
import { useForm } from "react-hook-form";
import { zodResolver } from "@hookform/resolvers/zod";
import { z } from "zod";
const contactSchema = z.object({
name: z.string().min(1, "お名前 input ください"),
email: z.string().email("efektifなメールアドレス input ください"),
category: z.enum(["general", "support", "billing", "other"], {
errorMap: () => ({ message: "kategori 選択 ください" }),
}),
message: z
.string()
.min(10, "本文 10文字以上 input ください")
.max(2000, "本文 2000文字以内 input ください"),
});
type ContactFormData = z.infer<typeof contactSchema>;
function ContactForm() {
const {
register,
handleSubmit,
formState: { errors, isSubmitting },
reset,
} = useForm<ContactFormData>({
resolver: zodResolver(contactSchema),
defaultValues: {
category: undefined,
},
});
const onSubmit = async (data: ContactFormData) => {
await sendContactForm(data);
reset();
};
return (
<form onSubmit={handleSubmit(onSubmit)}>
<div>
<label htmlFor="name">お名前</label>
<input id="name" {...register("name")} />
{errors.name && <p role="alert">{errors.name.message}</p>}
</div>
<div>
<label htmlFor="email">メールアドレス</label>
<input id="email" type="email" {...register("email")} />
{errors.email && <p role="alert">{errors.email.message}</p>}
</div>
<div>
<label htmlFor="category">カテゴリ</label>
<select id="category" {...register("category")}>
<option value="">選択してください</option>
<option value="general">一般</option>
<option value="support">サポート</option>
<option value="billing">請求</option>
<option value="other">その他</option>
</select>
{errors.category && <p role="alert">{errors.category.message}</p>}
</div>
<div>
<label htmlFor="message">本文</label>
<textarea id="message" rows={5} {...register("message")} />
{errors.message && <p role="alert">{errors.message.message}</p>}
</div>
<button type="submit" disabled={isSubmitting}>
{isSubmitting ? "pengiriman中..." : "pengiriman"}
</button>
</form>
);
}
動的フィールド(useFieldArray)
可variabel フィールド manajemen pola.
import { useForm, useFieldArray } from "react-hook-form";
interface InvoiceForm {
clientName: string;
items: {
description: string;
quantity: number;
unitPrice: number;
}[];
notes: string;
}
function InvoiceForm() {
const { register, control, handleSubmit, watch } = useForm<InvoiceForm>({
defaultValues: {
items: [{ description: "", quantity: 1, unitPrice: 0 }],
},
});
const { fields, append, remove } = useFieldArray({
control,
name: "items",
});
const watchItems = watch("items");
const total = watchItems.reduce(
(sum, item) => sum + (item.quantity || 0) * (item.unitPrice || 0),
0
);
return (
<form onSubmit={handleSubmit(onSubmit)}>
<input {...register("clientName")} placeholder="client名" />
{fields.map((field, index) => (
<div key={field.id}>
<input
{...register(`items.${index}.description`)}
placeholder="品目"
/>
<input
type="number"
{...register(`items.${index}.quantity`, { valueAsNumber: true })}
/>
<input
type="number"
{...register(`items.${index}.unitPrice`, { valueAsNumber: true })}
/>
<button type="button" onClick={() => remove(index)}>
削除
</button>
</div>
))}
<button
type="button"
onClick={() => append({ description: "", quantity: 1, unitPrice: 0 })}
>
品目を追加
</button>
<p>合計: ¥{total.toLocaleString()}</p>
<button type="submit">保存</button>
</form>
);
}
マルチステップform
ウィザード形式 form juga Claude Code efisien implementasi bisa dilakukan.
import { useForm, FormProvider, useFormContext } from "react-hook-form";
interface MultiStepFormData {
// Step 1
firstName: string;
lastName: string;
email: string;
// Step 2
company: string;
role: string;
// Step 3
plan: "free" | "pro" | "enterprise";
agreeToTerms: boolean;
}
function MultiStepForm() {
const [step, setStep] = useState(1);
const methods = useForm<MultiStepFormData>({
mode: "onChange",
});
const next = async () => {
const fieldsToValidate = getFieldsByStep(step);
const isValid = await methods.trigger(fieldsToValidate);
if (isValid) setStep((s) => s + 1);
};
const prev = () => setStep((s) => s - 1);
return (
<FormProvider {...methods}>
<form onSubmit={methods.handleSubmit(onSubmit)}>
{step === 1 && <PersonalInfoStep />}
{step === 2 && <CompanyInfoStep />}
{step === 3 && <PlanSelectionStep />}
<div>
{step > 1 && <button type="button" onClick={prev}>戻る</button>}
{step < 3 ? (
<button type="button" onClick={next}>次へ</button>
) : (
<button type="submit">完了</button>
)}
</div>
</form>
</FormProvider>
);
}
function PersonalInfoStep() {
const { register, formState: { errors } } = useFormContext<MultiStepFormData>();
return (
<div>
<input {...register("firstName", { required: "必須項目 す" })} />
<input {...register("lastName", { required: "必須項目 す" })} />
<input {...register("email", { required: "必須項目 す" })} />
</div>
);
}
カスタムフィールドkomponen
再pemanfaatandimungkinkanなフィールドkomponen 設計 pola.
import { Controller, useFormContext, FieldPath } from "react-hook-form";
interface FormFieldProps<T extends Record<string, any>> {
name: FieldPath<T>;
label: string;
type?: "text" | "email" | "number" | "textarea";
placeholder?: string;
}
function FormField<T extends Record<string, any>>({
name,
label,
type = "text",
placeholder,
}: FormFieldProps<T>) {
const { register, formState: { errors } } = useFormContext<T>();
const error = errors[name];
return (
<div className="form-field">
<label htmlFor={name}>{label}</label>
{type === "textarea" ? (
<textarea id={name} {...register(name)} placeholder={placeholder} />
) : (
<input id={name} type={type} {...register(name)} placeholder={placeholder} />
)}
{error && <p className="error">{error.message as string}</p>}
</div>
);
}
Summary
React Hook Form 非制御komponenベース アプローチ より、大規模なform juga 優れたperforma 発揮.Claude Code pemanfaatanすれば、validasiintegrasi、動的フィールド、マルチステップform dll. kompleksなpola juga waktu singkat implementasidimungkinkan.
validasi 詳細 Zodvalidasi実践panduan 、UIkomponen dan integrasi Radix UIkomponenpemanfaatan silakan lihat.React Hook Form公式dokumen juga konfirmasi おき.
Related Posts
Cara Mempercepat Side Project dengan Claude Code [Dengan Contoh]
Pelajari cara mempercepat project development personal secara drastis menggunakan Claude Code. Dilengkapi contoh nyata dan workflow praktis dari ide hingga deployment.
Cara Mengotomatisasi Refactoring dengan Claude Code
Pelajari cara mengotomatisasi code refactoring secara efisien menggunakan Claude Code. Dilengkapi prompt praktis dan pola refactoring konkret untuk project nyata.
Panduan Lengkap Konfigurasi CORS dengan Claude Code
Pelajari tentang panduan lengkap konfigurasi CORS menggunakan Claude Code. Dilengkapi tips praktis dan contoh kode.