24. Componentes nativos de React Native
Tutorial: Componentes Nativos de React Native - Text, Image, TextInput
📱 Introducción
En este tutorial aprenderemos a utilizar tres componentes fundamentales de React Native: Text, Image y TextInput. Estos componentes son los bloques básicos para construir interfaces de usuario en aplicaciones móviles.
🎯 Objetivo del Tutorial
Crearemos una pantalla de perfil que incluya:
Un título con estilos personalizados
Una imagen de perfil (local y remota)
Un campo de entrada de texto
🏗️ Paso 1: Configuración Inicial
Estructura de archivos:
text
src/
├── screens/
│ └── Profile.tsx
└── App.tsx
Profile.tsx - Versión inicial:
tsx
import React from 'react';
import { View, StyleSheet } from 'react-native';
export const Profile = () => {
return (
<View style={style.mainContainer}>
{/* Aquí agregaremos nuestros componentes */}
</View>
);
};
const style = StyleSheet.create({
mainContainer: {
flex: 1,
backgroundColor: 'white',
},
});
App.tsx:
tsx
import React from 'react';
import { Profile } from './src/screens/Profile';
const App = () => {
return <Profile />;
};
export default App;
✨ Paso 2: Componente Text
El componente Text se utiliza para mostrar texto en la pantalla.
Profile.tsx con Text:
tsx
import React from 'react';
import {
View,
Text,
StyleSheet,
TextStyle,
ViewStyle
} from 'react-native';
export const Profile = () => {
return (
<View style={style.mainContainer}>
<Text style={style.title}>Perfil</Text>
</View>
);
};
const style = StyleSheet.create({
mainContainer: {
flex: 1,
backgroundColor: 'white',
alignItems: 'center', // Centra horizontalmente
paddingHorizontal: 16, // Espacio izquierda/derecha
paddingVertical: 18, // Espacio arriba/abajo
} as ViewStyle,
title: {
fontSize: 28, // Tamaño de fuente
textTransform: 'uppercase', // Convierte a mayúsculas
} as TextStyle,
});
Propiedades importantes de Text:
style: Estilos CSS-like
numberOfLines: Limita líneas de texto
ellipsizeMode: Cómo mostrar "..." si el texto es muy largo
onPress: Función al presionar el texto
🖼️ Paso 3: Componente Image
El componente Image muestra imágenes locales o remotas.
Profile.tsx con Image:
tsx
import React from 'react';
import {
View,
Text,
Image,
StyleSheet,
TextStyle,
ViewStyle,
ImageStyle
} from 'react-native';
export const Profile = () => {
return (
<View style={style.mainContainer}>
<Text style={style.title}>Perfil</Text>
{/* Imagen desde URL */}
<Image
source={{
uri: 'https://www.pngfind.com/pngs/m/610-6104451_image-placeholder-png-user-profile-placeholder-image-png.png'
}}
style={style.image}
/>
</View>
);
};
const style = StyleSheet.create({
mainContainer: {
flex: 1,
backgroundColor: 'white',
alignItems: 'center',
paddingHorizontal: 16,
paddingVertical: 18,
} as ViewStyle,
title: {
fontSize: 28,
textTransform: 'uppercase',
} as TextStyle,
image: {
width: 100,
height: 100,
borderRadius: 50, // Hace la imagen circular
marginTop: 20, // Espacio arriba de la imagen
} as ImageStyle,
});
Cargar imágenes de diferentes fuentes:
1. Imagen desde URL:
tsx
<Image
source={{
uri: 'https://ejemplo.com/imagen.jpg'
}}
style={style.image}
/>
2. Imagen local (desde assets):
tsx
<Image
source={require('./assets/perfil.jpg')}
style={style.image}
/>
3. Imagen desde módulo:
tsx
<Image
source={require('@assets/perfil.png')}
style={style.image}
/>
Propiedades importantes de Image:
source: Fuente de la imagen (requiere uri o require())
style: Dimensiones y estilos
resizeMode: Cómo redimensionar ('cover', 'contain', 'stretch', 'repeat', 'center')
onLoad: Función cuando la imagen carga
onError: Función si hay error cargando
📝 Paso 4: Componente TextInput
El componente TextInput permite la entrada de texto del usuario.
Profile.tsx completo:
tsx
import React, { useState } from 'react';
import {
View,
Text,
Image,
TextInput,
StyleSheet,
TextStyle,
ViewStyle,
ImageStyle
} from 'react-native';
export const Profile = () => {
const [name, setName] = useState('');
return (
<View style={style.mainContainer}>
<Text style={style.title}>Perfil</Text>
<Image
source={{
uri: 'https://www.pngfind.com/pngs/m/610-6104451_image-placeholder-png-user-profile-placeholder-image-png.png'
}}
style={style.image}
/>
<TextInput
style={style.textInput}
placeholder="Ingresa tu nombre"
value={name}
onChangeText={setName}
/>
{name ? (
<Text style={style.greeting}>¡Hola, {name}!</Text>
) : null}
</View>
);
};
const style = StyleSheet.create({
mainContainer: {
flex: 1,
backgroundColor: 'white',
alignItems: 'center',
paddingHorizontal: 16,
paddingVertical: 18,
} as ViewStyle,
title: {
fontSize: 28,
textTransform: 'uppercase',
marginBottom: 20,
} as TextStyle,
image: {
width: 100,
height: 100,
borderRadius: 50,
marginBottom: 30,
} as ImageStyle,
textInput: {
width: '100%',
height: 50,
borderWidth: 1,
borderColor: '#ccc',
borderRadius: 8,
paddingHorizontal: 12,
fontSize: 16,
marginBottom: 20,
} as TextStyle,
greeting: {
fontSize: 18,
color: '#333',
marginTop: 10,
} as TextStyle,
});
Propiedades importantes de TextInput:
value: Valor actual del campo
onChangeText: Función que se ejecuta al cambiar el texto
placeholder: Texto de ejemplo cuando está vacío
secureTextEntry: Oculta texto (para contraseñas)
keyboardType: Tipo de teclado ('default', 'numeric', 'email-address', etc.)
autoCapitalize: Capitalización automática ('none', 'sentences', 'words', 'characters')
multiline: Permite múltiples líneas
editable: Si se puede editar o es solo lectura
🎨 Mejoras de Estilo
1. Mejorando el TextInput:
tsx
<TextInput
style={style.textInput}
placeholder="Ingresa tu nombre"
placeholderTextColor="#999"
value={name}
onChangeText={setName}
autoCorrect={false}
autoCapitalize="words"
/>
2. Agregando más campos:
tsx
const [email, setEmail] = useState('');
const [bio, setBio] = useState('');
// En el return:
<TextInput
style={style.textInput}
placeholder="Correo electrónico"
value={email}
onChangeText={setEmail}
keyboardType="email-address"
autoCapitalize="none"
/>
<TextInput
style={[style.textInput, style.multilineInput]}
placeholder="Biografía"
value={bio}
onChangeText={setBio}
multiline={true}
numberOfLines={4}
/>
3. Estilos adicionales:
tsx
const style = StyleSheet.create({
multilineInput: {
height: 100,
textAlignVertical: 'top', // Importante para Android
},
label: {
alignSelf: 'flex-start',
fontSize: 16,
fontWeight: '600',
marginBottom: 8,
color: '#333',
},
});
⚡ Consejos y Buenas Prácticas
1. Para Text:
Usa Text dentro de Text para estilos diferentes en una misma línea
Utiliza numberOfLines y ellipsizeMode para textos largos
Considera la accesibilidad con accessible y accessibilityLabel
2. Para Image:
Siempre especifica width y height
Para imágenes remotas, maneja estados de carga y error
Usa resizeMode="contain" para mantener proporciones
Considera usar FastImage para mejor rendimiento con muchas imágenes
3. Para TextInput:
Maneja el estado con useState
Usa onSubmitEditing para acciones al presionar "enter"
Considera blurOnSubmit para comportamiento en formularios
Para formularios complejos, considera librerías como Formik o React Hook Form
🎓 Resumen
Características clave aprendidas:
Text: Estilos tipográficos, transformaciones de texto
Image: Carga desde URL y local, redimensionamiento
TextInput: Manejo de estado, tipos de teclado, placeholders
Estilos: Alineación, espaciado, bordes redondeados
📚 Próximos Pasos
Ahora que dominas los componentes básicos, puedes:
Crear formularios completos con validación
Implementar galerías de imágenes
Crear interfaces de chat con TextInput
Practicar combinando estos componentes con ScrollView y FlatList
¡Sigue practicando y experimentando con diferentes propiedades y estilos!
Comentarios
Publicar un comentario