<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 kodhistaa 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 ohjattuihin 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. function. Fires immediately when the value is changed by the user. For historical reasons, in React it is idiomatic to useonChange
instead which works similarly.onInputCapture
: VersioonInput
:sta joka suoritetaan nappausvaiheessa.onInvalid
:Event
käsittelijäfunktio. Fires if an input fails validation on form submit. Unlike the built-ininvalid
event, the ReactonInvalid
event bubbles.onInvalidCapture
: VersioonInvalid
:sta joka suoritetaan nappausvaiheessa.onSelect
:Event
käsittelijäfunktio. Fires after the selection inside the<textarea>
changes. React extends theonSelect
event to also fire for empty selection and on edits (which may affect the selection).onSelectCapture
: VersioonSelect
:sta joka suoritetaan nappausvaiheessa.placeholder
: Merkkijono. Displayed in a dimmed color when the text area value is empty.readOnly
: Totuusarvo. Iftrue
, the text area is not editable by the user.required
: Totuusarvo. Iftrue
, the value must be provided for the form to submit.rows
: Numero. Määrittää oletuskorkeuden keskimääräisinä merkkikorkeuksina. Defaults to2
.wrap
: Joko'hard'
,'soft'
, tai'off'
. Määrittää miten tekstin tulisi rivittyä lomaketta lähettäessä.
Rajoitukset
- Passing children like
<textarea>something</textarea>
is not allowed. UsedefaultValue
for initial content. - If a text area receives a string
value
prop, it will be treated as controlled. - A text area can’t be both controlled and uncontrolled at the same time.
- A text area cannot switch between being controlled or uncontrolled over its lifetime.
- Every controlled text area needs an
onChange
event handler that synchronously updates its backing value.
Käyttö
Displaying a text area
Render <textarea>
to display a text area. You can specify its default size with the rows
and cols
attributes, but by default the user will be able to resize it. To disable resizing, you can specify resize: none
in the CSS.
export default function NewPost() { return ( <label> Write your post: <textarea name="postContent" rows={4} cols={40} /> </label> ); }
Providing a label for a text area
Typically, you will place every <textarea>
inside a <label>
tag. This tells the browser that this label is associated with that text area. When the user clicks the label, the browser will focus the text area. It’s also essential for accessibility: a screen reader will announce the label caption when the user focuses the text area.
If you can’t nest <textarea>
into a <label>
, associate them by passing the same ID to <textarea id>
and <label htmlFor>
. To avoid conflicts between instances of one component, generate such an ID with useId
.
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} /> </> ); }
Providing an initial value for a text area
You can optionally specify the initial value for the text area. Pass it as the defaultValue
string.
export default function EditPost() { return ( <label> Edit your post: <textarea name="postContent" defaultValue="I really enjoyed biking yesterday!" rows={4} cols={40} /> </label> ); }
Reading the text area value when submitting a form
Add a <form>
around your textarea with a <button type="submit">
inside. It will call your <form onSubmit>
event handler. By default, the browser will send the form data to the current URL and refresh the page. You can override that behavior by calling e.preventDefault()
. Read the form data with new FormData(e.target)
.
export default function EditPost() { function handleSubmit(e) { // Prevent the browser from reloading the page e.preventDefault(); // Read the form data const form = e.target; const formData = new FormData(form); // You can pass formData as a fetch body directly: fetch('/some-api', { method: form.method, body: formData }); // Or you can work with it as a plain object: const formJson = Object.fromEntries(formData.entries()); console.log(formJson); } return ( <form method="post" onSubmit={handleSubmit}> <label> Post title: <input name="postTitle" defaultValue="Biking" /> </label> <label> Edit your post: <textarea name="postContent" defaultValue="I really enjoyed biking yesterday!" rows={4} cols={40} /> </label> <hr /> <button type="reset">Reset edits</button> <button type="submit">Save post</button> </form> ); }
Controlling a text area with a state variable
A text area like <textarea />
is uncontrolled. Even if you pass an initial value like <textarea defaultValue="Initial text" />
, your JSX only specifies the initial value, not the value right now.
To render a controlled text area, pass the value
prop to it. React will force the text area to always have the value
you passed. Typically, you will control a text area by declaring a state variable:
function NewPost() {
const [postContent, setPostContent] = useState(''); // Declare a state variable...
// ...
return (
<textarea
value={postContent} // ...force the input's value to match the state variable...
onChange={e => setPostContent(e.target.value)} // ... and update the state variable on any edits!
/>
);
}
This is useful if you want to re-render some part of the UI in response to every keystroke.
import { useState } from 'react'; import MarkdownPreview from './MarkdownPreview.js'; export default function MarkdownEditor() { const [postContent, setPostContent] = useState('_Hello,_ **Markdown**!'); return ( <> <label> Enter some markdown: <textarea value={postContent} onChange={e => setPostContent(e.target.value)} /> </label> <hr /> <MarkdownPreview markdown={postContent} /> </> ); }
Vianmääritys
My text area doesn’t update when I type into it
If you render a text area with value
but no onChange
, you will see an error in the console:
// 🔴 Bug: controlled text area with no onChange handler
<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
.As the error message suggests, if you only wanted to specify the initial value, pass defaultValue
instead:
// ✅ Good: uncontrolled text area with an initial value
<textarea defaultValue={something} />
If you want to control this text area with a state variable, specify an onChange
handler:
// ✅ Good: controlled text area with onChange
<textarea value={something} onChange={e => setSomething(e.target.value)} />
If the value is intentionally read-only, add a readOnly
prop to suppress the error:
// ✅ Good: readonly controlled text area without on change
<textarea value={something} readOnly={true} />
My text area caret jumps to the beginning on every keystroke
If you control a text area, you must update its state variable to the text area’s value from the DOM during onChange
.
You can’t update it to something other than e.target.value
:
function handleChange(e) {
// 🔴 Bug: updating an input to something other than e.target.value
setFirstName(e.target.value.toUpperCase());
}
You also can’t update it asynchronously:
function handleChange(e) {
// 🔴 Bug: updating an input asynchronously
setTimeout(() => {
setFirstName(e.target.value);
}, 100);
}
To fix your code, update it synchronously to e.target.value
:
function handleChange(e) {
// ✅ Updating a controlled input to e.target.value synchronously
setFirstName(e.target.value);
}
If this doesn’t fix the problem, it’s possible that the text area gets removed and re-added from the DOM on every keystroke. This can happen if you’re accidentally resetting state on every re-render. For example, this can happen if the text area or one of its parents always receives a different key
attribute, or if you nest component definitions (which is not allowed in React and causes the “inner” component to remount on every render).
I’m getting an error: “A component is changing an uncontrolled input to be controlled”
If you provide a value
to the component, it must remain a string throughout its lifetime.
You cannot pass value={undefined}
first and later pass value="some string"
because React won’t know whether you want the component to be uncontrolled or controlled. A controlled component should always receive a string value
, not null
or undefined
.
If your value
is coming from an API or a state variable, it might be initialized to null
or undefined
. In that case, either set it to an empty string (''
) initially, or pass value={someValue ?? ''}
to ensure value
is a string.