Menu

React'te Kontrollü ve Kontrolsüz Bileşenler

Kontrollü bir input değerini React state'inden alır ve yalnızca onChange ile değişir. Kontrolsüz bir input kendi değerini DOM'da tutar; onu bir ref ya da FormData ile okursun. Farkı, yaygın uyarıları ve hangisinin ne zaman kullanılacağını öğren.

Bu sayfada çalıştırılabilir editörler var - düzenle, çalıştır ve sonucu anında gör.

Kontrollü (controlled) bir bileşen, değeri React state'inde yaşayan bir form öğesidir: value aktarır ve state'i onChange içinde güncellersin, böylece input'un ne göstereceğine React karar verir. Kontrolsüz (uncontrolled) bir bileşen ise değerini düz HTML gibi DOM'da tutar: bir başlangıç defaultValue'su aktarır ve mevcut değeri sonra bir ref ya da FormData aracılığıyla okursun.

İki input'a da yaz. Paragraf her tuş vuruşunda ilkini takip eder, çünkü her değişiklik state ayarlar ve yeniden render eder. İkinci input yalnızca DOM'da değişir; React render etmez ve değerini yalnızca "Read both" onu istediğinde görürsün.

Kontrollü input'lar

Kontrollü bir input'ta tek doğruluk kaynağı React state'idir. Her tuş vuruşundaki akış şöyledir:

  1. Kullanıcı yazar ve tarayıcı bir input olayı tetikler.
  2. onChange işleyicin e.target.value'yu okur ve setter'ı çağırır.
  3. React yeniden render eder ve yeni state'i input'un value'suna geri yazar.

Kodun bu döngünün ortasında durduğu için kontrolsüz bir input'un yapamayacağı şeyleri yapabilirsin: karakterleri reddetmek ya da yeniden şekillendirmek, değeri başka bir yerde göstermek, değer geçerli olana kadar bir düğmeyi devre dışı bırakmak ya da değeri koddan ayarlamak (bir "Clear" düğmesi, kullanıcının tıkladığı bir öneri).

Harf yazmayı dene: hiç görünmezler, çünkü işleyici state'i ayarlamadan önce rakam olmayan her şeyi ayıklar. Verify düğmesi tam olarak altı rakam olana kadar devre dışı kalır.

Formlar sayfasındaki form örnekleri kontrollü input kullanır ve çoğu React kodunda varsayılan seçim budur.

Kontrolsüz input'lar

Kontrolsüz bir input düz HTML gibi çalışır. React onu bir kez defaultValue (onay kutuları ve radyolar için defaultChecked) ile render eder ve sonra kendi hâline bırakır. Değeri okumak için ya öğeye bir ref tut ya da gönderimde formdaki tüm adlandırılmış alanları FormData ile oku.

Alanlar için state ve onChange yoktur. Değerler yalnızca form gönderildiğinde toplanır. Onay kutusunun işaretini kaldır ve yeniden gönder: subscribe anahtarı kaybolur, çünkü işaretlenmemiş bir onay kutusu FormData'nın hiç parçası değildir.

İlk render'dan sonra defaultValue'yu değiştirmek input'a hiçbir şey yapmaz, çünkü React onu yalnızca öğe oluşturulurken uygular. Kontrolsüz bir formu sıfırlamak için e.target.reset() çağır ya da React'in taze input'lar oluşturması için forma yeni bir key ver.

Yazılamayan bir input

value aktarıp onChange aktarmazsan input kontrollüdür, ama hiçbir şey state'i asla güncellemez. React her tuş vuruşundan sonra aynı değeri geri yazar, bu yüzden input donmuş görünür.

Her alana yazmayı dene. İlki değişmez. İkincisi kontrollü bir input için çözümdür ve oraya yazdıkça ilk ve son alanlar onu takip eder, çünkü üçü de aynı state'i okur. Üçüncüsü kontrolsüz olduğu için yazmayı kabul eder. Dördüncüsü düzenlenemeyeceğini bilerek söyler.

Geliştirmede React ilk input için bir uyarı kaydeder: "You provided a value prop to a form field without an onChange handler". Önizleme bir production derlemesi gibi çalışır, bu yüzden bu uyarıyı burada görmezsin, ama kendi geliştirme sunucunda görürsün.

Kontrolsüzden kontrollüye geçmek

React bir input'un kontrollü olup olmadığına value'ya bakarak karar verir. value undefined ya da null ise input kontrolsüzdür. Yani value'su undefined olarak başlayıp sonra bir metne dönüşen bir input, ömrü boyunca kontrolsüzden kontrollüye geçer ve React geliştirmede uyarır: "A component is changing an uncontrolled input to be controlled".

Uyarı gerçek bir hataya işaret eder. Ters yöne, bir metinden undefined'a gitmek input'u yeniden kontrolsüz yapar ve React ona yazmayı bırakır.

İki input'a da bir şey yaz ve her Clear düğmesine bas. İkinci input boşalır. İlki metnini korur: state'i undefined yapmak onu kontrolsüz yaptı, bu yüzden React artık ne gösterdiğini kontrol etmiyor.

undefined'ın olağan kaynağı henüz yüklenmemiş veri (kullanıcı gelmeden önce value={user.name}) ya da henüz var olmayan bir nesne alanıdır. İki çözüm:

const [name, setName] = useState('');   // start with a string
<input value={user?.name ?? ''} />       // or fall back to one

Onay kutuları için aynı kural checked'e uygulanır: onu undefined değil false ile başlat.

Dosya input'ları her zaman kontrolsüzdür

Bir <input type="file"> kontrol edilemez, çünkü tarayıcılar bir sayfanın değerini ayarlamasına izin vermez (diskindeki dosyaları seçebilen bir sayfa bir güvenlik açığı olurdu). Seçilen dosyaları onChange içinde e.target.files'tan ya da form gönderildiğinde bir ref aracılığıyla oku.

Bilgisayarından bir iki dosya seç; hiçbir şey yüklenmez, örnek yalnızca adları ve boyutları listeler. Bir dosya input'una ayarlayabileceğin tek değer boş metindir; Clear düğmesi onu böyle sıfırlar.

Hangisi ne zaman seçilmeli

KontrollüKontrolsüz
Değerin yaşadığı yerReact state'iDOM
Başlangıç değerini ayarlamavalue / checkeddefaultValue / defaultChecked
Değeri okumaHer an, state'tenBir ref ile ya da gönderimde FormData ile
Her tuş vuruşunda renderEvetHayır
Değeri koddan değiştirmeState ayarlaBir ref aracılığıyla DOM'a yaz
Uygun olduğu yerCanlı doğrulama, biçimlendirme, bağımlı alanlarGönderimde okunan basit formlar, dosya input'ları, form action'ları

Ekranın kullanıcı yazarken değere tepki vermesi gerekiyorsa kontrollüyü seç. Değerlere yalnızca sonda ihtiyacın varsa kontrolsüzü seç; React 19 form action'ları da böyle çalışır: <form action={fn}> fonksiyonuna bir FormData verir ve sonrasında kontrolsüz alanları sıfırlar.

Her tuş vuruşunda render etmek pahalı gibi gelir, ama normal bir form için sorun değildir. Ancak büyük, yavaş bir ağaç input'la birlikte yeniden render olduğunda sorun hâline gelir; o zaman state'i input'a yakın tut ya da yavaş kısmı kendi bileşenine taşı.

Aynı iki kelime kendi bileşenlerini de tarif eder. Değerini ve bir onChange'i ebeveyninden props aracılığıyla alan bir bileşen ebeveyn tarafından kontrol edilir; kendi state'ini tutan bir bileşen ise kontrolsüzdür. Bir bileşeni kontrollü yapmak için state'i yukarı taşımak, state'i yukarı taşımak sayfasının konusudur.

Sıkça Sorulan Sorular

React'te kontrollü bileşen nedir?

Mevcut değeri React state'inden gelen, value (ya da checked) ile ayarlanan ve onChange aracılığıyla güncellenen bir form öğesidir. Tek doğruluk kaynağı React state'idir, bu yüzden değeri her zaman bilirsin ve koddan değiştirebilirsin.

React'te kontrolsüz bileşen nedir?

Düz HTML gibi kendi değerini DOM'da tutan bir form öğesidir. Ona defaultValue (ya da defaultChecked) ile bir başlangıç değeri verirsin ve mevcut değeri ihtiyacın olduğunda bir ref ya da gönderimde FormData aracılığıyla okursun.

React input'uma neden yazamıyorum?

onChange olmadan value aktardın. Input kontrollüdür, bu yüzden React her tuş vuruşundan sonra state değerini geri koyar. State'i güncelleyen bir onChange ekle, defaultValue'ya geç ya da gerçekten değişmemesi gerekiyorsa readOnly ekle.

"A component is changing an uncontrolled input to be controlled" uyarısını nasıl düzeltirim?

Input'un value'su undefined (ya da null) olarak başladı ve sonra bir metne dönüştü. Her zaman bir metin olduğundan emin ol: state'i '' ile başlat ya da value={name ?? ''} yaz.

Kontrollü mü, kontrolsüz input mu kullanmalıyım?

Arayüz kullanıcı yazarken değere tepki veriyorsa kontrollü input kullan: doğrulama, biçimlendirme, devre dışı bir düğme, birbirine bağlı alanlar. Değerlere yalnızca gönderimde ihtiyacın varsa ve her zaman kontrolsüz olan dosya input'ları için kontrolsüz input kullan.

Coddy programlama dilleri çizimi

Coddy ile kodlamayı öğren

BAŞLA