React'in useFormStatus hook'u için geliştiricilere küresel kullanıcılar için ilgi çekici form gönderim deneyimleri yaratma gücü veren kapsamlı bir rehber.
React useFormStatus: Form Gönderim Durumunda Uzmanlaşma
Formlar, kullanıcıların sunucularla etkileşim kurmasının ve veri sağlamasının birincil yolu olarak hizmet ederek sayısız web uygulamasının bel kemiğini oluşturur. Sorunsuz ve bilgilendirici bir form gönderme süreci sağlamak, olumlu kullanıcı deneyimleri yaratmak için çok önemlidir. React 18, form gönderim durumunun yönetimini basitleştirmek için tasarlanmış useFormStatus
adında güçlü bir hook tanıttı. Bu kılavuz, useFormStatus
'un özelliklerini, kullanım durumlarını ve küresel bir kitle için erişilebilir ve ilgi çekici formlar oluşturmaya yönelik en iyi uygulamaları keşfederek kapsamlı bir genel bakış sunmaktadır.
React useFormStatus Nedir?
useFormStatus
, bir formun gönderim durumu hakkında bilgi sağlayan bir React Hook'udur. React bileşenlerinizden doğrudan sunucu tarafı mantığı çalıştırmanıza olanak tanıyan bir özellik olan sunucu eylemleri (server actions) ile sorunsuz bir şekilde çalışmak üzere tasarlanmıştır. Bu hook, formun bekleme durumu, verileri ve gönderim sırasında meydana gelen hatalar hakkında bilgi içeren bir nesne döndürür. Bu bilgiler, yükleme göstergeleri görüntüleme, form elemanlarını devre dışı bırakma ve hata mesajları gösterme gibi kullanıcılara gerçek zamanlı geri bildirim sağlamanıza olanak tanır.
Sunucu Eylemlerini (Server Actions) Anlamak
useFormStatus
'a dalmadan önce, sunucu eylemlerini anlamak önemlidir. Sunucu eylemleri, sunucuda çalışan ve doğrudan React bileşenlerinden çağrılabilen asenkron fonksiyonlardır. Dosyanın en üstünde 'use server'
yönergesi kullanılarak tanımlanırlar. Sunucu eylemleri genellikle aşağıdaki gibi görevler için kullanılır:
- Form verilerini bir veritabanına gönderme
- Kullanıcı kimlik doğrulaması yapma
- Ödemeleri işleme
- E-posta gönderme
İşte basit bir sunucu eylemi örneği:
// actions.js
'use server';
export async function submitForm(formData) {
// Sunucu isteğini taklit etmek için bir gecikme simülasyonu
await new Promise(resolve => setTimeout(resolve, 2000));
const name = formData.get('name');
const email = formData.get('email');
if (!name || !email) {
return { message: 'Lütfen tüm alanları doldurun.' };
}
// Başarılı gönderim simülasyonu
return { message: `${name} için form başarıyla gönderildi!` };
}
Bu eylem, form verilerini girdi olarak alır, bir gecikmeyi simüle eder ve ardından bir başarı veya hata mesajı döndürür. 'use server'
yönergesi, React'e bu fonksiyonun sunucuda çalıştırılması gerektiğini söyler.
useFormStatus Nasıl Çalışır?
useFormStatus
hook'u, bir form render eden bir bileşen içinde kullanılır. İçe aktarılan Sunucu Eylemi ile `action` prop'unu kullanan bir <form>
elemanı içinde kullanılması gerekir.
Hook, aşağıdaki özelliklere sahip bir nesne döndürür:
pending
: Formun o anda gönderilip gönderilmediğini belirten bir boolean.data
: Form ile gönderilen veriler. Form henüz gönderilmediyse bu değernull
olur.method
: Formu göndermek için kullanılan HTTP metodu (örneğin, "POST", "GET").action
: Formla ilişkili sunucu eylem fonksiyonu.error
: Form gönderimi başarısız olursa bir hata nesnesi. Gönderim başarılıysa veya henüz denenmediyse bu değernull
olur. Önemli: Hata otomatik olarak fırlatılmaz. Sunucu Eylemi'nin hata nesnesini açıkça döndürmesi veya fırlatması gerekir.
İşte useFormStatus
'un bir React bileşeninde nasıl kullanılacağına dair bir örnek:
'use client'
import { useFormStatus } from 'react-dom';
import { submitForm } from './actions';
function MyForm() {
const { pending, data, error, action } = useFormStatus();
return (
<form action={submitForm}>
<label htmlFor="name">Ad:</label>
<input type="text" id="name" name="name" disabled={pending} />
<label htmlFor="email">E-posta:</label>
<input type="email" id="email" name="email" disabled={pending} />
<button type="submit" disabled={pending}>
{pending ? 'Gönderiliyor...' : 'Gönder'}
</button>
{error && <p style={{ color: 'red' }}>Hata: {error.message}</p>}
{data && data.message && <p style={{ color: 'green' }}>{data.message}</p>}
</form>
);
}
export default MyForm;
Bu örnekte:
useFormStatus
'u'react-dom'
'dan vesubmitForm
sunucu eylemini./actions
'dan içe aktarıyoruz.- Form gönderiminin mevcut durumunu almak için
useFormStatus
kullanıyoruz. - Form beklemedeyken giriş alanlarını ve gönderme düğmesini devre dışı bırakıyoruz.
- Form beklemedeyken bir yükleme mesajı gösteriyoruz.
- Form gönderimi başarısız olursa bir hata mesajı gösteriyoruz.
- Form gönderimi başarılı olursa bir başarı mesajı gösteriyoruz.
useFormStatus Kullanmanın Faydaları
useFormStatus
, form gönderim durumunu yönetmek için çeşitli avantajlar sunar:
- Basitleştirilmiş Durum Yönetimi: Yükleme durumu, hata durumu ve form verilerini manuel olarak yönetme ihtiyacını ortadan kaldırır.
- İyileştirilmiş Kullanıcı Deneyimi: Kullanıcılara gerçek zamanlı geri bildirim sağlamanıza olanak tanıyarak form gönderme sürecini daha sezgisel ve ilgi çekici hale getirir.
- Geliştirilmiş Erişilebilirlik: Gönderim sırasında form elemanlarını devre dışı bırakarak kullanıcıların formu yanlışlıkla birden çok kez göndermesini önlersiniz.
- Sunucu Eylemleri ile Sorunsuz Entegrasyon: Özellikle sunucu eylemleriyle çalışmak üzere tasarlanmıştır ve form gönderimlerini yönetmek için sorunsuz ve verimli bir yol sağlar.
- Azaltılmış Tekrarlı Kod (Boilerplate): Form gönderimlerini yönetmek için gereken kod miktarını azaltır.
useFormStatus Kullanımı için En İyi Uygulamalar
useFormStatus
'un faydalarını en üst düzeye çıkarmak için aşağıdaki en iyi uygulamaları göz önünde bulundurun:
- Net Geri Bildirim Sağlayın: Birden fazla gönderimi önlemek için bir yükleme göstergesi görüntülemek veya form elemanlarını devre dışı bırakmak için
pending
durumunu kullanın. Bu, basit bir döndürme animasyonu, bir ilerleme çubuğu veya "Gönderiliyor..." gibi metinsel bir mesaj olabilir. Erişilebilirliği göz önünde bulundurun ve yükleme göstergesinin ekran okuyuculara doğru şekilde duyurulduğundan emin olun. - Hataları Zarif Bir Şekilde Ele Alın: Kullanıcıların neyin yanlış gittiğini ve nasıl düzelteceklerini anlamalarına yardımcı olmak için bilgilendirici hata mesajları görüntüleyin. Hata mesajlarını kullanıcının diline ve kültürel bağlamına göre uyarlayın. Teknik jargondan kaçının ve net, eyleme geçirilebilir rehberlik sağlayın.
- Verileri Sunucuda Doğrulayın: Kötü niyetli girdileri önlemek ve veri bütünlüğünü sağlamak için form verilerini her zaman sunucuda doğrulayın. Sunucu tarafı doğrulama, güvenlik ve veri kalitesi için kritik öneme sahiptir. Sunucu tarafı doğrulama mesajları için uluslararasılaştırma (i18n) uygulamayı düşünün.
- Aşamalı Geliştirme (Progressive Enhancement) Kullanın: Formunuzun JavaScript devre dışı bırakılsa bile çalıştığından emin olun. Bu, standart HTML form elemanlarını kullanmayı ve formu bir sunucu tarafı uç noktasına göndermeyi içerir. Ardından, daha zengin bir kullanıcı deneyimi sağlamak için formu JavaScript ile aşamalı olarak geliştirin.
- Erişilebilirliği Dikkate Alın: Formunuzu engelli kullanıcılar için erişilebilir hale getirmek için ARIA niteliklerini kullanın. Örneğin, hata mesajlarını ilgili form alanlarıyla ilişkilendirmek için
aria-describedby
kullanın. Formunuzun herkes tarafından kullanılabilir olmasını sağlamak için Web İçeriği Erişilebilirlik Yönergelerini (WCAG) izleyin. - Performansı Optimize Edin:
React.memo
veya diğer optimizasyon tekniklerini kullanarak gereksiz yeniden render'lardan kaçının. Formunuzun performansını izleyin ve darboğazları belirleyin. İlk yükleme süresini iyileştirmek için bileşenleri geç yüklemeyi (lazy-loading) veya kod bölmeyi (code splitting) düşünün. - Hız Sınırlaması (Rate Limiting) Uygulayın: Hız sınırlaması uygulayarak sunucunuzu kötüye kullanımdan koruyun. Bu, kullanıcıların formu kısa bir süre içinde çok sık göndermesini önleyecektir. Hız sınırlamasını uçta (edge) yönetmek için Cloudflare veya Akamai gibi bir hizmet kullanmayı düşünün.
useFormStatus için Kullanım Alanları
useFormStatus
geniş bir senaryo yelpazesinde uygulanabilir:
- İletişim Formları: Gönderim sırasında geri bildirim sağlama ve olası hataları yönetme.
- Giriş/Kayıt Formları: Kimlik doğrulama sırasında yükleme durumlarını belirtme ve geçersiz kimlik bilgileri için hata mesajları görüntüleme.
- E-ticaret Ödeme Formları: Ödeme işleme sırasında yükleme göstergeleri görüntüleme ve geçersiz kredi kartı bilgileri veya yetersiz bakiye ile ilgili hataları yönetme. Birden çok para birimini ve dili destekleyen ödeme ağ geçitleriyle entegrasyonu düşünün.
- Veri Giriş Formları: Yanlışlıkla veri tekrarını önlemek için gönderim sırasında form elemanlarını devre dışı bırakma.
- Arama Formları: Arama sonuçları getirilirken bir yükleme göstergesi görüntüleme.
- Ayarlar Sayfaları: Ayarlar kaydedilirken görsel ipuçları sağlama.
- Anketler ve Sınavlar: Cevapların gönderimini yönetme ve geri bildirim görüntüleme.
Uluslararasılaştırmayı (i18n) Ele Alma
Küresel bir kitle için formlar oluştururken, uluslararasılaştırma (i18n) çok önemlidir. İşte useFormStatus
kullanırken i18n'i nasıl ele alacağınız:
- Hata Mesajlarını Çevirin: Hata mesajlarını bir çeviri dosyasında saklayın ve kullanıcının yerel ayarına göre uygun mesajı görüntülemek için
react-intl
veyai18next
gibi bir kütüphane kullanın. Hata mesajlarının net, kısa ve kültürel olarak uygun olduğundan emin olun. - Sayıları ve Tarihleri Biçimlendirin: Sayıları ve tarihleri kullanıcının yerel ayarına göre biçimlendirmek için
Intl
API'sini kullanın. Bu, sayıların ve tarihlerin kendi bölgeleri için doğru formatta görüntülenmesini sağlayacaktır. - Farklı Tarih ve Saat Formatlarını Ele Alın: Farklı tarih ve saat formatlarını destekleyen giriş alanları sağlayın. Yerelleştirilmiş bir tarih seçici sağlamak için
react-datepicker
gibi bir kütüphane kullanın. - Sağdan Sola (RTL) Dilleri Destekleyin: Form düzeninizin Arapça ve İbranice gibi RTL dilleri için doğru çalıştığından emin olun. Düzen ayarlamalarını yönetmek için CSS mantıksal özelliklerini kullanın.
- Bir Yerelleştirme Kütüphanesi Kullanın: Çevirileri yönetmek ve yerel ayara özgü biçimlendirmeyi ele almak için sağlam bir i18n kütüphanesi kullanın.
i18next ile Örnek:
// i18n.js
import i18n from 'i18next';
import { initReactI18next } from 'react-i18next';
import en from './locales/en.json';
import tr from './locales/tr.json'; // Türkçe çeviriler için
i18n
.use(initReactI18next)
.init({
resources: {
en: { translation: en },
tr: { translation: tr },
},
lng: 'tr', // Varsayılan dil olarak Türkçe
fallbackLng: 'en',
interpolation: {
escapeValue: false, // react zaten xss'ten korur
},
});
export default i18n;
// MyForm.js
import { useTranslation } from 'react-i18next';
function MyForm() {
const { t } = useTranslation();
const { pending, data, error, action } = useFormStatus();
return (
<form action={submitForm}>
<label htmlFor="name">{t('name')}:</label>
<input type="text" id="name" name="name" disabled={pending} />
<label htmlFor="email">{t('email')}:</label>
<input type="email" id="email" name="email" disabled={pending} />
<button type="submit" disabled={pending}>
{pending ? t('submitting') : t('submit')}
</button>
{error && <p style={{ color: 'red' }}>{t('error')}: {t(error.message)}</p>}
{data && data.message && <p style={{ color: 'green' }}>{t(data.message)}</p>}
</form>
);
}
export default MyForm;
Erişilebilirlik Hususları
Form oluştururken erişilebilirliği sağlamak esastır. İşte useFormStatus
kullanırken formlarınızı daha erişilebilir hale getirmenin yolları:
- ARIA Niteliklerini Kullanın: Yardımcı teknolojilere anlamsal bilgi sağlamak için
aria-invalid
,aria-describedby
vearia-live
gibi ARIA niteliklerini kullanın. Örneğin, doğrulama hataları olan giriş alanlarındaaria-invalid="true"
kullanın ve hata mesajlarını ilgili alanlarla ilişkilendirmek içinaria-describedby
kullanın. Yükleme göstergeleri ve hata mesajları gibi dinamik içerik gösteren elemanlardaaria-live="polite"
veyaaria-live="assertive"
kullanın. - Klavye Navigasyonu Sağlayın: Kullanıcıların formu klavye kullanarak gezinebildiğinden emin olun. Elemanların odaklanma sırasını kontrol etmek için
tabindex
niteliğini kullanın. - Anlamsal HTML Kullanın: Formunuza yapı ve anlam katmak için
<label>
,<input>
,<button>
ve<fieldset>
gibi anlamsal HTML elemanlarını kullanın. - Net Etiketler Sağlayın: Tüm form alanları için net ve açıklayıcı etiketler kullanın. Etiketleri ilgili giriş alanlarıyla
for
niteliğini kullanarak ilişkilendirin. - Yeterli Kontrast Kullanın: Metin ve arka plan renkleri arasında yeterli kontrast olduğundan emin olun. Renklerinizin erişilebilirlik yönergelerine uyduğunu doğrulamak için bir renk kontrast denetleyicisi kullanın.
- Yardımcı Teknolojilerle Test Edin: Formunuzun engelli kişiler tarafından kullanılabilir olduğundan emin olmak için ekran okuyucular gibi yardımcı teknolojilerle test edin.
ARIA Nitelikleri ile Örnek:
function MyForm() {
const { pending, data, error, action } = useFormStatus();
return (
<form action={submitForm}>
<label htmlFor="name">Ad:</label>
<input
type="text"
id="name"
name="name"
disabled={pending}
aria-invalid={!!error} // Bir hata olup olmadığını belirtir
aria-describedby={error ? 'name-error' : null} // Hata mesajını ilişkilendirir
/>
{error && (
<p id="name-error" style={{ color: 'red' }} aria-live="polite">{error.message}</p>
)}
<label htmlFor="email">E-posta:</label>
<input type="email" id="email" name="email" disabled={pending} />
<button type="submit" disabled={pending}>
{pending ? 'Gönderiliyor...' : 'Gönder'}
</button>
{data && data.message && <p style={{ color: 'green' }}>{data.message}</p>}
</form>
);
}
Temel Kullanımın Ötesi: Gelişmiş Teknikler
useFormStatus
'un temel kullanımı basit olsa da, form gönderme deneyiminizi daha da geliştirebilecek birkaç gelişmiş teknik vardır:
- Özel Yükleme Göstergeleri: Basit bir döndürme animasyonu yerine, daha görsel olarak çekici ve bilgilendirici bir yükleme göstergesi kullanın. Bu, bir ilerleme çubuğu, özel bir animasyon veya arka planda ne olduğu hakkında bağlam sağlayan bir mesaj olabilir. Özel yükleme göstergelerinizin erişilebilir olduğundan ve yeterli kontrast sağladığından emin olun.
- İyimser Güncellemeler (Optimistic Updates): Sunucu yanıt vermeden önce kullanıcı arayüzünü iyimser bir şekilde güncelleyerek kullanıcıya anında geri bildirim sağlayın. Bu, formun daha duyarlı hissetmesini sağlayabilir ve algılanan gecikmeyi azaltabilir. Ancak, olası hataları ele aldığınızdan ve sunucu isteği başarısız olursa kullanıcı arayüzünü geri aldığınızdan emin olun.
- Debouncing ve Throttling: Kullanıcı yazarken gönderilen sunucu isteklerinin sayısını sınırlamak için debouncing veya throttling kullanın. Bu, performansı artırabilir ve sunucunun aşırı yüklenmesini önleyebilir.
lodash
gibi kütüphaneler, fonksiyonları debouncing ve throttling için yardımcı programlar sağlar. - Koşullu Render Etme: Form elemanlarını
pending
durumuna göre koşullu olarak render edin. Bu, form gönderilirken belirli elemanları gizlemek veya devre dışı bırakmak için yararlı olabilir. Örneğin, kullanıcının formu yanlışlıkla sıfırlamasını önlemek için form beklemedeyken bir "Sıfırla" düğmesini gizlemek isteyebilirsiniz. - Form Doğrulama Kütüphaneleri ile Entegrasyon: Kapsamlı form yönetimi için
useFormStatus
'uFormik
veyaReact Hook Form
gibi form doğrulama kütüphaneleriyle entegre edin.
Yaygın Sorunları Giderme
useFormStatus
kullanırken bazı yaygın sorunlarla karşılaşabilirsiniz. İşte bunları nasıl gidereceğiniz:
pending
durumu güncellenmiyor: Formun sunucu eylemiyle doğru bir şekilde ilişkilendirildiğinden ve sunucu eyleminin doğru tanımlandığından emin olun.<form>
elemanının `action` niteliğinin doğru ayarlandığını doğrulayın.error
durumu doldurulmuyor: Sunucu eyleminin bir hata oluştuğunda bir hata nesnesi döndürdüğünden emin olun. Sunucu Eylemi'nin hatayı açıkça döndürmesi veya fırlatması gerekir.- Form birden çok kez gönderiliyor: Birden fazla gönderimi önlemek için form beklemedeyken gönderme düğmesini veya giriş alanlarını devre dışı bırakın.
- Form veri göndermiyor: Form elemanlarının
name
niteliğinin doğru ayarlandığını doğrulayın. Sunucu eyleminin form verilerini doğru bir şekilde ayrıştırdığından emin olun. - Performans sorunları: Gereksiz yeniden render'lardan kaçınmak ve işlenen veri miktarını azaltmak için kodunuzu optimize edin.
useFormStatus Alternatifleri
useFormStatus
güçlü bir araç olsa da, özellikle eski React sürümlerinde veya karmaşık form mantığıyla uğraşırken form gönderim durumunu yönetmek için alternatif yaklaşımlar vardır:
- Manuel Durum Yönetimi: Yükleme durumu, hata durumu ve form verilerini manuel olarak yönetmek için
useState
veuseEffect
kullanmak. Bu yaklaşım size daha fazla kontrol sağlar ancak daha fazla tekrarlı kod gerektirir. - Form Kütüphaneleri: Formik, React Hook Form veya Final Form gibi form kütüphanelerini kullanmak. Bu kütüphaneler, doğrulama, gönderim yönetimi ve durum yönetimi dahil olmak üzere kapsamlı form yönetimi özellikleri sağlar. Bu kütüphaneler genellikle gönderim durumunu yönetmek için kendi hook'larını veya bileşenlerini sağlar.
- Redux veya Context API: Form durumunu küresel olarak yönetmek için Redux veya Context API'sini kullanmak. Bu yaklaşım, birden çok bileşende kullanılan karmaşık formlar için uygundur.
Yaklaşım seçimi, formunuzun karmaşıklığına ve özel gereksinimlerinize bağlıdır. Basit formlar için, useFormStatus
genellikle en basit ve en verimli çözümdür. Daha karmaşık formlar için bir form kütüphanesi veya küresel durum yönetimi çözümü daha uygun olabilir.
Sonuç
useFormStatus
, React ekosistemine değerli bir katkıdır, form gönderim durumunun yönetimini basitleştirir ve geliştiricilerin daha ilgi çekici ve bilgilendirici kullanıcı deneyimleri oluşturmasını sağlar. Özelliklerini, en iyi uygulamalarını ve kullanım durumlarını anlayarak, küresel bir kitle için erişilebilir, uluslararasılaştırılmış ve performanslı formlar oluşturmak için useFormStatus
'tan yararlanabilirsiniz. useFormStatus
'u benimsemek, geliştirmeyi kolaylaştırır, kullanıcı etkileşimini artırır ve sonuçta daha sağlam ve kullanıcı dostu web uygulamalarına katkıda bulunur.
Küresel bir kitle için formlar oluştururken erişilebilirlik, uluslararasılaştırma ve performansa öncelik vermeyi unutmayın. Bu kılavuzda belirtilen en iyi uygulamaları izleyerek, konumlarından veya yeteneklerinden bağımsız olarak herkes tarafından kullanılabilir formlar oluşturabilirsiniz. Bu yaklaşım, tüm kullanıcılar için daha kapsayıcı ve erişilebilir bir web'e katkıda bulunur.