React'in deneysel experimental_useFormStatus kancasıyla form durum yönetimini kolaylaştırın. Uygulama, faydalar ve gelişmiş kullanımı gerçek dünya örnekleriyle öğrenin.
React experimental_useFormStatus Uygulaması: Gelişmiş Form Durum Yönetimi
React'in gelişen dünyası, geliştirici deneyimini ve uygulama performansını iyileştirmek için sürekli olarak yeni araçlar ve teknikler sunmaktadır. Bu deneysel özelliklerden biri de, özellikle sunucu eylemleri ve aşamalı geliştirme senaryolarında form durum yönetimini basitleştirmek için tasarlanmış olan experimental_useFormStatus kancasıdır. Bu kapsamlı kılavuz, experimental_useFormStatus kancasını ayrıntılı olarak inceleyecek, etkili kullanımı için pratik örnekler ve bilgiler sunacaktır.
experimental_useFormStatus Nedir?
experimental_useFormStatus kancası, React ekibi tarafından özellikle sunucu eylemleri kullanıldığında bir form gönderiminin durumunu izlemek için daha basit bir yol sağlamak amacıyla sunulan deneysel bir API'dir. Bu kancadan önce, bir formun farklı durumlarını (boşta, gönderiliyor, başarılı, hata) yönetmek genellikle karmaşık durum yönetimi mantığı gerektiriyordu. experimental_useFormStatus, bu karmaşıklığın büyük bir kısmını soyutlayarak form gönderim durumlarını izlemek ve bunlara tepki vermek için basit ve etkili bir yol sunmayı amaçlamaktadır.
Temel Avantajları:
- Basitleştirilmiş Durum Yönetimi: Form gönderim durumlarını yönetmek için gereken standart kod miktarını azaltır.
- Gelişmiş Kullanıcı Deneyimi: Formun durumuna göre daha duyarlı kullanıcı arayüzü güncellemeleri sağlar.
- İyileştirilmiş Kod Okunabilirliği: Formla ilgili kodun anlaşılmasını ve bakımını kolaylaştırır.
- Sunucu Eylemleriyle Sorunsuz Entegrasyon: Özellikle React Sunucu Bileşenleri ve sunucu eylemleriyle iyi çalışacak şekilde tasarlanmıştır.
Temel Uygulama
experimental_useFormStatus'ın temel uygulamasını göstermek için basit bir iletişim formu örneğini ele alalım. Bu form, kullanıcının adını, e-postasını ve mesajını toplayacak ve ardından bir sunucu eylemi kullanarak gönderecektir.
Ön Koşullar
Koda dalmadan önce, aşağıdaki özelliklere sahip bir React projenizin olduğundan emin olun:
- Deneysel API'leri destekleyen React sürümü (gerekli sürüm için React belgelerini kontrol edin).
- React Sunucu Bileşenlerinin etkinleştirilmiş olması (genellikle Next.js veya Remix gibi framework'lerde kullanılır).
Örnek: Basit Bir İletişim Formu
İşte temel bir iletişim formu bileşeni:
```jsx // app/actions.js (Sunucu Eylemi) 'use server' export async function submitContactForm(formData) { // Veritabanı çağrısını veya API isteğini simüle et await new Promise(resolve => setTimeout(resolve, 2000)); const name = formData.get('name'); const email = formData.get('email'); const message = formData.get('message'); if (!name || !email || !message) { return { success: false, message: 'Tüm alanlar zorunludur.' }; } try { // Gerçek API çağrısı veya veritabanı işlemiyle değiştirin console.log('Form gönderildi:', { name, email, message }); return { success: true, message: 'Form başarıyla gönderildi!' }; } catch (error) { console.error('Form gönderilirken hata oluştu:', error); return { success: false, message: 'Form gönderilemedi.' }; } } // app/components/ContactForm.jsx (İstemci Bileşeni) 'use client' import { experimental_useFormStatus as useFormStatus } from 'react' import { submitContactForm } from '../actions' function SubmitButton() { const { pending } = useFormStatus() return ( ) } export default function ContactForm() { return ( ); } ```Açıklama
- Sunucu Eylemi (
app/actions.js): Bu dosya, bir sunucu eylemi olansubmitContactFormfonksiyonunu tanımlar. Form gönderiminin asenkron doğasını göstermek için 2 saniyelik bir gecikme ile bir API isteğini simüle eder. Ayrıca temel doğrulama ve hata yönetimini de ele alır. - İstemci Bileşeni (
app/components/ContactForm.jsx): Bu dosya, bir istemci bileşeni olanContactFormbileşenini tanımlar.experimental_useFormStatuskancasını vesubmitContactFormeylemini içe aktarır. useFormStatusKullanımı:SubmitButtonbileşeni içindeuseFormStatusçağrılır. Bu kanca, formun gönderim durumu hakkında bilgi sağlar.pendingÖzelliği:useFormStatustarafından döndürülenpendingözelliği, formun o anda gönderilip gönderilmediğini belirtir. Gönder düğmesini devre dışı bırakmak ve "Gönderiliyor..." mesajını görüntülemek için kullanılır.- Form Bağlama:
formelemanınınactionprop'u,submitContactFormsunucu eylemine bağlanır. Bu, React'e form gönderildiğinde sunucu eylemini çağırmasını söyler.
Gelişmiş Kullanım ve Dikkat Edilmesi Gerekenler
Başarı ve Hata Durumlarını Yönetme
experimental_useFormStatus gönderim durumunu izlemeyi basitleştirirken, genellikle başarı ve hata durumlarını açıkça yönetmeniz gerekir. Sunucu eylemleri, başarıyı veya başarısızlığı gösteren veriler döndürebilir ve bu verileri kullanıcı arayüzünü buna göre güncellemek için kullanabilirsiniz.
Örnek:
```jsx // app/components/ContactForm.jsx (Değiştirilmiş) 'use client' import { experimental_useFormStatus as useFormStatus } from 'react' import { submitContactForm } from '../actions' import { useState } from 'react'; function SubmitButton() { const { pending } = useFormStatus() return ( ) } export default function ContactForm() { const [message, setMessage] = useState(null); async function handleSubmit(formData) { const result = await submitContactForm(formData); setMessage(result); } return ({message.message}
)}Açıklama:
- Mesajlar için Durum (State): Sunucu eylemi tarafından döndürülen sonucu saklamak için bir
messagedurum değişkeni eklenmiştir. - Sonucu Yönetme: Form gönderildikten sonra,
handleSubmitfonksiyonumessagedurumunu sunucu eyleminden gelen sonuçla günceller. - Mesajları Görüntüleme: Bileşen, sonucun
successözelliğine göre mesajı görüntüler ve başarı ve hata durumları için farklı CSS sınıfları uygular.
Aşamalı Geliştirme
experimental_useFormStatus, aşamalı geliştirme senaryolarında öne çıkar. Standart bir HTML formunu React ile aşamalı olarak geliştirerek, JavaScript başarısız olsa bile temel işlevsellikten ödün vermeden daha iyi bir kullanıcı deneyimi sağlayabilirsiniz.
Örnek:
Temel bir HTML formuyla başlayarak:
```html ```Daha sonra bunu React ve experimental_useFormStatus ile aşamalı olarak geliştirebilirsiniz.
Açıklama:
- Başlangıç HTML Formu:
public/contact.htmldosyası, JavaScript olmadan bile çalışacak standart bir HTML formu içerir. - Aşamalı Geliştirme:
EnhancedContactFormbileşeni, HTML formunu aşamalı olarak geliştirir. JavaScript etkinse, React kontrolü devralır ve daha zengin bir kullanıcı deneyimi sunar. useFormStateKancası: Form durumunu yönetmek ve sunucu eylemini forma bağlamak içinuseFormStatekullanır.-
state:useFormState'ten gelenstateartık sunucu eyleminden dönen değeri tutar ve bu değer başarı veya hata mesajları için kontrol edilebilir.
Uluslararası Hususlar
Küresel bir kitle için formlar uygularken, birkaç uluslararası husus devreye girer:
- Yerelleştirme: Form etiketlerinizin, mesajlarınızın ve hata mesajlarınızın farklı dillere yerelleştirildiğinden emin olun. i18next gibi araçlar çevirileri yönetmeye yardımcı olabilir.
- Tarih ve Sayı Formatları: Tarih ve sayı formatlarını kullanıcının yerel ayarına göre yönetin. Tarihleri ve sayıları doğru şekilde biçimlendirmek için
Intlveyamoment.js(tarih biçimlendirme için, ancak artık eski kabul ediliyor) gibi kütüphaneler kullanın. - Adres Formatları: Farklı ülkelerin farklı adres formatları vardır. Birden çok adres formatını destekleyen bir kütüphane kullanmayı veya kullanıcının konumuna göre özel form alanları oluşturmayı düşünün.
- Telefon Numarası Doğrulaması: Telefon numaralarını uluslararası standartlara göre doğrulayın.
libphonenumber-jsgibi kütüphaneler bu konuda yardımcı olabilir. - Sağdan Sola (RTL) Desteği: Form düzeninizin Arapça veya İbranice gibi RTL dillerini desteklediğinden emin olun. Daha iyi RTL desteği için CSS mantıksal özelliklerini (örneğin,
margin-leftyerinemargin-inline-start) kullanın. - Erişilebilirlik: Formlarınızın, konumlarından bağımsız olarak engelli kişiler tarafından kullanılabilir olmasını sağlamak için erişilebilirlik yönergelerine (WCAG) uyun.
Örnek: Yerelleştirilmiş Form Etiketleri
```jsx // i18n/locales/tr.json { "contactForm": { "nameLabel": "Ad", "emailLabel": "E-posta", "messageLabel": "Mesaj", "submitButton": "Gönder", "successMessage": "Form başarıyla gönderildi!", "errorMessage": "Form gönderilemedi." } } // i18n/locales/de.json (Örnek olarak) { "contactForm": { "nameLabel": "Name", "emailLabel": "E-Mail", "messageLabel": "Nachricht", "submitButton": "Senden", "successMessage": "Formular erfolgreich gesendet!", "errorMessage": "Fehler beim Senden des Formulars." } } // app/components/LocalizedContactForm.jsx 'use client' import { useTranslation } from 'react-i18next'; import { experimental_useFormStatus as useFormStatus } from 'react' import { submitContactForm } from '../actions' import { useState } from 'react'; function SubmitButton() { const { pending } = useFormStatus() const { t } = useTranslation(); return ( ) } export default function LocalizedContactForm() { const { t } = useTranslation(); const [message, setMessage] = useState(null); async function handleSubmit(formData) { const result = await submitContactForm(formData); setMessage(result); } return ({message.message}
)}Açıklama:
- Çeviri Dosyaları: Örnek, çevirileri yönetmek için
react-i18nextkullanır. Ayrı JSON dosyaları farklı diller için çeviriler içerir. useTranslationKancası:useTranslationkancası, yerelleştirilmiş dizeleri almak için kullanılan çeviri fonksiyonuna (t) erişim sağlar.- Yerelleştirilmiş Etiketler: Form etiketleri ve düğme metni, kullanıcının tercih ettiği dilde görüntülenmelerini sağlamak için
tfonksiyonu kullanılarak alınır.
Erişilebilirlik Hususları
Formlarınızın engelliler de dahil olmak üzere tüm kullanıcılar için erişilebilir olmasını sağlamak çok önemlidir. İşte bazı önemli erişilebilirlik hususları:
- Anlamsal HTML:
<label>,<input>,<textarea>ve<button>gibi anlamsal HTML elemanlarını doğru kullanın. - Etiketler:
<label>üzerindekiforözelliği ve form kontrolü üzerindekiidözelliği ile etiketleri form kontrolleriyle ilişkilendirin. - ARIA Nitelikleri: Yardımcı teknolojilere ek bilgi sağlamak için ARIA niteliklerini kullanın. Örneğin, bir form kontrolünü bir açıklamaya bağlamak için
aria-describedbykullanın. - Hata Yönetimi: Hataları açıkça belirtin ve yardımcı hata mesajları sağlayın. Geçersiz form kontrollerini belirtmek için
aria-invalidgibi ARIA niteliklerini kullanın. - Klavye Navigasyonu: Kullanıcıların klavyeyi kullanarak formda gezinebildiğinden emin olun. Gerekirse odak sırasını kontrol etmek için
tabindexözelliğini kullanın. - Renk Kontrastı: Metin ve arka plan renkleri arasında yeterli renk kontrastı olduğundan emin olun.
- Form Yapısı: Açık ve tutarlı bir form yapısı kullanın. İlgili form kontrollerini
<fieldset>ve<legend>elemanlarını kullanarak gruplandırın.
Örnek: Erişilebilir Hata Yönetimi
```jsx // app/components/AccessibleContactForm.jsx 'use client' import { experimental_useFormStatus as useFormStatus } from 'react' import { submitContactForm } from '../actions' import { useState } from 'react'; function SubmitButton() { const { pending } = useFormStatus() return ( ) } export default function AccessibleContactForm() { const [message, setMessage] = useState(null); const [errors, setErrors] = useState({}); async function handleSubmit(formData) { // Temel istemci tarafı doğrulama const newErrors = {}; if (!formData.get('name')) { newErrors.name = 'Ad zorunludur.'; } if (!formData.get('email')) { newErrors.email = 'E-posta zorunludur.'; } if (!formData.get('message')) { newErrors.message = 'Mesaj zorunludur.'; } if (Object.keys(newErrors).length > 0) { setErrors(newErrors); return; } setErrors({}); // Önceki hataları temizle const result = await submitContactForm(formData); setMessage(result); } return ({message.message}
)}Açıklama:
- Hata Durumu: Bileşen, doğrulama hatalarını izlemek için bir
errorsdurumu tutar. - İstemci Tarafı Doğrulama:
handleSubmitfonksiyonu, formu göndermeden önce temel istemci tarafı doğrulama gerçekleştirir. - ARIA Nitelikleri: Belirli bir form kontrolü için bir hata varsa
aria-invalidözelliğitrueolarak ayarlanır.aria-describedbyözelliği, form kontrolünü hata mesajına bağlar. - Hata Mesajları: Hata mesajları, ilgili form kontrollerinin yanında görüntülenir.
Potansiyel Zorluklar ve Sınırlamalar
- Deneysel Durum: Deneysel bir API olduğundan,
experimental_useFormStatusgelecekteki React sürümlerinde değiştirilebilir veya kaldırılabilir. React belgeleriyle güncel kalmak ve gerekirse kodunuzu uyarlamaya hazır olmak önemlidir. - Sınırlı Kapsam: Kanca öncelikle gönderim durumunu izlemeye odaklanır ve doğrulama veya veri işleme gibi kapsamlı form yönetimi özellikleri sağlamaz. Bu yönler için hala ek mantık uygulamanız gerekebilir.
- Sunucu Eylemi Bağımlılığı: Kanca, sunucu eylemleriyle çalışmak üzere tasarlanmıştır ve bu, tüm kullanım durumları için uygun olmayabilir. Sunucu eylemleri kullanmıyorsanız, form durumunu yönetmek için alternatif çözümler bulmanız gerekebilir.
Sonuç
experimental_useFormStatus kancası, özellikle sunucu eylemleri ve aşamalı geliştirme ile çalışırken React'te form gönderim durumlarını yönetmede önemli bir iyileştirme sunar. Durum yönetimini basitleştirerek ve açık ve öz bir API sağlayarak hem geliştirici deneyimini hem de kullanıcı deneyimini geliştirir. Ancak, deneysel doğası göz önüne alındığında, gelecekteki React sürümlerindeki güncellemeler ve potansiyel değişiklikler hakkında bilgi sahibi olmak çok önemlidir. Faydalarını, sınırlamalarını ve en iyi uygulamalarını anlayarak, React uygulamalarınızda daha sağlam ve kullanıcı dostu formlar oluşturmak için experimental_useFormStatus'ı etkili bir şekilde kullanabilirsiniz. Küresel bir kitle için kapsayıcı formlar oluşturmak amacıyla uluslararasılaştırma ve erişilebilirlik en iyi uygulamalarını dikkate almayı unutmayın.