El componente TextInput en React Native es el elemento principal para la entrada de texto por parte del usuario, análogo al elemento input de HTML. TextInput admite estado controlado y no controlado, varios tipos de teclado, máscaras de entrada y manejo de eventos de foco. Según React Native Docs, 2024, TextInput es un componente clave para formularios, búsqueda, chats y cualquier escenario con entrada de usuario. El componente se adapta automáticamente a la plataforma, usando UITextField nativo en iOS y EditText en Android.
Puntos clave
TextInput es un componente de React Native que permite al usuario introducir texto mediante el teclado del dispositivo. Es el bloque de construcción principal para formularios de registro, barras de búsqueda, campos de mensajes y cualquier otro escenario que requiera entrada del usuario. A diferencia del desarrollo web, donde existen tipos de input separados (text, email, password, search), en React Native todas estas variantes se implementan mediante un único componente TextInput con diferentes props.
TextInput admite dos modos de operación: controlado(gestionado mediante el estado de React) y no controlado (mediante una ref). En el modo controlado, el valor del campo se almacena en el estado del componente y se actualiza mediante el callback onChangeText. Este enfoque se recomienda para la mayoría de las aplicaciones, ya que proporciona una única fuente de verdad y simplifica la validación.
Según React Native Handling Text Input, 2024, TextInput se adapta automáticamente a la plataforma: en iOS usa UITextField nativo, en Android — EditText. Esto garantiza el correcto funcionamiento del autocompletado, la autocorrección y los menús del sistema (cortar/copiar/pegar) sin configuración adicional.
TextInput proporciona un amplio conjunto de props para controlar la entrada, la apariencia y el comportamiento. Todos los props se dividen en varias categorías: gestión del valor, tipo de teclado, estilo, eventos y características específicas de la plataforma.
value — el valor actual del campo (para modo controlado). onChangeText — callback invocado en cada cambio de texto. placeholder — texto de sugerencia mostrado cuando el campo está vacío. defaultValue — valor inicial para modo no controlado. maxLength limita el número máximo de caracteres que el usuario puede introducir.
El componente admite onFocus(el campo recibió el foco), onBlur (el campo perdió el foco), onSubmitEditing (el usuario presionó Enter/Return), onKeyPress (presión de tecla). El evento onEndEditing se llama después de finalizar la edición al perder el foco. Estos callbacks permiten implementar lógica compleja de validación y envío de formularios.
En iOS: clearButtonMode (botón de limpieza), keyboardAppearance (teclado claro/oscuro), returnKeyType (tipo de botón Return), enablesReturnKeyAutomatically. En Android: textContentType (autocompletado), underlineColorAndroid, inlineImageLeft. secureTextEntry funciona en ambas plataformas para entrada de contraseñas.
En React Native, TextInput puede funcionar en dos modos. En modo controlado, React gestiona el valor del campo: pasas el valor desde el estado y lo actualizas mediante onChangeText. En modo no controlado, React solo inicializa el campo y el valor similar a DOM se almacena dentro del componente nativo.
El modo controlado se recomienda para todos los formularios que requieran validación, filtrado o formateo de datos de entrada. El estado del campo está sincronizado con el estado del componente React, lo que proporciona control total sobre el valor.
const LoginForm = () => {
const [email, setEmail] = useState('');
const [password, setPassword] = useState('');
return (
<View>
<TextInput
placeholder="Email"
value={email}
onChangeText={setEmail}
keyboardType="email-address"
autoCapitalize="none"
/>
<TextInput
placeholder="Password"
value={password}
onChangeText={setPassword}
secureTextEntry
maxLength={32}
/>
</View>
);
};
En este ejemplo, ambos campos usan el modo controlado. El campo de email tiene el tipo de teclado email-address y la autocapitalización desactivada. El campo de contraseña usa secureTextEntry para ocultar los caracteres y está limitado a 32 caracteres mediante maxLength.
El modo no controlado es adecuado para campos simples que no requieren validación o reacción inmediata a la entrada. El valor del campo se obtiene mediante una ref en el momento del envío del formulario.
const SimpleSearch = () => {
const inputRef = useRef(null);
const handleSearch = () => {
console.log(inputRef.current.value());
};
return (
<TextInput
ref={inputRef}
placeholder="Search..."
onSubmitEditing={handleSearch}
/>
);
};
En modo no controlado, el componente se renderiza más rápido ya que no requiere sincronización de estado en cada cambio de texto. Sin embargo, pierdes la capacidad de filtrar, formatear o validar la entrada en tiempo real.
TextInput admite varios tipos de teclado que adaptan la disposición al formato de entrada esperado. Elegir el tipo de teclado correcto mejora la experiencia del usuario y reduce errores de entrada en dispositivos móviles.
| Valor keyboardType | Descripción | Cuándo usarlo |
|---|---|---|
| default | Teclado alfabético estándar | Nombre, apellido, dirección |
| numeric | Teclado numérico (solo dígitos) | Edad, cantidad, código PIN |
| email-address | Teclado con @ y .com | Campo de email en formulario de registro |
| phone-pad | Teclado telefónico con + y # | Número de teléfono |
| url | Teclado con / y .com | Introducir dirección web |
| decimal-pad | Teclado numérico con punto decimal | Precio, peso, tamaño |
En iOS hay tipos adicionales: numbers-and-punctuation, twitter, web-search (con búsqueda por voz). En Android también está disponible visible-password (muestra la contraseña). Elegir el keyboardType correcto es un aspecto importante del UX de una aplicación móvil.
Las características de plataforma también incluyen autoCapitalize(capitalización automática de la primera palabra), autoCorrect (autocorrección), spellCheck (revisión ortográfica), textContentType (autocompletado en iOS). Estos props funcionan de manera diferente en cada plataforma y requieren pruebas.
Consideremos dos escenarios reales: un campo multilínea para entrada de mensajes y un campo con máscara para número de teléfono. Ambos usan TextInput con diferentes props para lograr el comportamiento deseado.
Para introducir texto largo (comentarios, descripciones), TextInput cambia al modo multilínea mediante la prop multiline. En este modo, el campo crece verticalmente y admite saltos de línea.
const MessageInput = ({ onSend }) => {
const [text, setText] = useState('');
return (
<TextInput
style={styles.input}
multiline
numberOfLines={4}
placeholder="Write a message..."
value={text}
onChangeText={setText}
textAlignVertical="top"
/>
);
};
La prop multiline activa el modo multilínea, numberOfLines establece la altura inicial en líneas. textAlignVertical: 'top' alinea el texto en la parte superior (por defecto, en Android TextInput multilínea centra el texto verticalmente).
Para introducir un número de teléfono, a menudo se requiere formato en tiempo real. Combinando onChangeText con expresiones regulares, puedes implementar una máscara de entrada.
const PhoneInput = () => {
const [phone, setPhone] = useState('');
const formatPhone = (text) => {
const cleaned = text.replace(/\D/g, '');
if (cleaned.length <= 11) {
return cleaned.replace(
/(\d{1})(\d{3})(\d{3})(\d{2})(\d{2})/,
'+$1 ($2) $3 $4 $5'
);
}
return cleaned;
};
return (
<TextInput
keyboardType="phone-pad"
value={phone}
onChangeText={(t) => setPhone(formatPhone(t))}
placeholder="+7 (999) 123 45 67"
maxLength={20}
/>
);
};
La función formatPhone elimina todos los caracteres no numéricos y formatea el número en un formato internacional estándar. keyboardType: 'phone-pad' muestra el teclado telefónico. Este enfoque mejora la UX para la introducción de números de teléfono y previene errores de formato.
Preguntas frecuentes
value se usa en modo controlado — React gestiona el texto mostrado a través del estado. defaultValue se usa en modo no controlado — establece el valor inicial y los cambios posteriores se almacenan dentro del componente.
Establece la prop secureTextEntry en true. TextInput ocultará los caracteres introducidos, reemplazándolos con puntos o asteriscos. Para mayor seguridad, puedes combinarlo con maxLength y autoCapitalize: 'none'.
onChangeText se llama en cada cambio de texto, incluyendo la inserción y eliminación de un solo carácter. Este es el comportamiento normal de un componente controlado. Para optimizar, puedes usar debounce o actualizar el estado en onEndEditing.
TextInput no admite elementos anidados directamente. La solución es crear un contenedor View con Flexbox, dentro del cual colocas un icono y TextInput. El estilo del contenedor imita el borde del campo de entrada, y TextInput se estira para llenar el espacio restante.
En Android, TextInput por defecto tiene un borde inferior (Material Design). Desactívalo con underlineColorAndroid: 'transparent'. Esta prop solo funciona en Android y elimina la línea visual debajo del texto.
Resumen
Desarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.
Lea también