فرم (Form)
مدیریت فرم با react-hook-form و zod
معرفی
کامپوننت Form برای مدیریت فرمها با استفاده از react-hook-form و zod استفاده میشود.
چه زمانی استفاده کنیم:
- وقتی فرم نیاز به اعتبارسنجی (validation) دارد
- برای فرمهای چند فیلدی با مدیریت state پیچیده
- وقتی نیاز به پیامهای خطای فارسی و بازخورد بصری دارید
چه زمانی استفاده نکنیم:
- برای یک یا دو فیلد ساده بدون validation — از
Inputمستقیم استفاده کنید - وقتی از کتابخانه validation دیگری استفاده میکنید — Form wrapper با react-hook-form integrate شده
نام کاربری شما در پنل نمایش داده میشود.
نصب Dependencies
pnpm add react-hook-form @hookform/resolvers zodاستفاده
import { useForm } from 'react-hook-form'
import { zodResolver } from '@hookform/resolvers/zod'
import * as z from 'zod'
import {
Form,
FormControl,
FormDescription,
FormField,
FormItem,
FormLabel,
FormMessage,
} from '@parto-system-design/ui'
import { Input, Button } from '@parto-system-design/ui'
const formSchema = z.object({
username: z.string().min(2, 'نام کاربری باید حداقل 2 کاراکتر باشد'),
})
export default function MyForm() {
const form = useForm<z.infer<typeof formSchema>>({
resolver: zodResolver(formSchema),
defaultValues: {
username: '',
},
})
function onSubmit(values: z.infer<typeof formSchema>) {
console.log(values)
}
return (
<Form {...form}>
<form onSubmit={form.handleSubmit(onSubmit)} className="space-y-4">
<FormField
control={form.control}
name="username"
render={({ field }) => (
<FormItem>
<FormLabel>نام کاربری</FormLabel>
<FormControl>
<Input placeholder="نام کاربری" {...field} />
</FormControl>
<FormDescription>این نام کاربری عمومی شما است</FormDescription>
<FormMessage />
</FormItem>
)}
/>
<Button type="submit">ارسال</Button>
</form>
</Form>
)
}کامپوننتها
Form— provider اصلی (FormProviderاز react-hook-form)FormField— wrapper یک فیلد با کنترل react-hook-formFormItem— ظرف یک آیتم فرم (label + input + description + message)FormLabel— برچسب فیلد (بهصورت خودکار قرمز در حالت خطا)FormControl— wrapper اطراف input که aria props را تزریق میکندFormDescription— متن توضیحی زیر فیلدFormMessage— پیام خطای validation
Props
FormField
FormItem
FormLabel
برچسب بهصورت خودکار htmlFor را از context میگیرد و در صورت خطا رنگ قرمز میشود.
FormControl
FormControl بهصورت خودکار id، aria-describedby و aria-invalid را به فرزند خود تزریق میکند.
FormDescription
FormMessage
حالتها و انواع
فرم ساده
یک فیلد با validation ساده (مانند حداقل طول کاراکتر).
فرم چند فیلدی
ترکیب چندین FormField در یک فرم با schema واحد.
با Zod Schema
استفاده از zodResolver برای اعتبارسنجی type-safe.
راهنمای استفاده
بکنید
- همیشه از
FormMessageاستفاده کنید تا خطاهای validation نمایش داده شوند - ازFormDescriptionبرای ارائه راهنمای تکمیلی به کاربر استفاده کنید - پیامهای خطای Zod را به فارسی رسمی بنویسید
نکنید
- برای فرمهای ساده بدون validation از Form استفاده نکنید —
Field+Inputکافی است -FormControlرا فراموش نکنید — بدون آن aria props تزریق نمیشوند - فیلدهای فرم را بدونFormLabelرها نکنید — هر فیلد باید برچسب داشته باشد
دسترسیپذیری
FormControlبهصورت خودکارaria-invalidوaria-describedbyرا تنظیم میکندFormLabelباhtmlForبه فیلد مرتبط میشودFormMessageباidمشخص، توسط screen reader خوانده میشود- در حالت خطا،
FormLabelبه رنگ قرمز تغییر میکند و بازخورد بصری ارائه میدهد - پشتیبانی کامل از RTL
کامپوننتهای مرتبط
- اگر نیاز به فیلدهای فرم بدون react-hook-form دارید → Field
- اگر نیاز به راهنمای کامل طراحی فرم دارید → الگوهای فرم
- اگر نیاز به جزئیات اعتبارسنجی Zod دارید → اعتبارسنجی فرم
- اگر فقط نیاز به یک label مستقل دارید → Label