<textarea>
Встроенный браузерный <textarea> компонент позволяет отображать многострочный текстовый ввод.
<textarea />
Ссылка
<textarea>
Для отображения текстовой области используйте встроенный браузерный <textarea> компонент.
<textarea name="postContent" /> См. дополнительные примеры ниже.
Свойства
<textarea> поддерживает все общие свойства элементов.
Вы можете сделать текстовую область управляемой, передав value свойство:
-
value: Строка. Управляет текстом внутри текстовой области.
При передаче value, вы также должны передать обработчик onChange, который обновляет переданное значение.
Если ваша <textarea> не управляемая, вы можете передать defaultValue свойство вместо этого:
-
defaultValue: Строка. Указывает начальное значение для текстовой области.
Эти <textarea> свойства актуальны как для управляемых, так и для неуправляемых текстовых областей:
-
autoComplete: Либо'on'или'off'. Определяет поведение автозаполнения. -
autoFocus: Булево значение. Еслиtrue, React сфокусирует элемент при монтировании. -
children:<textarea>не принимает дочерние элементы. Для задания начального значения используйтеdefaultValue. -
cols: Число. Определяет ширину по умолчанию в среднем количестве символов. По умолчанию20. -
disabled: Булево значение. Еслиtrue, элемент ввода будет неактивным и отображаться затемнённым. -
form: Строка. Указываетidформы, к которой относится данный элемент ввода. Если опущено, используется ближайшая родительская форма. -
maxLength: Число. Указывает максимальную длину текста. -
minLength: Число. Указывает минимальную длину текста. -
name: Строка. Указывает имя для этого элемента ввода, которое отправляется с формой. -
onChange: Функция-обработчикEvent. Требуется для управляемых текстовых областей. Срабатывает немедленно при изменении пользователем значения ввода (например, при каждом нажатии клавиши). Ведёт себя как браузерное событиеinput. -
onChangeCapture: ВерсияonChange, которая срабатывает в фазе захвата. -
onInput: Функция-обработчикEvent. Срабатывает немедленно при изменении пользователем значения. По историческим причинам в React принято использоватьonChange, которое работает аналогично. -
onInputCapture: ВерсияonInput, которая срабатывает в фазе захвата. -
onInvalid: Функция-обработчикEvent. Срабатывает, если ввод не проходит валидацию при отправке формы. В отличие от встроенного событияinvalid, событие ReactonInvalidвсплывает. -
onInvalidCapture: ВерсияonInvalid, которая срабатывает в фазе захвата. -
onSelect: Функция-обработчикEvent. Срабатывает после изменения выделения внутри<textarea>. React расширяет событиеonSelectдля того, чтобы оно также срабатывало при пустом выделении и при редактировании (что может повлиять на выделение). -
onSelectCapture: ВерсияonSelect, которая срабатывает в фазе захвата. -
placeholder: Строка. Отображается в затемнённом цвете, когда значение текстовой области пустое. -
readOnly: Булево значение. Еслиtrue, текстовая область не может быть отредактирована пользователем. -
required: Булево значение. Еслиtrue, значение должно быть предоставлено для отправки формы. -
rows: Число. Определяет высоту по умолчанию в среднем количестве символов. По умолчанию2. -
wrap: Либо'hard','soft', или'off'. Указывает, как должен быть переведён текст при отправке формы.
Ограничения
- Передача дочерних элементов, таких как
<textarea>something</textarea>, запрещена. ИспользуйтеdefaultValueдля начального содержимого. - Если текстовая область получает строковое
valueсвойство, она будет обработана как управляемая. - Текстовая область не может быть одновременно управляемой и неуправляемой.
- Текстовая область не может переключаться между управляемым и неуправляемым состоянием в течение своего жизненного цикла.
- Каждая управляемая текстовая область требует обработчик события
onChange, который синхронно обновляет значение.
Использование
Отображение текстовой области
Отобразите <textarea> для отображения текстовой области. Вы можете указать её размеры по умолчанию с помощью rows и cols атрибутов, но по умолчанию пользователь сможет изменять её размер. Для отключения изменения размера можно задать resize: none в CSS.
export default function NewPost() { return ( <label> Write your post: <textarea name="postContent" rows={4} cols={40} /> </label> ); }
Добавление метки к текстовой области
Обычно вы помещаете каждую <textarea> внутри тега <label>. Это сообщает браузеру, что данная метка связана с этой текстовой областью. Когда пользователь щелкает по метке, браузер фокусирует текстовую область. Это также важно для доступности: экранный диктор объявит текст метки, когда пользователь сфокусируется на текстовой области.
Если вы не можете вложить <textarea> в <label>, свяжите их, передав одинаковый идентификатор <textarea id> и <label htmlFor>. Чтобы избежать конфликтов между экземплярами одного компонента, генерируйте такой идентификатор с помощью 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} /> </> ); }
Указание начального значения для текстовой области
Вы можете необязательно указать начальное значение для текстовой области. Передайте его как строку defaultValue.
export default function EditPost() { return ( <label> Edit your post: <textarea name="postContent" defaultValue="I really enjoyed biking yesterday!" rows={4} cols={40} /> </label> ); }
Опасность
В отличие от HTML, начальный текст, такой как <textarea>Some content</textarea>, не поддерживается.
Чтение значения текстовой области при отправке формы
Добавьте <form> вокруг вашей текстовой области с <button type="submit"> внутри. Это вызовет ваш <form onSubmit> обработчик событий. По умолчанию браузер отправит данные формы на текущий URL и обновит страницу. Вы можете изменить это поведение, вызвав e.preventDefault(). Прочтите данные формы с помощью 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> ); }
Примечание
Присвойте name вашей <textarea>, например <textarea name="postContent" />. name значение, которое вы указали, будет использоваться в качестве ключа в данных формы, например { postContent: "Your post" }.
Возможная ошибка
По умолчанию любой <button> внутри <form> будет отправлять её. Это может быть неожиданно! Если у вас есть собственный пользовательский Button компонент React, рассмотрите возможность возвращения <button type="button"> вместо <button>. Затем, для ясности, используйте <button type="submit"> для кнопок, которые должны отправлять форму.
Управление текстовой областью с переменной состояния
Текстовая область, такая как <textarea />, является неуправляемой. Даже если вы передаете начальное значение, например <textarea defaultValue="Initial text" />, ваш JSX только задаёт начальное значение, а не текущее.
Чтобы отобразить управляемую текстовую область, передайте value свойство ей. React заставит текстовую область всегда иметь value значение, которое вы передали. Обычно вы управляете текстовой областью, объявив переменную состояния:
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!
/>
);
} Это полезно, если вы хотите перерисовать часть пользовательского интерфейса в ответ на каждый ввод с клавиатуры.
{ "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": {} }
Возможная ошибка
Если вы передадите value без onChange, ввести текст в текстовую область не получится. Когда вы управляете текстовой областью, передавая ей какое-то value значение, вы обязательно указываете ей это значение. Поэтому, если вы передаёте переменную состояния как value значение, но забываете обновить эту переменную состояния синхронно в обработчике события onChange, React вернёт текстовую область к value значению, которое вы указали, после каждого ввода с клавиатуры.
Отладка
Моя текстовая область не обновляется при вводе
Если вы отображаете текстовую область с value, но без onChange, вы увидите ошибку в консоли:
// 🔴 Bug: controlled text area with no onChange handler
<textarea value={something} />
value полю формы без обработчика onChange. Это отобразит поле только для чтения. Если поле должно быть изменяемым, используйте defaultValue. В противном случае установите onChange или readOnly. Как подсказывает сообщение об ошибке, если вы хотели только указать начальное значение, передайте defaultValue вместо этого:
// ✅ Good: uncontrolled text area with an initial value
<textarea defaultValue={something} /> Если вы хотите управлять этой текстовой областью с помощью переменной состояния, укажите обработчик onChange:
// ✅ Good: controlled text area with onChange
<textarea value={something} onChange={e => setSomething(e.target.value)} /> Если значение предназначается для только чтения, добавьте свойство readOnly для подавления ошибки:
// ✅ Good: readonly controlled text area without on change
<textarea value={something} readOnly={true} /> Курсор моей текстовой области перескакивает в начало при каждом вводе с клавиатуры
Если вы управляете текстовой областью, вы должны обновить её переменную состояния до значения текстовой области из DOM во время onChange.
Вы не можете обновить её на что-то отличное от e.target.value:
function handleChange(e) {
// 🔴 Bug: updating an input to something other than e.target.value
setFirstName(e.target.value.toUpperCase());
} Вы также не можете обновить её асинхронно:
function handleChange(e) {
// 🔴 Bug: updating an input asynchronously
setTimeout(() => {
setFirstName(e.target.value);
}, 100);
} Чтобы исправить код, обновите его синхронно до e.target.value:
function handleChange(e) {
// ✅ Updating a controlled input to e.target.value synchronously
setFirstName(e.target.value);
} Если это не решит проблему, возможно, текстовая область удаляется и добавляется снова из DOM при каждом вводе с клавиатуры. Это может произойти, если вы случайно сбрасываете состояние при каждом перерендеринге. Например, это может произойти, если текстовая область или один из её родителей всегда получают другое key свойство или если вы вложены определения компонентов (что запрещено в React и приводит к повторному монтированию «внутреннего» компонента при каждом рендере).
Ошибка: «Компонент изменяет неуправляемый ввод на управляемый»
Если вы предоставляете value компоненту, оно должно оставаться строкой на протяжении всего его существования.
Вы не можете сначала передать value={undefined} и позже передать value="some string", потому что React не будет знать, хотите ли вы, чтобы компонент был неуправляемым или управляемым. Управляемый компонент всегда должен получать строку value, а не null или undefined.
Если ваше value значение поступает из API или переменной состояния, оно может быть первоначально null или undefined. В этом случае либо установите его в пустую строку ('') изначально, либо передайте value={someValue ?? ''}, чтобы убедиться, что value является строкой.
© 2013–present Facebook Inc.
Licensed under the Creative Commons Attribution 4.0 International Public License.
https://react.dev/reference/react-dom/components/textarea