<textarea>
Tarayıcıya yerleşik <textarea>
bileşeni çok satırlı metin kutusu render etmenizi sağlar.
<textarea />
Referans
<textarea>
Ekranda bir metin alanı göstermek için, tarayıcıya yerleşik <textarea>
bileşenini render edin.
<textarea name="gonderiIcerigi" />
Daha fazla örnek için aşağıya bakınız.
Prop’lar
<textarea>
tüm ortak eleman proplarını destekler.
value
propu ileterek metin alanını kontrollü hale getirebilirsiniz :
value
: String. Metin alanı içindeki metni kontrol eder.
value
değeri ilettiğinizde, iletilen değeri güncelleyen onChange
olay yöneticisini de iletmeniz gerekmektedir.
Eğer <textarea>
bileşeniniz kontrolsüz ise, onun yerine defaultValue
propunu iletebilirsiniz:
defaultValue
: String. Metin alanının başlangıç değerini belirler.
Bu <textarea>
propları hem kontrollü hem de kotrolsüz metin alanları için geçerlidir:
autoComplete
:'on'
ya da'off'
. Otomatik tamamlama davranışlarını belirtir.autoFocus
: Boolean. Eğertrue
ise, React, eleman DOM’a eklendikten sonra o elamana odaklanacaktır.children
:<textarea>
alt bileşen kabul etmez. Başlangıç değeri ayarlamak içindefaultValue
kullanınız.cols
: Sayı. Ortalama karakter genişliklerinde,varsayılan genişliği belirler. Varsayılan değeri20
dir.disabled
: Boolean. Eğertrue
ise, metin alanı etkileşimli olmayacak ve soluk renkli görünecektir.form
: String. Metin kutusunun ait olduğu<form>
bileşenininid
’sini belirtir. Eğer belirtilmezse, ağaçtaki en yakın üst formdur.maxLength
: Sayı. Metnin maksimum uzunluğunu belirtir.minLength
: Sayı. Metnin minimum uzunluğunu belirtir.name
: String. Form ile birlikte gönderilen metin kutusunun adını belirtir.onChange
:olay
yöneticisi fonksiyonu. Kontrollü metin alanları için gereklidir. Kullanıcı tarafından, girdi değeri değiştiği anda çalışır (örneğin, klavyede tuşa her basıldığında çalışır). Tarayıcıinput
olayı](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/input_event) gibi çalışır.onChangeCapture
: Yakalama aşamasında çalışanonChange
’in bir versiyonudur.onInput
:Olay
yöneticisi fonksiyonu. Değer, kullanıcı tarafından değiştirildiği anda çalıştırılır. Tarihsel nedenlerden dolayı, React’te benzer şekilde çalışanonChange
’i kullanmak yaygındır.onInputCapture
:onInput
’un yakalama aşamasında çalıştırılan versiyonudur.onInvalid
:Olay
yöneticisi fonksiyonu. Bir girdi, form gönderiminde doğrulamayı geçemezse çalıştırılır. Yerleşikinvalid
olayının aksine, ReactonInvalid
olayı kabarcık şeklinde yayılır (bubbles).onInvalidCapture
:onInvalid
’in yakalama aşamasında çalıştırılan bir versiyionudur.onSelect
:Olay
yöneticisi fonksiyonu.<textarea>
içindeki seçilen alanın değişmesiyle tetiklenir. React,onSelect
olayını boş seçim ve düzenlemelerde de (seçimi etkileyebilir) çalıştırır.onSelectCapture
:onSelect
’in yakalama aşamasında çalıştırılan bir versiyonudur.placeholder
: String. Metin alanı boşken ekranda soluk renkte görüntülenir.readOnly
: Boolean. Eğertrue
ise, metin alanı kullanıcı tarafından düzenlenemez.required
: Boolean. Eğertrue
ise, formun gönderilebilmesi için değer sağlanmalıdır.rows
: Sayı. Ortalama karakter yüksekliklerinde, varsayılan yüksekliği belirler. Varsayılan değeri2
dir.wrap
:'hard'
,'soft'
, ya da'off'
değerlerini alabilir. Form gönderiliken metnin nasıl sarmalanacağını belirler.
Uyarılar
<textarea>something</textarea>
şeklinde alt bileşen gönderimine izin verilmez. Başlangıç içeriği içindefaultValue
kullanınız.- Bir metin alanı
value
propuna string değer alırsa, kontrollü olarak ele alınır. . - Bir metin alanı aynı anda hem kontrollü hem de kontrolsüz olamaz.
- Bir metin alanı yaşam döngüsü boyunca kontrollü ve kontrolsüz olma arasında geçiş yapamaz.
- Kontrollü tüm metin alanları, değerini senkronize olarak güncelleyecen
onChange
olay yöneticisine ihtiyaç duyar.
Kullanım
Metin alanını gösterme
Ekranda <textarea>
’yı görüntülemek için render ediniz. Varsayılan değerlerini rows
and cols
niteliklerini kullanarak belirleyebilirsiniz ancak varsayılan olarak kullanıcı yeniden boyutlandırabilir. Yeniden boyutlandırmayı devre dışı bırakmak için, CSS’te resize: none
şeklinde belirtebilirsiniz.
export default function NewPost() { return ( <label> Gönderinizi yazın: <textarea name="gonderiIcerigi" rows={4} cols={40} /> </label> ); }
Metin alanı için etiket verme
Genel olarak, her <textarea>
elemanını bir <label>
](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/label) elemanı içine yerleştirirsiniz. Bu, tarayıcıya bu etiketin o metin alanıyla ilişkili olduğunu söyler. Kullanıcı bu etikete tıkladığında, tarayıcı o metin alanına odaklanır. Bu durum ayrıca erişebilirlik için de önemlidir: kullanıcı metin alanına tıkladığında ekran okuyucu bu etiketi okuyacaktır.
Eğer <textarea>
bir <label>
elemanının içine yerleştiremezseniz, <textarea id>
ve <label htmlFor>
elemanlarına aynı ID’yi ileterek bu elemanları ilişkilendirebilirsiniz. Bir bileşenin birden fazla örnekleri arasındaki çakışmaları önlemek için useId
ile ID üretebilirsiniz.
import { useId } from 'react'; export default function Form() { const postTextAreaId = useId(); return ( <> <label htmlFor={postTextAreaId}> Gönderinizi yazın: </label> <textarea id={postTextAreaId} name="gonderiIcerigi" rows={4} cols={40} /> </> ); }
Metin alanına başlangıç değeri verme
defaultValue
değerini string olarak ileterek metin alanına başlangıç değeri verebilirsiniz.
export default function EditPost() { return ( <label> Gönderinizi düzenleyin: <textarea name="gonderiIcerigi" defaultValue="Dün bisiklet sürmekten gerçekten keyif verdi!" rows={4} cols={40} /> </label> ); }
Formu gönderirken metin alanı değerini okuma
<button type="submit">
ve metin alanınızı çevreleyen bir <form>
ekleyin. Eklediğiniz buton <form onSubmit>
olay yöneticisini çağıracaktır. Varsayılan olarak, tarayıcı form verilerini bulunduğunuz URL’e gönderecek ve sayfayı yenileyecektir. e.preventDefault()
ifadesini çağırarak bu işlemi engelleyebilirsiniz. Form verilerini new FormData(e.target)
ile okuyabilirsiniz.
export default function EditPost() { function handleSubmit(e) { // Tarayıcının sayfayı yenilemesini engelleyin e.preventDefault(); // Form verisini okuyun const form = e.target; const formData = new FormData(form); // formDatayı fetch gövdesi olarak iletebilirsiniz: fetch('/some-api', { method: form.method, body: formData }); // formDatayı Düz nesne gibi de kullanabilirsiniz const formJson = Object.fromEntries(formData.entries()); console.log(formJson); } return ( <form method="post" onSubmit={handleSubmit}> <label> Gönderi başlığı: <input name="gonderiBasligi" defaultValue="Bisiklet Sürmek" /> </label> <label> Gönderinizi düzenleyin: <textarea name="gonderiIcerigi" defaultValue="Dün bisiklet sürmekten gerçekten keyif verdi!" rows={4} cols={40} /> </label> <hr /> <button type="reset">Düzenlemeleri sıfırla</button> <button type="submit">Gönderiyi kaydet</button> </form> ); }
Durum değişkeniyle metin alanını kontrol etme
<textarea />
şeklindeki metin alanları kontrolsüzdür. <textarea defaultValue="Başlangıç metni" />
gibi başlangıç değeri iletseniz bile, JSX’iniz şu anki değeri değil, yalnızca başlangıç değerini belirtir.
Kontrollü metin alanını render etmek için, metin alanına value
propunu iletin. React, her zaman metin alanı değerinin sizin ilettiğiniz value
değeri olması için zorlayacaktır. Genelde, durum değişkeni: tanımlayarak metin alanınızı kontrol edeceksiniz.
function NewPost() {
const [postContent, setPostContent] = useState(''); // Durum değişkeni tanımlayınız...
// ...
return (
<textarea
value={postContent} //.. girdinin değerinin durum değişkeniyle eşleşmesi için zorlayınız...
onChange={e => setPostContent(e.target.value)} //...ve her düzenlemede durum değişkenini güncelleyiniz!
/>
);
}
Bu işlem, eğer klavyedeki her girişte arayüzün bazı parçalarını yeniden render edecekseniz kullanışlıdır.
{ "dependencies": { "react": "latest", "react-dom": "latest", "react-scripts": "latest", "remarkable": "2.0.1" }, "scripts": { "start": "react-scripts start", "build": "react-scripts build", "test": "react-scripts test --env=jsdom", "eject": "react-scripts eject" }, "devDependencies": {} }
Sorun giderme
Metin alanına yazarken güncellenmiyor
Metin alanınızı value
değeri ile render ederken onChange
olay yöneticisi yoksa konsolde şu hatayı göreceksiniz:
// 🔴 Hata: kontrol edilen metin alanının onChange olay yöneticisi yok
<textarea value={something} />
onChange
yöneticisi olmayan bir form alanına value
propu verdiniz. Bu, salt okunur bir alan oluşturacaktır. Alanın değişken olması gerekiyorsa defaultValue
kullanın. Aksi takdirde, onChange
veya readOnly
olarak ayarlayın.Hata mesajında önerildiği üzere, sadece başlangıç değeri belirlemek istiyorsanız defaultValue
kullanın:
// ✅ İyi: başlangıç değeri olan kontrolsüz metin alanı
<textarea defaultValue={something} />
Metin alanını durum değişkeni ile kontrol etmek için onChange
yöneticisi belirleyin:
// ✅ İyi: onChange yöneticisi olan kontrollü metin alanı
<textarea value={something} onChange={e => setSomething(e.target.value)} />
Değer bilerek salt okunur ayarlanmak isteniyorsa, hatayı readOnly
propu ekleyerek önleyebilirsiniz:
// ✅ İyi: salt okunur kontrollü metin alanı
<textarea value={something} readOnly={true} />
Metin alanındaki imlecim klavyeden her girişte en başa atlıyor
Bir metin alanını kontrol ediyorsanız, onChange
sırasında DOM’daki metin alanı değerini durum değişkenine göre güncellemelisiniz.
e.target.value
dışında başka bir değerle güncelleyemezsiniz:
function handleChange(e) {
// 🔴 Hata: bir girişi e.target.value dışında bir şeyle güncelleme
setFirstName(e.target.value.toUpperCase());
}
Ayrıca asenkron olarak da güncelleyemezsiniz:
function handleChange(e) {
// 🔴 Hata: bir girişi asenkron güncelleme
setTimeout(() => {
setFirstName(e.target.value);
}, 100);
}
Kodunuzu düzeltmek için, senkron bir şekilde e.target.value
değeriyle güncelleyiniz:
function handleChange(e) {
// ✅ Kontrollü girişi e.target.value değeriyle senkron güncelleme
setFirstName(e.target.value);
}
Eğer bunlar sorununuzu çözmezse, metin alanınız her klavye girişinde DOM’dan silinip geri ekleniyor olabilir. Bu durum, her yeniden renderda durumu sıfırlama’dan kaynaklı olabilir. Örneğin, metin alanı ya da onun üstündeki elemanlar sürekli farklı key
niteliği alıyor olabilir veya bileşen tanımlarını iç içe yerleştirmenizden kaynaklı olabilir. (React’ta iç içe yerleştirmelere izin verilmez ve “içteki” bileşen her renderda yeniden bağlanır.)
”Bir bileşen kontrolsüz girişi kontrol ediyor” hatası alıyorum
Bileşeninize value
değeri verdiyseniz, yaşam döngüsü boyunca string olarak kalmalıdır.
Önce value={undefined}
olarak değer iletip daha sonra value="some string"
şeklinde değer iletemezsiniz çünkü React, kontrollü bileşen mi kontrolsüz bileşen mi bunu bilemez. Kontrollü bileşen her zaman value
değeri olarak string almalıdır, null
ya da undefined
almamalıdır.
value
değeriniz API’den veya durum değişkeninden geliyorsa, başta null
veya undefined
olarak tanımlanmış olabilir. Bu durumda boş bir string olarak (''
) tanımlayabilirsiniz veya value={someValue ?? ''}
olarak iletip value
değerinin string olup olmadığına emin olabilirsiniz.