Bir React formu her alanın değerini state'te tutar: input value={state} gösterir ve onu onChange ile günceller. Kullanıcı formu gönderdiğinde bir onSubmit işleyicisi sayfa yenilenmesini durdurmak için e.preventDefault() çağırır ve sonra zaten state'te olan değerleri kullanır.
Bir ad yaz ve Enter'a bas ya da düğmeye tıkla. Sonra e.preventDefault(); satırını sil: önizleme, tarayıcının yerel bir gönderimde göndereceği alanları gösterir; gerçek bir sayfada bu ayrıca sayfayı yeniden yüklerdi.
Değeri state'ten gelen bir input'a kontrollü input (controlled input) denir. Alternatifi, yani değeri DOM'un tutmasına izin verip sonra okumak, kontrollü ve kontrolsüz bileşenler sayfasında anlatılıyor.
Metin input'ları ve textarea
Her metin alanı aynı şekilde çalışır: value state'ten gelir, onChange e.target.value'yu okur. Bir <textarea> da aynı kalıbı izler. HTML'de metni etiketlerin arasına yazılır, ama React'te onu value olarak aktarırsın.
Değeri kendin ayarladığın için kullanıcının yazdığını görünmeden önce değiştirebilirsin: başlık alanı her harfi büyük harfe çevirir. Karakter sayacı her tuş vuruşunda güncellenir, çünkü body state'tir ve her değişiklik yeniden render eder.
Select
Bir <select>, bir option üzerinde selected değil, select öğesinin kendisinde value alır. e.target.value, seçilen option'ın value'sudur.
Çoklu seçim için multiple ekle ve value olarak bir dizi aktar. Seçimleri Array.from(e.target.selectedOptions, (o) => o.value) ile oku.
Onay kutusu ve radyo düğmeleri
Bir onay kutusu value ile değil checked ile kontrol edilir ve işleyicisi true ya da false olan e.target.checked'i okur. Bir gruptaki radyo düğmeleri bir name paylaşır; her biri, state kendi değerine eşit olduğunda işaretlidir.
Bir onay kutusunda e.target.value okumak yaygın bir hatadır: value özelliği olmayan bir onay kutusu için, kutu işaretli olsun ya da olmasın "on" metnini döndürür.
Birçok alan için tek bir state nesnesi
On alanlı bir formun on useState çağrısına ve on işleyiciye ihtiyacı yoktur. Tek bir nesne tut, her input'a bir anahtarla eşleşen bir name ver ve adı hesaplanmış bir anahtar olarak kullanan tek bir işleyici yaz: [e.target.name].
İşleyici input tipini kontrol eder; böylece onay kutusu bir boolean, diğerleri metin saklar. Başlangıç nesnesine bir anahtar ve aynı name'e sahip bir input ekleyerek bir alan ekle; işleyicinin değişmesi gerekmez. Spread diğer her alanı korur (bkz. dizileri ve nesneleri güncellemek).
Bir formu göndermek
Gönderme mantığını düğmenin onClick'ine değil, formun onSubmit'ine koy. onSubmit, kullanıcı bir metin alanında Enter'a bastığında da tetiklenir; bir tıklama işleyicisi bunu kaçırırdı. Bir formun içindeki <button> varsayılan olarak bir gönder düğmesidir; diğer düğmelere göndermemeleri için type="button" ver.
Konsolu aç, bir parola yaz ve Enter'a bas: form tüm nesneyi kaydeder. "Clear"a tıklamak hiçbir şey kaydetmez, çünkü type="button"'dur. O özelliği kaldır; Clear da göndermeye başlar.
Doğrulama ve hataları göstermek
Basit doğrulama, değerleri alıp bir mesaj nesnesi döndüren bir fonksiyondur. Onu gönderimde çalıştır, sonucu state'te sakla ve her mesajı alanının altında göster. Çift tıklamanın formu iki kez göndermemesi için bir istek çalışırken gönder düğmesini devre dışı bırak.
Alanlar boşken Save'e tıkla ve iki mesajı da gör, sonra alanları doldur. saveProfile gerçek bir isteğin yerine geçer: 800 milisaniye bekler ve resolve olur. noValidate özelliği tarayıcının kendi doğrulama balonlarını kapatır, böylece yalnızca senin mesajların görünür; karşılaştırmak için onu kaldır ve bir input'a required ekle.
Hatalar saklanmak yerine render sırasında da hesaplanabilir, örneğin const emailError = form.email && !form.email.includes('@'); bu, kullanıcı yazarken mesajı gösterir. Forma uyan zamanlamayı seç: gönderimde göstermek daha sakindir, yazarken göstermek daha hızlı geri bildirim verir.
React 19'da form action'ları
React 19 bir formu ele almanın başka bir yolunu ekler. Formun action prop'una bir fonksiyon aktar. React sayfa yenilenmesini senin için engeller ve fonksiyonu name'i olan her alanı tutan bir FormData nesnesiyle çağırır. Alanların hiç state'e ihtiyacı yoktur: kontrolsüzdürler ve React action bittikten sonra onları temizler.
Kendi yorumunu yaz ve gönder. Liste senin metnini gösterir ve input Nice docs'a geri döner: action resolve olduktan sonra React kontrolsüz alanları defaultValue'larına sıfırlar. Action async olabilir ve çalışırken React güncellemeyi bir transition olarak ele alır.
Action'dan bir bekleme durumu ya da bir hata göstermek için onu useActionState ile sar; bu en son sonucu, form için sarılmış bir action'ı ve bir isPending bayrağını döndürür. Formun derinlerindeki bir düğme de bekleme durumunu react-dom'dan useFormStatus ile okuyabilir:
import { useFormStatus } from 'react-dom';
function SubmitButton() {
const { pending } = useFormStatus();
return <button disabled={pending}>{pending ? 'Posting...' : 'Post'}</button>;
}
useFormStatus buradaki editörlerde yüklü değil, bu yüzden yalnızca bu statik blokta görünüyor. Formu render eden bileşende değil, <form>'un içinde render edilen bir bileşenden çağrılmalıdır.
onSubmit ile kontrollü state ve FormData ile form action'ları React 19'da ikisi de çalışır. Kontrollü alanlar sen yazarken tepki veren formlara uyar (canlı doğrulama, karakter sayacı, birbirine bağlı alanlar). Action'lar ise değerlere yalnızca kullanıcı gönderdiğinde ihtiyaç duyduğun formlara uyar.
Sıkça Sorulan Sorular
React'te bir input'un değeri nasıl alınır?
Onu state'te sakla ve onChange'den güncelle: <input value={name} onChange={e => setName(e.target.value)} />. Mevcut metin böylece her zaman name içindedir. Onay kutuları için e.target.value yerine e.target.checked oku.
React'te bir formun sayfayı yenilemesi nasıl engellenir?
onSubmit işleyicisinin başında e.preventDefault() çağır. O olmadan tarayıcı, sayfadan ayrılan ve sayfayı yeniden yükleyen normal bir form gönderimi yapar.
React'te birçok input tek bir state ile nasıl yönetilir?
State'te tek bir nesne tut, her input'a bir anahtarla eşleşen bir name ver ve hesaplanmış bir anahtarla tek bir işleyici kullan: setForm({ ...form, [e.target.name]: e.target.value }).
React'te textarea neden children yerine value kullanır?
HTML'de bir textarea'nın metni etiketleri arasında durur, ama React'te onu bir input gibi value (ya da defaultValue) olarak aktarırsın. Böylece bir React formundaki her metin alanı aynı şekilde çalışır.
React 19'da form action'ları nedir?
React 19'da <form action={fn}>'e bir fonksiyon aktarabilirsin. React sayfa yenilenmesini engeller, fonksiyonu formun FormData'sı ile çağırır ve bitince kontrolsüz alanları sıfırlar. useActionState bunun üstüne bir bekleme bayrağı ve bir sonuç ekler.