React Hook Form

Merid'in form kontrolleri native elemanların üzerine ince sarmalayıcılar olduğu için çoğu, React Hook Form'un register'ıyla olduğu gibi çalışır. Kendi state'ini tutan üç kontrol, yani Select, RadioGroup ve Switch, Controller üzerinden bağlanır.

Projeleri düzenleyebilir ve kişi davet edebilir.Salt okunur. Her planda ücretsiz.

Hangi kontrol için hangi API

KontrolKullanNeden
Input, Textarea, NativeSelectregisterref, name, onChange ve onBlur'u native elemana iletirler.
CheckboxregisterGerçek bir <input type="checkbox"> render'lar; değeri boolean'dır.
SelectControllerÖzel bir listbox. Change event'i değil, value / onValueChange alır.
RadioGroup + RadioControllerSeçili değeri ve gezici focus'u (roving focus) grup yönetir.
SwitchControllerBir <button role="switch">; checked / onCheckedChange alır.
SegmentedControlControllerSelect ile aynı: value / onValueChange.

Hatalar

Mesajı Field'ın error prop'una ver. Field bu durumda kontrole aria-invalid="true" koyar, mesajı aria-describedby'a ekler ve geçersiz stilini gösterir. error undefined olduğunda bu bağlantılar yeniden kaldırılır, yani ek bir state gerekmez.

tsx
<Field label="E-posta" required error={errors.email?.message}>
  <Input type="email" {...register("email", { required: "E-posta adresini gir." })} />
</Field>

Checkbox'ın kendi etiketini saran bir Field'ı yoktur; bu yüzden invalid ver ve mesajı kendin render'la (yukarıdaki örnekte olduğu gibi).

Field içinde Select

Select.Trigger henüz Field'ın context'ini okumuyor. İkisine aynı id'yi ver: böylece Field etiketi tetikleyiciyi gösterir. invalid'i de fieldState'ten geçir. mode: "onTouched" doğru anda doğrulasın diye listbox kapanınca field.onBlur'u çağır.

tsx
<Field id="plan" label="Plan" error={fieldState.error?.message}>
  <Select.Root value={field.value} onValueChange={field.onChange}
    onOpenChange={(open) => { if (!open) field.onBlur(); }}>
    <Select.Trigger id="plan" ref={field.ref} invalid={fieldState.invalid} />
    <Select.Content>…</Select.Content>
  </Select.Root>
</Field>

ref={field.ref} verirsen, gönderimde doğrulama başarısız olduğunda React Hook Form tetikleyiciye focus verebilir.

Gönderim state'i

Butonun loading prop'u için formState.isSubmitting'i kullan. Yükleniyor durumundaki bir Button genişliğini korur, spinner gösterir, aria-busy koyar ve tıklamaları yok sayar; böylece ilk gönderim sürerken ikincisi tetiklenemez.

Şema ile doğrulama

rules yerine bir şemayla doğrulamak için Zod ile doğrulama sayfasına bak.