Takip et

React ve Formik ile Giriş Formu Doğrulama: Kapsamlı Bir Rehber

React ve Formik ile Giriş Formu Doğrulama: Kapsamlı Bir Rehber Giriş: Form Doğrulamanın Önemi ve Neden Formik? Modern web uygulamalarında ku

React ve Formik ile Giriş Formu Doğrulama: Kapsamlı Bir Rehber

Giriş: Form Doğrulamanın Önemi ve Neden Formik?

Modern web uygulamalarında kullanıcı deneyimi ve veri bütünlüğü, başarılı bir uygulamanın temel taşlarındandır. Bu bağlamda, formlar kullanıcı etkileşiminin merkezinde yer alır ve form doğrulama (validation) süreci kritik bir rol oynar. Bir giriş formu örneğinde, kullanıcıların geçerli e-posta adresleri ve güvenli şifreler girmesini sağlamak hem güvenlik hem de kullanıcı memnuniyeti açısından vazgeçilmezdir. Yanlış veya eksik veri girişi, uygulamanın arka ucunda hatalara yol açabilir, güvenlik açıklarına zemin hazırlayabilir ve kullanıcıların sinirini bozarak uygulamayı terk etmelerine neden olabilir.

Form doğrulama iki ana düzeyde gerçekleştirilir: istemci tarafı (client-side) ve sunucu tarafı (server-side). İstemci tarafı doğrulama, kullanıcının girdilerini sunucuya göndermeden önce tarayıcıda kontrol eder. Bu, anında geri bildirim sağlayarak kullanıcı deneyimini iyileştirir ve gereksiz sunucu isteklerini azaltır. Ancak, istemci tarafı doğrulama tek başına yeterli değildir, çünkü kötü niyetli kullanıcılar tarayıcıdaki kontrolleri atlayabilir. Bu nedenle, sunucu tarafı doğrulama her zaman uygulanmalıdır. Bu makale, istemci tarafı doğrulamaya odaklanacak ve React uygulamalarında Formik ve Yup kütüphanelerini kullanarak sağlam ve kullanıcı dostu giriş formu doğrulamasını nasıl uygulayacağınızı adım adım gösterecektir.

React, bileşen tabanlı yapısı sayesinde formları yönetmek için güçlü bir temel sunar. Ancak, form durumu yönetimi, doğrulama mantığı ve hata mesajlarının gösterilmesi gibi görevler, özellikle karmaşık formlarda, çok sayıda tekrar eden (boilerplate) kod yazmayı gerektirebilir. İşte tam bu noktada Formik devreye girer. Formik, React’te form oluşturmayı ve yönetmeyi basitleştiren popüler bir kütüphanedir. Formik, formun state’ini yönetmek, doğrulama hatalarını izlemek, gönderim sürecini ele almak ve input alanlarını kontrol etmek gibi sıkıcı görevleri sizin için üstlenir. Bu sayede geliştiriciler, formun iş mantığına ve kullanıcı arayüzüne odaklanabilirler. Formik ile birlikte genellikle Yup adı verilen bir şema doğrulama kütüphanesi kullanılır. Yup, deklaratif ve güçlü doğrulama kuralları tanımlamayı mümkün kılarak doğrulama mantığını çok daha okunabilir ve yönetilebilir hale getirir.

Bu makalede, öncelikle temel bir React giriş formunun Formik olmadan nasıl oluşturulduğunu ve karşılaşılan zorlukları ele alacağız. Ardından, Formik’in useFormik hook’u ile bu formu nasıl basitleştireceğimizi göstereceğiz. Son olarak, Yup kütüphanesini entegre ederek daha gelişmiş ve yapılandırılmış doğrulama kurallarını nasıl uygulayacağımızı ayrıntılı bir şekilde inceleyeceğiz. Ayrıca, kullanıcı deneyimini iyileştirecek ipuçları ve en iyi uygulamalar hakkında da bilgi vereceğiz.

Formik’e Giriş: Form Yönetimini Kolaylaştırmak

Formik, React uygulamalarında form yönetimiyle ilgili tüm zorlukları çözmek için tasarlanmış kapsamlı bir çözümdür. Temel olarak, Formik üç ana sorunu ele alır:

1. Form Değerlerini Alma ve Güncelleme: Form input’larının değerlerini state’te tutmak ve her değişiklikte bu state’i güncellemek.
2. Doğrulama ve Hata Mesajları: Kullanıcının girdilerini belirli kurallara göre doğrulamak ve hataları kullanıcıya anlaşılır bir şekilde göstermek.
3. Form Gönderimi: Doğrulama başarılı olduğunda form verilerini işlemek ve sunucuya göndermek.

Formik, bu görevleri otomatikleştirerek geliştiricilerin formlarla ilgili boilerplate kodu yazma yükünü önemli ölçüde azaltır.

Formik’in Temel Bileşenleri ve Hook’ları

Formik, formları yönetmek için iki ana yaklaşım sunar:

* useFormik Hook: Fonksiyonel bileşenlerde Formik’in tüm özelliklerini kullanmak için tercih edilen modern yaklaşımdır. Daha esnek ve doğrudan kontrol sağlar.
* Bileşeni: Render prop deseni kullanarak form bağlamını sağlar. , gibi yardımcı bileşenlerle birlikte kullanılır.

Bu makalede, genellikle daha modern ve esnek kabul edilen useFormik hook’una odaklanacağız.

Kurulum

Formik’i projenize eklemek için npm veya yarn kullanabilirsiniz:

npm install formik yup

veya

yarn add formik yup

formik paketi Formik kütüphanesini içerirken, yup paketi şema tabanlı doğrulama için kullanacağımız yardımcı kütüphanedir.

Temel Bir Giriş Formu Oluşturma (Formik Olmadan)

Formik’in sağladığı avantajları daha iyi anlamak için, öncelikle Formik kullanmadan basit bir giriş formunu nasıl oluşturacağımıza bakalım. Bu yaklaşım, form yönetimiyle ilgili manuel olarak ele almamız gereken adımları ve karşılaşılan zorlukları gözler önüne serecektir.

import React, { useState } from 'react';

const BasicLoginForm = () => {
  const [email, setEmail] = useState('');
  const [password, setPassword] = useState('');
  const [errors, setErrors] = useState({});
  const [message, setMessage] = useState('');

  const validateForm = () => {
    const newErrors = {};
    if (!email) {
      newErrors.email = 'E-posta alanı boş bırakılamaz.';
    } else if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) {
      newErrors.email = 'Geçerli bir e-posta adresi girin.';
    }

    if (!password) {
      newErrors.password = 'Şifre alanı boş bırakılamaz.';
    } else if (password.length < 6) {
      newErrors.password = 'Şifre en az 6 karakter olmalıdır.';
    }

    setErrors(newErrors);
    return Object.keys(newErrors).length === 0;
  };

  const handleSubmit = (e) => {
    e.preventDefault(); // Sayfanın yeniden yüklenmesini engelle
    setMessage('');

    if (validateForm()) {
      // Doğrulama başarılı, formu gönderebiliriz
      console.log('Form gönderiliyor:', { email, password });
      setMessage('Giriş başarılı!');
      // Burada API çağrısı yapılabilir
    } else {
      setMessage('Lütfen formdaki hataları düzeltin.');
    }
  };

  return (
    

Giriş Yap (Formik Olmadan)

setEmail(e.target.value)} style={{ width: '100%', padding: '8px', boxSizing: 'border-box', border: '1px solid #ddd', borderRadius: '4px' }} /> {errors.email &&
{errors.email}
}
setPassword(e.target.value)} style={{ width: '100%', padding: '8px', boxSizing: 'border-box', border: '1px solid #ddd', borderRadius: '4px' }} /> {errors.password &&
{errors.password}
}
{message &&
{message}
}
); }; export default BasicLoginForm;

Bu örnekte, her input alanı için ayrı bir useState hook’u tanımladık (email, password). Ayrıca, doğrulama hatalarını tutmak için errors state’ini ve genel mesajları göstermek için message state’ini kullandık. onChange olay yöneticileri her input değiştiğinde ilgili state’i günceller. validateForm fonksiyonu, temel doğrulama kurallarını (boşluk kontrolü, e-posta formatı, şifre uzunluğu) manuel olarak kontrol eder ve hata nesnesini günceller. handleSubmit fonksiyonu ise preventDefault çağrısı yaparak sayfanın yeniden yüklenmesini engeller, validateForm‘u çağırır ve sonucuna göre formu gönderir veya hata mesajlarını gösterir.

Dezavantajları

Bu yaklaşımın bazı dezavantajları vardır:

* Tekrarlayan Kod (Boilerplate): Her input için useState, onChange handler’ı ve doğrulama mantığı yazmak gerekiyor. Form büyüdükçe bu durum daha da karmaşıklaşır.
* State Yönetimi: Formun genel state’ini, input değerlerini, hataları ve dokunulmuş (touched) durumları manuel olarak yönetmek karmaşıktır.
* Ölçeklenebilirlik: Yeni alanlar eklendiğinde veya doğrulama kuralları değiştiğinde, kodu güncellemek ve test etmek zahmetli hale gelir.
* Kullanıcı Deneyimi: Hata mesajlarının ne zaman gösterileceği (örneğin, kullanıcı alanı terk ettiğinde mi yoksa formu göndermeye çalıştığında mı) gibi detayları manuel olarak yönetmek gerekir.

Bu zorluklar, Formik gibi kütüphanelerin neden bu kadar değerli olduğunu açıkça ortaya koymaktadır. Şimdi, Formik kullanarak bu formu nasıl daha verimli bir şekilde oluşturacağımıza geçelim.

Formik ile Giriş Formu Oluşturma

Formik, yukarıda bahsedilen dezavantajları ortadan kaldırarak form yönetimini büyük ölçüde basitleştirir. useFormik hook’u, fonksiyonel bileşenlerde Formik’in tüm gücünü kullanmamızı sağlar.

import React from 'react';
import { useFormik } from 'formik';

const FormikLoginForm = () => {
  // 1. useFormik hook'unu başlat
  const formik = useFormik({
    initialValues: {
      email: '',
      password: '',
    },
    validate: (values) => {
      const errors = {};
      if (!values.email) {
        errors.email = 'E-posta alanı boş bırakılamaz.';
      } else if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(values.email)) {
        errors.email = 'Geçerli bir e-posta adresi girin.';
      }

      if (!values.password) {
        errors.password = 'Şifre alanı boş bırakılamaz.';
      } else if (values.password.length < 6) {
        errors.password = 'Şifre en az 6 karakter olmalıdır.';
      }
      return errors;
    },
    onSubmit: (values, { setSubmitting, resetForm }) => {
      // Doğrulama başarılı, formu gönderebiliriz
      console.log('Form gönderiliyor:', values);
      // setSubmitting(true); // Gönderim başladığında butonu devre dışı bırakmak için
      
      // API çağrısı simülasyonu
      setTimeout(() => {
        alert(JSON.stringify(values, null, 2) + ' - Giriş başarılı!');
        setSubmitting(false); // Gönderim tamamlandığında butonu tekrar etkinleştir
        resetForm(); // Formu sıfırla
      }, 1000);
    },
  });

  return (
    

Giriş Yap (Formik ile)

{formik.touched.email && formik.errors.email && (
{formik.errors.email}
)}
{formik.touched.password && formik.errors.password && (
{formik.errors.password}
)}
); }; export default FormikLoginForm;

useFormik Hook’unun Açıklaması

useFormik hook’u, bir konfigürasyon nesnesi alır ve form durumunu ve yardımcı yöntemleri içeren bir formik nesnesi döndürür.

* initialValues: Formun başlangıç değerlerini tanımlayan bir nesnedir. Her input alanının name özelliği, initialValues‘taki karşılık gelen anahtarla eşleşmelidir.
* validate: Form değerleri değiştiğinde veya handleSubmit çağrıldığında Formik tarafından otomatik olarak çağrılan bir fonksiyon. values nesnesini argüman olarak alır ve bir errors nesnesi döndürmelidir. Eğer errors nesnesinde bir alan için hata varsa, o alan geçersiz kabul edilir.
* onSubmit: Doğrulama başarılı olduğunda ve form gönderildiğinde çağrılan fonksiyondur. values nesnesini ve Formik’in bazı yardımcılarını (örneğin setSubmitting, resetForm) argüman olarak alır. Bu fonksiyonda genellikle sunucuya bir API çağrısı yapılır.

formik Nesnesinin Özellikleri

useFormik tarafından döndürülen formik nesnesi, formla ilgili birçok faydalı özellik ve yöntem içerir:

* formik.values: Formdaki tüm input alanlarının güncel değerlerini içeren bir nesne.
* formik.errors: Doğrulama hatalarını içeren bir nesne. Anahtarlar input name‘lerine karşılık gelir, değerler ise hata mesajlarıdır.
* formik.touched: Hangi input alanlarına kullanıcının dokunduğunu (odaklanıp sonra ayrıldığını) belirten bir nesne. Bu, hata mesajlarını yalnızca kullanıcı bir alandan ayrıldıktan sonra göstermek için kullanışlıdır.
* formik.handleChange: Tüm input alanları için kullanılabilen genel bir onChange olay yöneticisidir. Input’un name özelliğine göre formik.values‘u otomatik olarak günceller.
* formik.handleBlur: Tüm input alanları için kullanılabilen genel bir onBlur olay yöneticisidir. Bir input’tan odaklanma ayrıldığında formik.touched nesnesini günceller.
* formik.handleSubmit: Formun onSubmit olay yöneticisine atanması gereken fonksiyondur. Doğrulamayı tetikler ve doğrulama başarılı olursa onSubmit callback’ini çağırır.
* formik.isSubmitting: Formun gönderim sürecinde olup olmadığını belirten bir boolean değeridir. Gönderim sırasında butonu devre dışı bırakmak için kullanılabilir.

Bu yapı sayesinde, Formik formun state’ini, doğrulamasını ve gönderimini merkezi bir yerden yöneterek kodu çok daha düzenli ve okunabilir hale getirir. Özellikle handleChange ve handleBlur gibi jenerik yöneticiler sayesinde her input için ayrı ayrı state ve event handler tanımlama ihtiyacı ortadan kalkar.

Schema Tabanlı Doğrulama (Yup ile)

Yukarıdaki validate fonksiyonu, temel senaryolar için yeterli olsa da, doğrulama kuralları karmaşıklaştıkça veya form büyüdükçe bu fonksiyonun bakımı zorlaşabilir. Düzenli ifadeler (regex) okunaklılığı azaltabilir ve hata mesajlarını yönetmek zorlaşabilir. İşte burada Yup gibi bir şema doğrulama kütüphanesi devreye girer.

Yup, JavaScript değerleri için şemalar tanımlamayı ve bu şemalara göre doğrulama yapmayı sağlayan bir kütüphanedir. Formik ile mükemmel bir uyum içindedir ve doğrulama mantığını daha deklaratif, okunabilir ve yeniden kullanılabilir hale getirir.

Yup Nedir ve Neden Kullanmalıyız?

Yup, JSON Schema benzeri bir API ile çalışır. Bir nesnenin veya dizinin yapısını ve içindeki her alanın veri tipini, zorunluluğunu, formatını ve diğer kısıtlamalarını tanımlamanıza olanak tanır.

Avantajları:

* Deklaratif: Doğrulama kurallarını açık ve okunabilir bir şekilde tanımlarsınız.
* Güçlü ve Esnek: Birçok yerleşik doğrulama kuralı (string, number, boolean, date, array, object vb.) ve özel kurallar ekleme yeteneği sunar.
* Yeniden Kullanılabilirlik: Aynı doğrulama şemasını uygulamanızın farklı yerlerinde kullanabilirsiniz.
* Hata Mesajları: Her kural için özel hata mesajları tanımlayabilirsiniz.

Yup Kurulumu

Daha önce de belirttiğimiz gibi, Yup’ı projenize npm install yup veya yarn add yup komutuyla ekleyebilirsiniz.

Giriş Formu için Yup Şeması Oluşturma ve Formik Entegrasyonu

Şimdi, önceki Formik giriş formumuzun validate fonksiyonunu Yup şema tabanlı doğrulama ile değiştirelim.

import React from 'react';
import { useFormik } from 'formik';
import * as Yup from 'yup'; // Yup kütüphanesini içe aktar

const FormikYupLoginForm = () => {
  // Yup ile doğrulama şemasını tanımla
  const validationSchema = Yup.object().shape({
    email: Yup.string()
      .email('Geçerli bir e-posta adresi girin.') // E-posta formatı kontrolü
      .required('E-posta alanı boş bırakılamaz.'), // Zorunluluk kontrolü
    password: Yup.string()
      .min(6, 'Şifre en az 6 karakter olmalıdır.') // Minimum uzunluk
      .required('Şifre alanı boş bırakılamaz.'), // Zorunluluk kontrolü
      // .matches(/[a-z]/, 'Şifre en az bir küçük harf içermelidir.') // Daha karmaşık kurallar eklenebilir
      // .matches(/[A-Z]/, 'Şifre en az bir büyük harf içermelidir.')
      // .matches(/[0-9]/, 'Şifre en az bir rakam içermelidir.')
      // .matches(/[^a-zA-Z0-9]/, 'Şifre en az bir özel karakter içermelidir.'),
  });

  const formik = useFormik({
    initialValues: {
      email: '',
      password: '',
    },
    validationSchema: validationSchema, // Yup şemasını Formik'e ata
    onSubmit: (values, { setSubmitting, resetForm }) => {
      console.log('Form gönderiliyor:', values);
      setTimeout(() => {
        alert(JSON.stringify(values, null, 2) + ' - Giriş başarılı!');
        setSubmitting(false);
        resetForm();
      }, 1000);
    },
  });

  return (
    

Giriş Yap (Formik ve Yup ile)

{formik.touched.email && formik.errors.email && (
{formik.errors.email}
)}
{formik.touched.password && formik.errors.password && (
{formik.errors.password}
)}
); }; export default FormikYupLoginForm;

Yup Şemasının Açıklaması

* Yup.object().shape({...}): Formun genel yapısını tanımlamak için kullanılır. İçine her bir form alanı için doğrulama kurallarını içeren bir nesne alır.
* Yup.string(): Bu alanın bir string (metin) olmasını beklediğimizi belirtir. Yup, number(), boolean(), date(), array(), object() gibi başka türler de sunar.
* .email('Hata Mesajı'): String’in geçerli bir e-posta formatında olup olmadığını kontrol eder. Geçersizse belirtilen hata mesajını gösterir.
* .required('Hata Mesajı'): Alanın boş bırakılamayacağını belirtir.
* .min(uzunluk, 'Hata Mesajı'): String’in minimum uzunluğunu belirler.
* .max(uzunluk, 'Hata Mesajı'): String’in maksimum uzunluğunu belirler.
* .matches(/regex/, 'Hata Mesajı'): String’in belirli bir düzenli ifadeye (regex) uyup uymadığını kontrol eder. Örneğin, şifrenin özel karakter içermesi gibi daha karmaşık kurallar için kullanılabilir.

Yup şemasını oluşturduktan sonra, Formik’in validationSchema özelliğine atayarak entegrasyonu tamamlarız. Formik, dahili olarak bu şemayı kullanarak otomatik doğrulama yapar ve formik.errors ile formik.touched nesnelerini günceller. Bu, validate fonksiyonunu manuel olarak yazma ihtiyacını tamamen ortadan kaldırır ve doğrulama mantığını çok daha düzenli bir hale getirir.

Kullanıcı Deneyimini İyileştirme

Form doğrulama sadece hataları yakalamakla kalmaz, aynı zamanda kullanıcıya akıcı ve bilgilendirici bir deneyim sunarak uygulamanın genel kalitesini artırır. Formik, kullanıcı deneyimini iyileştirmek için çeşitli özellikler sunar.

Hata Mesajlarının Anında Gösterilmesi (onBlur)

Kullanıcıların bir input alanına veri girerken veya girdikten hemen sonra hatalar hakkında bilgi sahibi olması önemlidir. onBlur olayı, kullanıcının bir input alanından ayrıldığında tetiklenir. Formik’in formik.handleBlur özelliği, bu olayı dinleyerek ilgili alanın formik.touched durumunu true yapar. Böylece, hata mesajlarını yalnızca kullanıcı alanı terk ettikten sonra gösterebiliriz:

{formik.touched.email && formik.errors.email && (
  
{formik.errors.email}
)}

Bu, kullanıcı daha input’u doldururken hata mesajlarıyla bombardımana tutulmasını engeller ve daha doğal bir etkileşim sağlar.

Form Gönderim Durumu (isSubmitting)

Bir formu gönderirken, kullanıcıya formun işlendiğini bildirmek ve aynı formu tekrar göndermesini engellemek iyi bir uygulamadır. Formik’in formik.isSubmitting özelliği bu durumu yönetir. onSubmit fonksiyonunuzda setSubmitting(true) çağrısı yaparak bu özelliği true yapabilir, işlem bittiğinde ise setSubmitting(false) ile false‘a döndürebilirsiniz.

Bu, kullanıcıya geri bildirim sağlar ve “çift gönderim” (double submission) gibi istenmeyen durumları önler.

Geri Bildirim (Yükleniyor Spinner’ı, Başarı/Hata Mesajları)

Form gönderildikten sonra, kullanıcıya işlemin başarılı olup olmadığını veya bir hata oluşup oluşmadığını bildirmek önemlidir. Bu genellikle bir “yükleniyor” spinner’ı, geçici başarı mesajları (toast bildirimleri) veya kalıcı hata mesajları şeklinde yapılabilir.

Örneğin, onSubmit içinde bir API çağrısı yaptıktan sonra, isSubmitting durumuna bağlı olarak bir spinner gösterebilir ve API yanıtına göre bir başarı veya hata mesajı görüntüleyebilirsiniz.

// onSubmit içinde
onSubmit: async (values, { setSubmitting, resetForm, setStatus }) => {
  setSubmitting(true);
  try {
    // const response = await myApiClient.login(values.email, values.password);
    // if (response.success) {
      setStatus({ success: true, message: 'Giriş başarılı!' });
      resetForm();
    // } else {
    //   setStatus({ success: false, message: response.message || 'Giriş başarısız oldu.' });
    // }
  } catch (error) {
    setStatus({ success: false, message: error.message || 'Bir hata oluştu.' });
  } finally {
    setSubmitting(false);
  }
},

// JSX içinde
{formik.status && formik.status.message && (
  
{formik.status.message}
)}

formik.setStatus Formik’in ek durum bilgilerini saklamak için kullanabileceğiniz bir yardımcıdır.

Gelişmiş Formik Özellikleri ve En İyi Uygulamalar

Formik, temel form yönetiminin ötesinde, daha karmaşık senaryolar ve performans optimizasyonu için çeşitli gelişmiş özellikler sunar.

FastField Kullanımı (Performans Optimizasyonu)

Varsayılan olarak, bir Formik formundaki herhangi bir alan değiştiğinde, Formik bileşeni yeniden render edilir ve bu da tüm bileşenlerinin de yeniden render edilmesine neden olur. Çoğu form için bu bir sorun teşkil etmezken, çok sayıda input alanı olan veya karmaşık doğrulama mantığına sahip büyük formlarda performans düşüşüne yol açabilir.

bileşeni, bu durumu optimize etmek için kullanılır. FastField, yalnızca kendi name özelliğiyle ilişkili değer, hata veya dokunma durumu değiştiğinde yeniden render edilir. Bu, gereksiz yeniden render’ları engelleyerek performansı artırabilir.

import { Formik, Form, Field, ErrorMessage, FastField } from 'formik';

// ...

  
{/ Normal Field /} {/ Performans kritik alanlar için FastField /}

useFormik hook’unu kullanıyorsanız, FastField‘e eşdeğer bir doğrudan hook yoktur. Ancak, kendi input bileşenlerinizi React.memo ile sarmalayarak benzer bir optimizasyon sağlayabilirsiniz.

Custom Input Bileşenleri Oluşturma

Formlarınızda tutarlı bir görünüm ve davranış sağlamak için özel input bileşenleri oluşturmak yaygın bir uygulamadır. Formik, bu özel bileşenlerle entegre olmayı kolaylaştırır. Özel input bileşenleriniz, Formik’in sağladığı field ve meta prop’larını alarak Formik ile tam uyumlu hale getirilebilir.

import React from 'react';
import { useField } from 'formik';

const MyTextInput = ({ label, ...props }) => {
  // useField() hook'u, Field'ın prop'larını alıp
  // { field, meta } nesnelerini döndürür.
  // field nesnesi, input'a bağlanacak tüm prop'ları içerir (name, value, onChange, onBlur).
  // meta nesnesi, o alanın meta verilerini içerir (touched, error, value).
  const [field, meta] = useField(props);
  return (
    
{meta.touched && meta.error ? (
{meta.error}
) : null}
); }; // FormikYupLoginForm içinde kullanımı: // //

Bu yaklaşım, formunuzun UI kodunu basitleştirir, okunabilirliği artırır ve input bileşenlerinizin yeniden kullanılabilirliğini sağlar.

Formik Context’ini Kullanma (useFormikContext)

Eğer Formik’in bileşenini kullanıyorsanız ve iç içe geçmiş bir bileşende Formik’in durumuna veya yöntemlerine erişmeniz gerekiyorsa, useFormikContext hook’unu kullanabilirsiniz. Bu hook, o anki Formik bağlamını (yani formik nesnesini) döndürür.

import React from 'react';
import { useFormikContext } from 'formik';

const SubmitButton = () => {
  const { isSubmitting, isValid } = useFormikContext();
  return (
    
  );
};

//  bileşeni içinde kullanılabilir
// 
// // //

useFormik hook’unu kullanırken, formik nesnesini doğrudan bileşenler arasında prop olarak geçirebilirsiniz.

Formu Sıfırlama (resetForm)

Formu gönderdikten veya belirli bir işlemden sonra form değerlerini başlangıç değerlerine döndürmek isteyebilirsiniz. formik.resetForm() yöntemi bu işlevi görür. onSubmit callback’inde veya başka bir yerde çağrılarak formun state’i temizlenebilir.

onSubmit: (values, { setSubmitting, resetForm }) => {
  // ... API çağrısı
  setTimeout(() => {
    // ...
    resetForm(); // Formu başlangıç değerlerine sıfırla
    setSubmitting(false);
  }, 1000);
}

Formik ile UI Kütüphanelerini Entegre Etme

Material-UI, Ant Design, Bootstrap gibi popüler UI kütüphaneleriyle çalışırken, Formik’i bu kütüphanelerin bileşenleriyle entegre etmek isteyebilirsiniz. Bu genellikle, useField hook’unu kullanarak özel input bileşenleri oluşturarak veya kütüphanenin kendi form bileşenlerini Formik’in handleChange, handleBlur, value ve error prop’larıyla bağlayarak yapılır.

Örneğin, Material-UI TextField bileşenini Formik ile kullanmak için:

import React from 'react';
import { useField } from 'formik';
import { TextField } from '@mui/material';

const FormikMuiTextField = ({ label, ...props }) => {
  const [field, meta] = useField(props);
  return (
    
  );
};

// Kullanım:
// 

Bu, UI bileşenlerinin Formik’in doğrulama ve durum yönetimi özelliklerinden faydalanmasını sağlar.

Güvenlik İpuçları: İstemci Tarafı Doğrulamanın Sınırları

Bu makale boyunca istemci tarafı doğrulamanın faydalarını vurguladık. Ancak, güvenlik açısından kritik bir noktayı tekrar belirtmek önemlidir: istemci tarafı doğrulama, asla tek başına yeterli değildir.

* Kötü Niyetli Kullanıcılar: İstemci tarafı doğrulama, tarayıcıda çalışır ve kolayca atlatılabilir (örneğin, tarayıcı geliştirici araçları kullanılarak veya doğrudan API çağrıları yapılarak).
* Veri Bütünlüğü: Sunucu tarafı doğrulama olmadan, hatalı veya kötü niyetli veriler veritabanınıza ulaşabilir ve uygulamanızın veri bütünlüğünü bozabilir.
* İş Mantığı: Bazı doğrulama kuralları, yalnızca sunucu tarafında erişilebilen verilere (örneğin, bir kullanıcının e-posta adresinin zaten kayıtlı olup olmadığı) bağlı olabilir.

Bu nedenle, her zaman hem istemci tarafında (kullanıcı deneyimi için) hem de sunucu tarafında (güvenlik ve veri bütünlüğü için) doğrulama yapmalısınız. Formik ve Yup, istemci tarafı doğrulamayı güçlü ve verimli hale getirirken, sunucu tarafında da benzer doğrulama mantığını uygulamanız gerektiğini unutmayın.

Sonuç

Bu makalede, React uygulamalarında giriş formlarını Formik ve Yup kullanarak nasıl doğrulayacağımızı kapsamlı bir şekilde inceledik. Form doğrulamanın öneminden başlayarak, Formik’in form yönetimini nasıl basitleştirdiğini, useFormik hook’unun temel kullanımını ve Yup ile şema tabanlı doğrulamanın gücünü ele aldık. Ayrıca, hata mesajlarının anında gösterilmesi, gönderim durumunun yönetilmesi ve özel input bileşenleri oluşturma gibi kullanıcı deneyimini iyileştiren tekniklere de değindik.

Formik ve Yup kombinasyonu, React geliştiricileri için formlarla çalışmayı çok daha keyifli ve verimli hale getiren güçlü bir araç setidir. Geliştiricilerin, form state’i, doğrulama ve gönderim gibi tekrar eden görevlerle uğraşmak yerine, uygulamanın çekirdek iş mantığına odaklanmasına olanak tanır. Bu sayede daha sağlam, bakımı kolay ve kullanıcı dostu formlar oluşturulabilir.

Unutulmamalıdır ki, bu makalede ele alınan istemci tarafı doğrulama, kullanıcı deneyimini iyileştirse de, güvenlik ve veri bütünlüğü için her zaman sunucu tarafı doğrulama ile desteklenmelidir. Formik ve Yup’ı kullanarak geliştirdiğiniz formlar, kullanıcılarınız için daha güvenli, daha hızlı ve daha keyifli bir deneyim sunacaktır. Bu bilgileri kullanarak, React projelerinizde karmaşık formları bile kolayca yönetebilir ve doğrulayabilirsiniz.

Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.