React İle React Hook Form Kullanarak Gelişmiş Form Doğrulaması Nasıl Yapılır?

React İle React Hook Form Kullanarak Gelişmiş Form Doğrulaması Nasıl Yapılır?
React İle React Hook Form Kullanarak Gelişmiş Form Doğrulaması Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Bu eğitimi takip edebilmek için temel düzeyde React ve JavaScript (ES6+) bilginizin olması yeterlidir. Projenizde kullanacağımız temel araçlar ve sürümler şunlardır:

  • Node.js (v18 veya üzeri)
  • React (v18 veya v19)
  • React Hook Form (v7+)
  • Zod (Doğrulama şemaları için)
  • @hookform/resolvers (Doğrulama kütüphanelerini bağlamak için)

Öncelikle projenizin terminalinde gerekli paketleri yükleyerek işe başlayın:

npm install react-hook-form zod @hookform/resolvers

React Hook Form Temelleri: useForm Hook Yapısı

React Hook Form'un kalbi useForm kancasıdır (hook). Bu kanca, formun durumunu yönetmek için gerekli olan register, handleSubmit ve formState gibi fonksiyonları sağlar. register fonksiyonu, bir input alanını formun geri kalanıyla ilişkilendirmenize olanak tanır.

import { useForm } from "react-hook-form";

function BasitForm() {
  const { register, handleSubmit } = useForm();

  const onSubmit = (data) => console.log(data);

  return (
    
      
      Gönder
    
  );
}

Yukarıdaki örnekte ...register("kullaniciAdi") kullanımı, input alanını React Hook Form'a kaydeder. Bu sayede form gönderildiğinde veri nesnesi otomatik olarak oluşturulur.

Zod ile Şema Tabanlı Doğrulama

Gelişmiş projelerde doğrulama kurallarını tek bir yerde toplamak için Zod gibi şema tabanlı kütüphaneler kullanılır. Bu yaklaşım, kodun bakımını kolaylaştırır ve tip güvenliğini (TypeScript kullanıyorsanız) artırır.

import { z } from "zod";
import { zodResolver } from "@hookform/resolvers/zod";

const formSemasi = z.object({
  email: z.string().email("Geçerli bir e-posta adresi giriniz."),
  yas: z.number().min(18, "En az 18 yaşında olmalısınız.")
});

Bu şemayı useForm hook'una resolver parametresiyle bağlayarak doğrulama mantığını devreye alırsınız. Bu yöntem, her input için ayrı ayrı hata kontrolü yazma zahmetinden sizi kurtarır.

Hata Yönetimi ve Kullanıcı Geri Bildirimi

Form doğrulamasında en kritik adım, kullanıcıya hataları anlamlı bir şekilde göstermektir. formState nesnesi içindeki errors objesi, doğrulama başarısız olduğunda hata mesajlarını tutar.

const { register, handleSubmit, formState: { errors } } = useForm({
  resolver: zodResolver(formSemasi)
});

// JSX içinde kullanımı
{errors.email && 

{errors.email.message}

}

Bu yapı, kullanıcı hatalı bir veri girdiğinde anında geri bildirim almanızı sağlar. errors objesi, Zod şemanızda tanımladığınız hata mesajlarını dinamik olarak render eder.

Performans Optimizasyonu ve Kontrollü Bileşenler

React Hook Form, varsayılan olarak "kontrolsüz" (uncontrolled) çalışır. Bu, her tuş vuruşunda tüm formun yeniden render edilmesini engeller. Ancak, React Select veya DatePicker gibi dış kütüphanelerle çalışırken Controller bileşenini kullanmanız gerekebilir.

import { Controller } from "react-hook-form";

 }
/>

Controller, dış kütüphanelerin değerlerini React Hook Form'un state yapısına dahil eder. Bu sayede hem performanslı kalırsınız hem de karmaşık UI bileşenlerini formunuza entegre edebilirsiniz.

Karşılaştırma: Form Yönetim Yaklaşımları

Yöntem Performans Kod Karmaşıklığı Doğrulama
useState (Geleneksel) Düşük (Her harfte render) Yüksek Manuel
React Hook Form Yüksek (Minimal render) Düşük Resolver Entegrasyonu

Güvenlik Uyarısı: İstemci tarafındaki (client-side) doğrulama, kullanıcı deneyimi içindir. Veri güvenliği için sunucu tarafında (backend) mutlaka aynı doğrulama kurallarını (Zod veya Joi ile) tekrar uygulayın. İstemci tarafı manipüle edilebilir.

Sıkça Sorulan Sorular

React Hook Form neden useState'den daha hızlı?

React Hook Form, input değerlerini state içinde tutmak yerine ref (referans) kullanarak yönetir. Bu sayede formdaki her bir değişiklik tüm bileşeni yeniden render etmez, sadece ilgili input güncellenir.

Zod kullanmak zorunlu mu?

Hayır, zorunlu değildir. Ancak karmaşık formlarda doğrulama kurallarını merkezi bir şemada tutmak, kodun sürdürülebilirliği açısından şiddetle önerilir.

Async doğrulama nasıl yapılır?

Zod şemanızda refine metodunu kullanarak veya useForm içindeki resolver yapısı ile asenkron (API üzerinden) kontrolleri kolayca gerçekleştirebilirsiniz.

Formu sıfırlamak için ne yapmalıyım?

useForm hook'undan dönen reset fonksiyonunu kullanarak form verilerini ve hata durumlarını tek bir çağrıda temizleyebilirsiniz.

Dosya yükleme işlemleri nasıl yönetilir?

Dosya inputları için register fonksiyonunu kullanarak normal bir input gibi kayıt edebilir ve FormData nesnesi ile sunucuya gönderebilirsiniz.

React Hook Form ile Karmaşık Formlarda Test Stratejileri

Gelişmiş form yapılarında, özellikle kullanıcı etkileşimlerinin yoğun olduğu durumlarda, formun doğruluğunu garanti altına almak için uçtan uca (E2E) testler kritik öneme sahiptir. React Hook Form, DOM tabanlı çalıştığı için Cypress veya Playwright gibi araçlarla mükemmel uyum sağlar.

Bir form bileşenini test ederken, sadece input değerlerinin değişip değişmediğine değil, aynı zamanda Zod şemasının tetiklediği hata mesajlarının DOM'da görünüp görünmediğine odaklanmalısınız.

// Cypress ile basit bir form doğrulama testi örneği
describe('Kullanıcı Kayıt Formu Testi', () => {
  it('Hatalı e-posta girildiğinde hata mesajı göstermeli', () => {
    cy.visit('/kayit');
    cy.get('input[name="email"]').type('gecersiz-email');
    cy.get('button[type="submit"]').click();
    cy.get('.error-message').should('contain', 'Geçerli bir e-posta adresi giriniz');
  });
});

Form Verilerini Sunucuya Gönderirken "Optimistic Updates" Kullanımı

Kullanıcı deneyimini bir üst seviyeye taşımak için, form gönderildiğinde sunucudan yanıt gelmesini beklemeden arayüzü güncellemek (Optimistic UI) yaygın bir pratiktir. Bu işlem genellikle TanStack Query ile entegre edildiğinde oldukça kolaylaşır.

Formunuzu gönderirken handleSubmit içerisinde veriyi işleyip, ardından mutate fonksiyonunu çağırarak kullanıcıya anlık geri bildirim verebilirsiniz.

const { mutate } = useMutation({
  mutationFn: (data) => axios.post('/api/user', data),
  onMutate: async (newData) => {
    // Sunucu yanıtı gelmeden önce UI'ı güncelle
    console.log("Veri gönderiliyor, arayüz güncelleniyor...");
  },
  onError: (err, newData, context) => {
    // Hata durumunda rollback işlemleri
    alert("Bir hata oluştu, lütfen tekrar deneyin.");
  }
});

const onSubmit = (data) => {
  mutate(data);
};

Büyük Ölçekli Formlarda Performans İpuçları

Formunuzdaki input sayısı arttıkça, her tuş vuruşunda tüm formun yeniden render olmasını engellemek gerekir. React Hook Form'un useFormContext yapısını kullanarak büyük formları küçük, izole edilmiş bileşenlere bölmek en etkili yöntemdir.

  • useWatch Kullanımı: Sadece belirli bir alanın değerine göre başka bir alanı göstermek/gizlemek istiyorsanız, tüm formu izlemek yerine useWatch ile sadece ilgili alanı izleyin.
  • Controller Bileşeni: Eğer özel (custom) UI kütüphaneleri (MUI, Ant Design vb.) kullanıyorsanız, Controller bileşenini kullanarak render döngülerini optimize edin.
  • Memoization: Form bileşenlerinizi React.memo ile sarmalayarak, gereksiz render işlemlerinin önüne geçin.
// Sadece belirli bir alanı izleyerek performansı artırma
const watchedValue = useWatch({
  control,
  name: "kullaniciTipi",
});

return (
  
{watchedValue === 'kurumsal' && }
);

Sonuç

React Hook Form, 2026 yılı standartlarında React projelerinde form yönetimi için en verimli çözümdür. Doğru şema kütüphaneleriyle birleştirildiğinde, hem geliştirici deneyimi hem de kullanıcı performansı açısından mükemmel sonuçlar verir. Bir sonraki adım olarak, form verilerini API uç noktalarına göndermek için TanStack Query (React Query) ile bu yapıyı entegre etmeyi deneyebilirsiniz.

Kod güvenliği sorumluluk reddi: Bu makaledeki kod örnekleri eğitim amaçlıdır. Uygulamanızın üretim ortamında (production) XSS saldırılarına karşı verileri sanitize etmeyi ve sunucu tarafında her zaman doğrulama yapmayı unutmayın.

Bu yazıya tepkinizi paylaşın:
Mert Çelik

Teknoloji dünyasını ve dijital araçları günlük hayata entegre etme konusunda içerikler üretiyorum. Karmaşık teknik rehberleri en yalın haliyle sunmayı hedefliyorum.

Yorumlar (0)

Yorum Yaz