<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:Eventkä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 selaimeninputtapahtuma.onChangeCapture: VersioonChange:sta, joka suoritetaan capture phase.onInput:Eventkä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:Eventkä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:Eventkä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.