<textarea>
Selaimen sisäänrakennettu <textarea>
-komponentti mahdollistaa monirivisen tekstisyötteen renderöimisen.
<textarea />
Viite
<textarea>
Näyttääksesi tekstikentän, renderöi selaimen sisäänrakennettu <textarea>
-komponentti.
<textarea name="postContent" />
Propsit
<textarea>
tukee kaikkia yleisten elementtien propseja.
Voit tehdä tekstikentästä kontrolloidun välittämällä value
propsin:
value
: Merkkijono. Kontrolloi tekstikentän tekstiä..
Kun välität value
-arvon, sinun täytyy myös välittää onChange
-käsittelijä, joka päivittää välitetyn arvon.
Jos <textarea>
on kontrolloimaton, voit välittää defaultValue
-propsin sen sijaan:
defaultValue
: Merkkijono. Määrittelee oletusarvon tekstikentälle.
Nämä <textarea>
-propsit ovat relevantteja sekä kontrolloimattomille että kontrolloiduille tekstikentille:
autoComplete
: Joko'on'
tai'off'
. Määrittelee automaattisen täydentämisen käyttäytymistä.autoFocus
: Totuusarvo. Jostrue
, React kohdistaa elementtiin mountatessa.children
:<textarea>
ei hyväksy lapsia. Oletusarvon asettamiseksi, käytädefaultValue
.cols
: Numero. Määrittää oletusleveyden keskimääräisinä merkkileveyksinä. Oletuksena arvoltaan20
.disabled
: Totuusarvo. Jostrue
, kenttä ei ole interaktiivinen ja näkyy himmennettynä.form
: Merkkijono. Määrittää<form>
lomakkeenid
:n johon tämä kenttä kuuluu. Jos jätetty pois, se on lähin ylätason lomake.maxLength
: Numero. Määrittää tekstin enimmäispituuden.minLength
: Numero. Määrittää tekstin vähimmäispituuden.name
: Merkkijono. Määrittää nimen tälle kentälle, joka lähetetään lomakkeessa.onChange
:Event
käsittelijäfunktio. Vaaditaan kontrolloituihin tekstikenttiin. Suoritetaan heti kun käyttäjä muuttaa kentän arvoa (esimerkiksi, suoritetaan jokaisella näppäinpainalluksella). Käyttäytyy kuten selaimeninput
tapahtuma.onChangeCapture
: VersioonChange
:sta, joka suoritetaan capture phase.onInput
:Event
käsittelijäfunktio. Suoritetaan heti kun käyttäjä muuttaa kentän arvoa. Historiallisista syistä, Reactissa on idiomaattista käyttää tämän tilallaonChange
, joka toimii samanlaisesti.onInputCapture
: VersioonInput
:sta joka suoritetaan nappausvaiheessa.onInvalid
:Event
käsittelijäfunktio. Suoritetaan jos syöte ei läpäise validointia lomaketta lähetettäessä. Toisin kuin selaimen sisäänrakennettuinvalid
-tapahtuma, ReactinonInvalid
-tapahtuma kuplii.onInvalidCapture
: VersioonInvalid
:sta joka suoritetaan nappausvaiheessa.onSelect
:Event
käsittelijäfunktio. Suoritetaan kun valinta<textarea>
:n sisällä muuttuu. React laajentaaonSelect
-tapahtuman myös tyhjälle valinnalle ja muokkauksille (jotka voivat vaikuttaa valintaan).onSelectCapture
: VersioonSelect
:sta joka suoritetaan nappausvaiheessa.placeholder
: Merkkijono. Näytetään himmennetyllä värillä kun kenttä on tyhjä.readOnly
: Totuusarvo. Jostrue
, kenttä ei ole käyttäjän muokattavissa.required
: Totuusarvo. Jostrue
, arvon on oltava lomaketta lähettäessä.rows
: Numero. Määrittää oletuskorkeuden keskimääräisinä merkkikorkeuksina. Oletuksena arvoltaan2
.wrap
: Joko'hard'
,'soft'
, tai'off'
. Määrittää miten tekstin tulisi rivittyä lomaketta lähettäessä.
Rajoitukset
- Lapsien välittäminen kuten
<textarea>something</textarea>
ei ole sallittua. KäytädefaultValue
-arvoa alustukselle. - Jos kenttä vastaanottaa merkkijonon
value
-propsissa, se käsitellään kontrolloituna. - Kenttä ei voi olla sekä kontrolloitu että kontrolloimaton samaan aikaan.
- Kenttä ei voi vaihtaa kontrolloidusta kontrolloimattomaksi elinkaarensa aikana.
- Jokainen kontrolloitu tekstikenttä tarvitsee
onChange
-käsittelijän, joka päivittää sen arvon synkronisesti.
Käyttö
Tekstikentän näyttäminen
Renderöi <textarea>
näyttääksesi tekstikentän. Voit määritellä sen oletuskoon rows
ja cols
attribuuteilla, mutta oletuksena käyttäjä voi muuttaa sen kokoa. Voit estää muuttamisen, voit määritellä resize: none
CSS:ssä.
export default function NewPost() { return ( <label> Kirjoita julkaisusi: <textarea name="postContent" rows={4} cols={40} /> </label> ); }
Otsikon tarjoaminen tekstikentälle
Tyypillisesti, asetat jokaisen <textarea>
-komponentin <label>
-komponentin sisään. Tämä kertoo selaimelle, että tämä otsikko on yhdistetty tähän tekstikenttään. Kun käyttäjä klikkaa otsikkoa, selain kohdistaa tekstikenttään. Tämä on myös tärkeää saavutettavuuden kannalta: ruudunlukija lukee otsikon ääneen, kun käyttäjä kohdistaa tekstikenttään.
Jos et voi sijoittaa <textarea>
-komponenttia <label>
-komponentin sisään, yhdistä ne välittämällä sama ID <textarea id>
:lle ja <label htmlFor>
:lle. Välttääksesi konflikteja yhden komponentin instanssien välillä, generoi tällainen ID useId
-hookilla.
import { useId } from 'react'; export default function Form() { const postTextAreaId = useId(); return ( <> <label htmlFor={postTextAreaId}> Write your post: </label> <textarea id={postTextAreaId} name="postContent" rows={4} cols={40} /> </> ); }
Oletusarvon tarjoaminen tekstikentälle
Voit vaihtoehtoisesti määritellä oletusarvon tekstikentälle. Välitä se defaultValue
-merkkijonona.
export default function EditPost() { return ( <label> Muokkaa julkaisuasi: <textarea name="postContent" defaultValue="Tykkäsin pyöräilystä eilen!" rows={4} cols={40} /> </label> ); }
Tekstikentän arvon lukeminen lomaketta lähettäessä
Lisää <form>
tekstikentän ympärille, jossa on <button type="submit">
sisällä. Se kutsuu <form onSubmit>
-käsittelijää. Oletuksena, selain lähettää lomakkeen datan nykyiseen URL:iin ja päivittää sivun. Voit ohittaa tämän käyttäytymisen kutsumalla e.preventDefault()
. Lue lomakkeen data new FormData(e.target)
avulla.
export default function EditPost() { function handleSubmit(e) { // Estä selainta lataamasta sivua uudelleen e.preventDefault(); // Lue lomakkeen data const form = e.target; const formData = new FormData(form); // Voit välittää formData:n suoraan fetchin bodylle: fetch('/some-api', { method: form.method, body: formData }); // Tai voit käsitellä sitä tavallisena oliona: const formJson = Object.fromEntries(formData.entries()); console.log(formJson); } return ( <form method="post" onSubmit={handleSubmit}> <label> Julkaisun otsikko: <input name="postTitle" defaultValue="Pyöräily" /> </label> <label> Muokkaa julkaisua: <textarea name="postContent" defaultValue="Tykkäsin pyöräilystä eilen!" rows={4} cols={40} /> </label> <hr /> <button type="reset">Nollaa muokkaukset</button> <button type="submit">Tallenna julkaisu</button> </form> ); }
Tekstikentän ohjaaminen tilamuuttujalla
Tekstikenttä kuten <textarea />
on kontrolloimaton. Vaikka välittäisit oletusarvon kuten <textarea defaultValue="Alkuteksti" />
, JSX määrittelee vain oletusarvon, ei arvoa juuri nyt.
Renderöidäksesi kontrolloidun tekstikentän, välitä value
-prop sille. React pakottaa tekstikentän aina sisältämään välittämäsi value
-arvon. Tyypillisesti, ohjaat tekstikenttää määrittämällä tilamuuttujan:
function NewPost() {
const [postContent, setPostContent] = useState(''); // Määrittele tilamuuttuja...
// ...
return (
<textarea
value={postContent} // ...pakota kentän arvo vastaamaan tilamuuttujaa...
onChange={e => setPostContent(e.target.value)} // ... ja päivitä tilamuuttuja muutoksissa!
/>
);
}
Tämä on hyödyllistä, jos haluat renderöidä uudelleen osan käyttöliittymästä jokaisella näppäinpainalluksella.
import { useState } from 'react'; import MarkdownPreview from './MarkdownPreview.js'; export default function MarkdownEditor() { const [postContent, setPostContent] = useState('_Hei,_ **Markdown**!'); return ( <> <label> Syötä markdown koodia: <textarea value={postContent} onChange={e => setPostContent(e.target.value)} /> </label> <hr /> <MarkdownPreview markdown={postContent} /> </> ); }
Vianmääritys
Tekstikenttäni ei päivity kun kirjoitan siihen
Jos renderöit tekstikentän value
:lla mutta ilman onChange
:a, näet virheen konsolissa:
// 🔴 Bugi: kontrolloitu tekstikenttä ilman onChange käsittelijää
<textarea value={something} />
value
prop to a form field without an onChange
handler. This will render a read-only field. If the field should be mutable use defaultValue
. Otherwise, set either onChange
or readOnly
.Kuten virheviesti ehdottaa, jos haluat vain määrittää alkuarvon, välitä defaultValue
sen sijaan:
// ✅ Hyvä: kontrolloimaton tekstikenttä oletusarvolla
<textarea defaultValue={something} />
If you want to control this text area with a state variable, specify an onChange
handler:
Jos haluat ohjata tätä tekstikenttää tilamuuttujalla, määrittele onChange
-käsittelijä:
// ✅ Hyvä: kontrolloitu tekstikenttö onChange:lla
<textarea value={something} onChange={e => setSomething(e.target.value)} />
Jos arvo on tarkoituksella vain-luku -tilassa, lisää readOnly
-propsi virheen poistamiseksi:
// ✅ Hyvä: vain-luku tilassa oleva kontrolloitu tekstikenttä ilman muutoksenkäsittelijää
<textarea value={something} readOnly={true} />
Tekstikentän kursori hyppää alkuun jokaisen näppäinpainalluksen yhteydessä
Jos kontrolloit tekstikenttää, sinun täytyy päivittää sen tilamuuttuja tekstikentän arvolla DOM:sta onChange
:ssa.
Et voi päivittää sitä joksikin muuksi kuin e.target.value
:
function handleChange(e) {
// 🔴 Bugi: kentän päivittäminen joksikin muuksi kuin e.target.value
setFirstName(e.target.value.toUpperCase());
}
Et voi päivittää sitä asynkronisesti:
function handleChange(e) {
// 🔴 Bugi: kentän päivittäminen asynkronisesti
setTimeout(() => {
setFirstName(e.target.value);
}, 100);
}
Korjataksesi koodin, päivitä se synkronisesti e.target.value
:lla:
function handleChange(e) {
// ✅ Kontrolloidun kentän päivittäminen e.target.value:lla synkronisesti
setFirstName(e.target.value);
}
Jos tämä ei korjaa ongelmaa, on mahdollista, että tekstikenttä poistetaan ja lisätään takaisin DOM:iin jokaisen näppäinpainalluksen yhteydessä. Tämä voi tapahtua jos vahingossa nollaat tilan jokaisen uudelleenrenderöinnin yhteydessä. Esimerkiksi, tämä voi tapahtua jos tekstikenttä tai jokin sen vanhemmista saa aina erilaisen key
-attribuutin, tai jos upotat komponenttimäärittelyjä (joka ei ole sallittua Reactissa ja aiheuttaa “sisäisen” komponentin uudelleenmounttauksen jokaisella renderöinnillä).
Saan virheen: “A component is changing an uncontrolled input to be controlled”
Jos tarjoat value
:n komponentille, sen täytyy pysyä merkkijonona koko elinkaarensa ajan.
Et voi välittää value={undefined}
ensin ja myöhemmin välittää value="some string"
koska React ei tiedä haluatko komponentin olevan kontrolloimaton vai kontrolloitu. Kontrolloidun komponentin tulisi aina saada merkkijonona value
, ei null
tai undefined
.
Jos value
tulee API:sta tai tilamuuttujasta, se voi olla alustettu null
tai undefined
. Tässä tapauksessa, joko aseta se tyhjäksi merkkijonoksi (''
) aluksi, tai välitä value={someValue ?? ''}
varmistaaksesi, että value
on merkkijono.