<textarea>
Referencia
<textarea>
Para mostrar un text area, renderiza el componente .
Props
<textarea>
soporta todas
Puedes pasando la prop value
:
value
: Un string. Controla el texto dentro del text area.
Cuando pasas value
, también debes pasar un controlador onChange
que actualice el valor proporcionado.
En cambio, si tu <textarea>
no es controlado, puedes pasar la prop defaultValue
:
defaultValue
: Un string. Especifica para un text area.
Estas props de <textarea>
son relevantes tanto para text areas controlados como no controlados:
- : Puede ser
'on'
u'off'
. Especifica el comportamiento de autocompletar. - : Un booleano. Si es
true
, React enfocará el elemento en el montaje. children
:<textarea>
no acepta hijos. Para establecer el valor inicial, utilizadefaultValue
.- : Un número. Especifica el ancho por defecto en anchos promedio de caracteres. Por defecto es
20
. - : Un booleano. Si es
true
, el input no será interactivo y aparecerá atenuado. - : Un string. Especifica el
id
del<form>
al que este input pertenece. Si es omitido, es el formulario padre más cercano. - : Un número. Especifica la longitud máxima del texto.
- : Un número. Especifica la longitud mínima del texto.
- : Un string. Especifica el nombre para este input que es .
onChange
: Una función . Requerida para . Es ejecutada inmediatamente cuando el valor del input es modificado por el usuario (por ejemplo, es ejecutada con cada pulsación de tecla). Se comporta como el del navegador.onChangeCapture
: Una versión deonChange
que es ejecutada en la .- : Una función . Es ejecutada inmediatamente cuando el valor es cambiado por el usuario. Por razones históricas, en React es idiomático usar
onChange
en su lugar, el cual funciona de manera similar. onInputCapture
: Una versión deonInput
que es ejecutada en la .- : Una función . Es ejecutada si la validación de un input fracasa al enviar el formulario. A diferencia del evento
invalid
que viene integrado, el eventoonInvalid
de React se propaga. onInvalidCapture
: Una versión deonInvalid
que es ejecutado en la .- : Una función . Es ejecutada después de que la selección dentro de
<textarea>
cambia. React extiende el eventoonSelect
para que también sea ejecutado para selecciones vacías y en ediciones (las cuales puede afectar la selección). onSelectCapture
: Una versión deonSelect
que es ejecutada en la .- : Un string. Mostrado en un color atenuado cuando el valor del text area está vacío.
- : Un booleano. Si es
true
, el text area no puede ser editado por el usuario. - : Un booleano. Si es
true
, el valor debe ser proporcionado para que el formulario sea enviado. - : Un número. Especifica la altura por defecto en promedio de altura de carácter. El valor por defecto es
2
. - : Puede ser
'hard'
,'soft'
, u'off'
. Especifica cómo debe envolverse el texto al enviar un formulario.
Advertencias
- No es permitido pasar un hijo como
<textarea>algo</textarea>
. - Si un text area recibe una prop
value
string, este será - Un text area no puede ser controlado y no controlado a la vez.
- Un text area no puede alternar entre ser controlado o no controlado a lo largo de su vida.
- Todo text area controlado necesita un controlador de evento
onChange
que actualice su valor de manera síncrona.
Uso
Mostrar un text area
Renderiza <textarea>
para mostrar un text area. Puedes especificar su tamaño por defecto con los atributos y , pero por defecto el usuario será capaz de modificar su tamaño. Para deshabilitar la modificación de tamaño, puedes especificar resize: none
en el CSS.
Proporcionar un label para un text area
Típicamente, colocarás todos los <textarea>
dentro de una etiqueta . Esto le indica al navegador que este label está asociado con ese text area. Cuando el usuario haga click en el label, el navegador enfocará el text area. Esto también es esencial para accesibilidad: un lector de pantallas anunciará el texto del label cuando el usuario enfoque el text area.
Si no puedes anidar el <textarea>
dentro de un <label>
, asócialos pasando el mismo identificador a <textarea id>
y Para evitar conflictos entre instancias de un componente, genera un identificador con
Proporcionar un valor inicial para un text area
Opcionalmente puedes especificar el valor inicial de un text area. Pásalo a través de la prop defaultValue
.
Leer el valor de text area al enviar un formulario
Agrega un alrededor de tu text area con un dentro. Este llamará a tu controlador de evento <form onSubmit>
. Por defecto, el navegador enviará los datos del formulario a el URL actual y actualizará la página. Puedes sobrescribir ese comportamiento llamando e.preventDefault()
. Para leer los datos del formulario, usa .
Controlar un text area con una variable de estado
Un text area como <textarea />
es no controlado. Incluso si como <textarea defaultValue="Texto inicial" />
, tu JSX solo especifica el valor inicial, no el valor actual.
Para renderizar un text area controlado, pásale la prop value
. React forzará al text area a siempre tener value
que pasaste. Normalmente, controlarás un text area declarando una
Esto es útil si quieres re-renderizar alguna parte de la IU cada vez que una tecla sea pulsada.
Solución de problemas
Mi text area no se actualiza cuando escribo en él
Si renderizas un text area con value
pero sin onChange
, verás un error en la consola:
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
.value
a un campo de formulario sin un controlador onChange
. Esto renderiza un campo de solo lectura. Si el campo debe ser mutable usa defaultValue
. En caso contrario, establece onChange
o readOnly
.Como sugiere el mensaje de error, si solo quisiste solo debes pasar defaultValue
:
Si quieres especifica un controlador onChange
:
Si el valor es de sólo lectura intencionalmente, agrega la prop readOnly
para evitar el error:
El caret de mi text area salta al inicio con cada pulsación de tecla
Si debes actualizar su variable de estado al valor del text area del DOM durante onChange
.
No puedes actualizarlo a algo más que no sea e.target.value
:
Tampoco puedes actualizarlo de manera asíncrona:
Para arreglar tu código, actualízalo de manera síncrona a e.target.value
:
Si esto no arregla el problema, es posible que el text area esté siendo removido y agregado nuevamente al DOM con cada pulsación de tecla. Esto puede suceder si estás accidentalmente en cada re-renderización. Por ejemplo, esto puede suceder si el text area o uno de sus padres siempre recibe un atributo key
diferente, o si anidas definiciones de componentes (lo cual no está permitido en React y causa que el componente de “adentro” sea re-montado en cada renderización).
Estoy obteniendo un error: “A component is changing an uncontrolled input to be controlled”
Si proporcionas un value
al componente, este valor debe mantenerse como string durante todo su tiempo de vida.
No puedes pasar value={undefined}
primero y después pasar value="un string"
porque React no sabrá si quieres que el componente sea controlado o no controlado. Un componente controlado siempre debe recibir un value
string, no null
o undefined
.
Si tu value
viene de una API o una variable de estado, esta podría ser inicializada como null
o undefined
. En ese caso, asígnala a un string vacío (''
) inicialmente, o pasa value={someValue ?? ''}
para asegurar que value
es un string.