Türkçe

Form yönetimini basitleştirmek, performansı artırmak ve kullanıcı deneyimini iyileştirmek için React'in useFormState hook'una dalın. Sağlam ve verimli formlar oluşturmak için en iyi uygulamaları ve gelişmiş teknikleri öğrenin.

React useFormState: Optimize Edilmiş Kullanıcı Deneyimleri için Form Yönetiminde Uzmanlaşma

Formlar, kullanıcıların uygulamanızla etkileşime girmesini ve veri göndermesini sağlayan web uygulamalarının temel bir parçasıdır. Ancak, form durumunu yönetmek, doğrulamayı ele almak ve geri bildirim sağlamak, özellikle büyük ve dinamik uygulamalarda karmaşık hale gelebilir. React 18'de tanıtılan React'in useFormState hook'u, form durumunu yönetmek ve form işleme mantığını basitleştirmek için güçlü ve verimli bir yol sunarak performansı artırır ve daha iyi bir kullanıcı deneyimi sağlar. Bu kapsamlı rehber, useFormState hook'unu temel kavramları, faydaları, pratik örnekleri ve gelişmiş teknikleriyle derinlemesine inceler.

React useFormState Nedir?

useFormState, durumu ve güncelleme mantığını tek bir hook içinde kapsayarak form durumu yönetimini basitleştiren bir React hook'udur. Özellikle React Sunucu Bileşenleri ve Sunucu Eylemleri ile birlikte çalışmak üzere tasarlanmıştır ve form işlemeyi sunucuya yükleyerek aşamalı geliştirme ve iyileştirilmiş performans sağlar.

Temel Özellikler ve Faydaları:

useFormState Hook'unu Anlamak

useFormState hook'u iki argüman alır:

  1. Sunucu Eylemi: Form gönderildiğinde yürütülecek bir fonksiyondur. Bu fonksiyon genellikle form doğrulama, veri işleme ve veritabanı güncellemelerini yönetir.
  2. Başlangıç Durumu: Form durumunun başlangıç değeridir. Bu, bir nesne, dizi veya ilkel bir değer gibi herhangi bir JavaScript değeri olabilir.

Hook, iki değer içeren bir dizi döndürür:

  1. Form Durumu: Form durumunun mevcut değeridir.
  2. Form Eylemi: form elemanının action prop'una geçirdiğiniz bir fonksiyondur. Bu fonksiyon, form gönderildiğinde sunucu eylemini tetikler.

Temel Örnek:

Kullanıcıların adlarını ve e-posta adreslerini göndermelerine olanak tanıyan basit bir iletişim formu örneğini ele alalım.

// Sunucu Eylemi (örnek - başka bir yerde tanımlanması gerekir)
async function submitContactForm(prevState, formData) {
  // Form verilerini doğrula
  const name = formData.get('name');
  const email = formData.get('email');

  if (!name || !email) {
    return { message: 'Lütfen tüm alanları doldurun.' };
  }

  // Form verilerini işle (ör. e-posta gönder)
  try {
    // E-posta göndermeyi simüle et
    await new Promise(resolve => setTimeout(resolve, 1000)); // Asenkron işlemi simüle et
    return { message: 'Gönderiminiz için teşekkür ederiz!' };
  } catch (error) {
    return { message: 'Bir hata oluştu. Lütfen daha sonra tekrar deneyin.' };
  }
}

// React Bileşeni
'use client'; // Sunucu Eylemleri için önemli

import { useFormState } from 'react-dom';

function ContactForm() {
  const [state, formAction] = useFormState(submitContactForm, { message: null });

  return (
    




{state?.message &&

{state.message}

}
); } export default ContactForm;

Bu örnekte, submitContactForm fonksiyonu sunucu eylemidir. Önceki durumu ve form verilerini argüman olarak alır. Form verilerini doğrular ve geçerliyse verileri işleyip başarı mesajı içeren yeni bir durum nesnesi döndürür. Hata varsa, hata mesajı içeren yeni bir durum nesnesi döndürür. useFormState hook'u, form durumunu yönetir ve form elemanının action prop'una geçirilen formAction fonksiyonunu sağlar. Form gönderildiğinde, submitContactForm fonksiyonu sunucuda yürütülür ve sonuçta ortaya çıkan durum bileşende güncellenir.

Gelişmiş useFormState Teknikleri

1. Form Doğrulama:

Form doğrulama, veri bütünlüğünü sağlamak ve iyi bir kullanıcı deneyimi sunmak için çok önemlidir. useFormState, sunucudaki form doğrulama mantığını yönetmek için kullanılabilir. İşte bir örnek:

async function validateForm(prevState, formData) {
  const name = formData.get('name');
  const email = formData.get('email');

  let errors = {};

  if (!name) {
    errors.name = 'İsim gereklidir.';
  }

  if (!email) {
    errors.email = 'E-posta gereklidir.';
  } else if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) {
    errors.email = 'Geçersiz e-posta formatı.';
  }

  if (Object.keys(errors).length > 0) {
    return { errors: errors };
  }

  // Form verilerini işle (ör. veritabanına kaydet)
  return { message: 'Form başarıyla gönderildi!', errors: null };
}

function MyForm() {
  const [state, action] = useFormState(validateForm, { message: null, errors: null });

  return (
    

{state?.errors?.name &&

{state.errors.name}

}
{state?.errors?.email &&

{state.errors.email}

} {state?.message &&

{state.message}

}
); }

Bu örnekte, validateForm sunucu eylemi form verilerini doğrular ve doğrulama hatalarını içeren bir nesne döndürür. Bileşen daha sonra bu hataları kullanıcıya gösterir.

2. İyimser Güncellemeler (Optimistic Updates):

İyimser güncellemeler, sunucu form gönderimini işlemeden önce bile anında geri bildirim sağlayarak kullanıcı deneyimini iyileştirebilir. useFormState ve biraz istemci tarafı mantığı ile, formu gönderdikten hemen sonra form durumunu güncelleyerek ve sunucu bir hata döndürürse güncellemeyi geri alarak iyimser güncellemeler uygulayabilirsiniz.

'use client'

import { useFormState } from 'react-dom';
import { useState } from 'react';

async function submitForm(prevState, formData) {
  await new Promise(resolve => setTimeout(resolve, 1000)); // Ağ gecikmesini simüle et

  const value = formData.get('value');
  if (value === 'error') {
    return { message: 'Gönderim başarısız oldu!' };
  }
  return { message: 'Gönderim başarılı!' };
}

function OptimisticForm() {
  const [optimisticValue, setOptimisticValue] = useState('');
  const [isSubmitting, setIsSubmitting] = useState(false);
  const [state, action] = useFormState(submitForm, { message: '' });

  const handleSubmit = async (e) => {
    setIsSubmitting(true);
    setOptimisticValue(e.target.value.value);
    const formData = new FormData(e.target);
    const result = await action(prevState, formData);
    setIsSubmitting(false);

    if (result?.message === 'Gönderim başarısız oldu!') {
      setOptimisticValue(''); // Hata durumunda geri al
    }
  };

  return (
    


{state?.message &&

{state.message}

}
); }

Bu örnekte, gecikmeli bir sunucu yanıtını simüle ediyoruz. Sunucu eylemi tamamlanmadan önce, giriş alanı iyimser bir şekilde gönderilen değerle güncellenir. Sunucu eylemi başarısız olursa ('error' değerini göndererek simüle edilir), giriş alanı önceki durumuna geri döndürülür.

3. Dosya Yüklemelerini Yönetme:

useFormState dosya yüklemelerini yönetmek için de kullanılabilir. FormData nesnesi dosya verilerini otomatik olarak yönetir. İşte bir örnek:

async function uploadFile(prevState, formData) {
  const file = formData.get('file');

  if (!file) {
    return { message: 'Lütfen bir dosya seçin.' };
  }

  // Dosya yüklemeyi simüle et
  await new Promise(resolve => setTimeout(resolve, 1000));

  // Genellikle dosyayı burada bir sunucuya yüklersiniz
  console.log('Dosya yüklendi:', file.name);

  return { message: `${file.name} dosyası başarıyla yüklendi!` };
}

function FileUploadForm() {
  const [state, action] = useFormState(uploadFile, { message: null });

  return (
    


{state?.message &&

{state.message}

}
); }

Bu örnekte, uploadFile sunucu eylemi dosyayı FormData nesnesinden alır ve işler. Gerçek dünya uygulamasında, dosyayı genellikle Amazon S3 veya Google Cloud Storage gibi bir bulut depolama hizmetine yüklersiniz.

4. Aşamalı Geliştirme (Progressive Enhancement):

useFormState ve Sunucu Eylemlerinin önemli avantajlarından biri, aşamalı geliştirme sağlama yeteneğidir. Bu, kullanıcının tarayıcısında JavaScript devre dışı bırakılmış olsa bile formlarınızın çalışmaya devam edebileceği anlamına gelir. Form doğrudan sunucuya gönderilir ve sunucu eylemi form gönderimini yönetir. JavaScript etkinleştirildiğinde, React formu istemci tarafı etkileşimi ve doğrulama ile geliştirir.

Aşamalı geliştirmeyi sağlamak için, sunucu eylemlerinizin tüm form doğrulama ve veri işleme mantığını yönettiğinden emin olmalısınız. Ayrıca JavaScript olmayan kullanıcılar için yedek mekanizmalar da sağlayabilirsiniz.

5. Erişilebilirlik Hususları:

Formlar oluştururken, engelli kullanıcıların formlarınızı etkili bir şekilde kullanabilmelerini sağlamak için erişilebilirliği göz önünde bulundurmak önemlidir. useFormState, hataları yönetmek ve kullanıcılara geri bildirim sağlamak için mekanizmalar sunarak erişilebilir formlar oluşturmanıza yardımcı olabilir. İşte bazı erişilebilirlik en iyi uygulamaları:

useFormState Kullanımı için En İyi Uygulamalar

useFormState hook'undan en iyi şekilde yararlanmak için aşağıdaki en iyi uygulamaları göz önünde bulundurun:

Gerçek Dünya Örnekleri ve Kullanım Senaryoları

useFormState çok çeşitli gerçek dünya uygulamalarında kullanılabilir. İşte bazı örnekler:

Örneğin, bir e-ticaret ödeme formu düşünün. useFormState kullanarak, teslimat adreslerinin, ödeme bilgilerinin ve diğer sipariş detaylarının doğrulanmasını sunucuda yönetebilirsiniz. Bu, verilerin veritabanına gönderilmeden önce geçerli olmasını sağlar ve ayrıca istemci tarafı işlemeyi azaltarak performansı artırır.

Başka bir örnek ise kullanıcı kayıt formudur. useFormState kullanarak, kullanıcı adlarının, şifrelerin ve e-posta adreslerinin doğrulanmasını sunucuda yönetebilirsiniz. Bu, verilerin güvende olmasını ve kullanıcının doğru bir şekilde doğrulanmasını sağlar.

Sonuç

React'in useFormState hook'u, form durumunu yönetmek ve form işleme mantığını basitleştirmek için güçlü ve verimli bir yol sunar. Sunucu Eylemleri ve aşamalı geliştirmeden yararlanarak, useFormState harika bir kullanıcı deneyimi sağlayan sağlam, performanslı ve erişilebilir formlar oluşturmanıza olanak tanır. Bu rehberde özetlenen en iyi uygulamaları takip ederek, form işleme mantığınızı basitleştirmek ve daha iyi React uygulamaları oluşturmak için useFormState'i etkili bir şekilde kullanabilirsiniz. Çeşitli, uluslararası bir kitle için formlar tasarlarken küresel erişilebilirlik standartlarını ve kullanıcı beklentilerini göz önünde bulundurmayı unutmayın.