18. Creación del primer componentes básico
Tutorial: Creación del Primer Componente Básico en React Native
En este tutorial aprenderás a crear tu primer componente personalizado en React Native, entender su estructura básica y cómo utilizarlo en tu aplicación.
🎯 Objetivo del Tutorial
Crear un componente básico en React Native, entender su estructura y aprender a reutilizarlo.
📁 Paso 1: Entender la Estructura Actual de la App
Archivo principal: App.tsx
tsx
import React from 'react';
import {SafeAreaView, StatusBar, useColorScheme} from 'react-native';
function App(): JSX.Element {
const isDarkMode = useColorScheme() === 'dark';
return (
<SafeAreaView>
<StatusBar barStyle={isDarkMode ? 'light-content' : 'dark-content'} />
{/* Contenido de la app */}
</SafeAreaView>
);
}
export default App;
Componentes clave:
SafeAreaView: Garantiza que el contenido no se superponga con áreas no seguras (notch, status bar)
StatusBar: Controla la barra de estado (hora, batería, señal)
useColorScheme(): Hook que detecta el tema del sistema (oscuro/claro)
🛠️ Paso 2: Crear la Estructura de Carpetas
Organización recomendada:
bash
# Navegar a la raíz del proyecto
cd MiPrimeraApp
# Crear estructura de carpetas
mkdir -p src/components
# Opcional: crear carpeta específica para el componente
mkdir -p src/components/MiPrimerComponente
Estructura final:
text
MiPrimeraApp/
├── src/
│ └── components/
│ └── MiPrimerComponente/
│ └── MiPrimerComponente.tsx
├── App.tsx
└── index.js
💻 Paso 3: Crear el Primer Componente
Crear archivo del componente:
bash
# Crear archivo del componente
touch src/components/MiPrimerComponente/MiPrimerComponente.tsx
Contenido del componente:
tsx
// src/components/MiPrimerComponente/MiPrimerComponente.tsx
import React from 'react';
import {View} from 'react-native';
function MiPrimerComponente(): JSX.Element {
return (
<View />
);
}
export default MiPrimerComponente;
Explicación del código:
import React from 'react'; - Importa React para usar JSX
import {View} from 'react-native'; - Importa el componente View
function MiPrimerComponente(): JSX.Element - Declara el componente
return (<View />); - Retorna el componente View
export default MiPrimerComponente; - Exporta el componente
🔧 Paso 4: Reglas y Buenas Prácticas
1. Nomenclatura de componentes:
tsx
// ✅ CORRECTO - Primera letra mayúscula
function MiComponente() {}
// ❌ INCORRECTO - Primera letra minúscula
function micomponente() {} // No se reconocerá como componente
2. Tipado TypeScript:
tsx
// Especificar que retorna JSX.Element
function MiComponente(): JSX.Element {
return <View />;
}
// O usando React.FC (Function Component)
const MiComponente: React.FC = () => {
return <View />;
};
3. Exportación:
tsx
// Exportación por defecto (recomendado para componentes)
export default MiComponente;
// Exportación nombrada (para múltiples exports)
export { MiComponente };
📱 Paso 5: Usar el Componente en App.tsx
Modificar App.tsx:
tsx
// App.tsx
import React from 'react';
import {SafeAreaView, StatusBar, useColorScheme} from 'react-native';
import MiPrimerComponente from './src/components/MiPrimerComponente/MiPrimerComponente';
function App(): JSX.Element {
const isDarkMode = useColorScheme() === 'dark';
return (
<SafeAreaView>
<StatusBar barStyle={isDarkMode ? 'light-content' : 'dark-content'} />
<MiPrimerComponente />
</SafeAreaView>
);
}
export default App;
Explicación del import:
tsx
// Ruta relativa desde App.tsx
import MiPrimerComponente from './src/components/MiPrimerComponente/MiPrimerComponente';
// Si el componente está en la misma carpeta
import MiPrimerComponente from './MiPrimerComponente';
🎨 Paso 6: Agregar Estilos al Componente
Agregar estilos inline:
tsx
// MiPrimerComponente.tsx con estilos básicos
import React from 'react';
import {View} from 'react-native';
function MiPrimerComponente(): JSX.Element {
return (
<View
style={{
width: 50,
height: 50,
backgroundColor: 'red',
}}
/>
);
}
export default MiPrimerComponente;
Mejor práctica: Usar StyleSheet:
tsx
import React from 'react';
import {View, StyleSheet} from 'react-native';
function MiPrimerComponente(): JSX.Element {
return <View style={styles.container} />;
}
const styles = StyleSheet.create({
container: {
width: 50,
height: 50,
backgroundColor: 'red',
},
});
export default MiPrimerComponente;
🔄 Paso 7: Reutilizar el Componente
Usar múltiples instancias:
tsx
// App.tsx con múltiples componentes
import React from 'react';
import {SafeAreaView, StatusBar, useColorScheme, View} from 'react-native';
import MiPrimerComponente from './src/components/MiPrimerComponente/MiPrimerComponente';
function App(): JSX.Element {
const isDarkMode = useColorScheme() === 'dark';
return (
<SafeAreaView style={{flex: 1, justifyContent: 'center', alignItems: 'center'}}>
<StatusBar barStyle={isDarkMode ? 'light-content' : 'dark-content'} />
<MiPrimerComponente />
<MiPrimerComponente />
<MiPrimerComponente />
<MiPrimerComponente />
<MiPrimerComponente />
</SafeAreaView>
);
}
export default App;
Agregar margen entre componentes:
tsx
// Mejorar MiPrimerComponente.tsx
const styles = StyleSheet.create({
container: {
width: 50,
height: 50,
backgroundColor: 'red',
margin: 10, // Agrega espacio entre componentes
},
});
🎯 Paso 8: Componente Mejorado con Props
Crear componente con propiedades:
tsx
// src/components/MiPrimerComponente/MiPrimerComponente.tsx
import React from 'react';
import {View, StyleSheet} from 'react-native';
// Definir interfaz para las props
interface MiPrimerComponenteProps {
color?: string;
tamaño?: number;
}
function MiPrimerComponente({
color = 'red',
tamaño = 50,
}: MiPrimerComponenteProps): JSX.Element {
return (
<View
style={[
styles.container,
{
backgroundColor: color,
width: tamaño,
height: tamaño,
},
]}
/>
);
}
const styles = StyleSheet.create({
container: {
margin: 10,
borderRadius: 8, // Esquinas redondeadas
},
});
export default MiPrimerComponente;
Usar con diferentes props:
tsx
// App.tsx
<SafeAreaView style={{flex: 1, justifyContent: 'center', alignItems: 'center'}}>
<MiPrimerComponente color="red" tamaño={50} />
<MiPrimerComponente color="blue" tamaño={60} />
<MiPrimerComponente color="green" tamaño={70} />
<MiPrimerComponente color="orange" tamaño={80} />
<MiPrimerComponente color="purple" tamaño={90} />
</SafeAreaView>
🐛 Paso 9: Solución de Problemas Comunes
Error: "MiPrimerComponente is not defined"
tsx
// Verificar:
// 1. Import correcto
import MiPrimerComponente from './src/components/MiPrimerComponente/MiPrimerComponente';
// 2. Export en el componente
export default MiPrimerComponente;
// 3. Nombre del archivo coincide
// Archivo: MiPrimerComponente.tsx
// Export: MiPrimerComponente
Error: "JSX element has no corresponding closing tag"
tsx
// ❌ INCORRECTO
<MiPrimerComponente>
// ✅ CORRECTO (self-closing)
<MiPrimerComponente />
// ✅ CORRECTO (con hijos)
<MiPrimerComponente>
<Text>Hijo</Text>
</MiPrimerComponente>
Error: "Cannot find module"
bash
# Verificar rutas
# Ruta relativa correcta desde App.tsx:
./src/components/MiPrimerComponente/MiPrimerComponente
# Verificar que el archivo existe
ls src/components/MiPrimerComponente/
📝 Paso 10: Buenas Prácticas Avanzadas
1. Crear archivo de barril (barrel file):
tsx
// src/components/index.ts
export {default as MiPrimerComponente} from './MiPrimerComponente/MiPrimerComponente';
// Luego importar desde App.tsx
import {MiPrimerComponente} from './src/components';
2. Separar estilos en archivo aparte:
tsx
// MiPrimerComponente.styles.ts
import {StyleSheet} from 'react-native';
export default StyleSheet.create({
container: {
margin: 10,
borderRadius: 8,
},
});
// MiPrimerComponente.tsx
import React from 'react';
import {View} from 'react-native';
import styles from './MiPrimerComponente.styles';
3. Agregar documentación JSDoc:
tsx
/**
* Mi primer componente personalizado
* @component
* @param {Object} props - Propiedades del componente
* @param {string} [props.color='red'] - Color de fondo
* @param {number} [props.tamaño=50] - Tamaño en píxeles
* @returns {JSX.Element} Componente renderizado
*/
function MiPrimerComponente({color = 'red', tamaño = 50}) {
return <View style={{backgroundColor: color, width: tamaño, height: tamaño}} />;
}
🧪 Paso 11: Ejercicio Práctico
Crear componente "Tarjeta de Presentación":
tsx
// src/components/TarjetaPresentacion/TarjetaPresentacion.tsx
import React from 'react';
import {View, Text, StyleSheet} from 'react-native';
interface TarjetaPresentacionProps {
nombre: string;
ocupacion: string;
email: string;
}
function TarjetaPresentacion({
nombre,
ocupacion,
email,
}: TarjetaPresentacionProps): JSX.Element {
return (
<View style={styles.tarjeta}>
<Text style={styles.nombre}>{nombre}</Text>
<Text style={styles.ocupacion}>{ocupacion}</Text>
<Text style={styles.email}>{email}</Text>
</View>
);
}
const styles = StyleSheet.create({
tarjeta: {
backgroundColor: 'white',
padding: 20,
borderRadius: 10,
margin: 10,
shadowColor: '#000',
shadowOffset: {width: 0, height: 2},
shadowOpacity: 0.1,
shadowRadius: 4,
elevation: 3,
},
nombre: {
fontSize: 20,
fontWeight: 'bold',
marginBottom: 5,
},
ocupacion: {
fontSize: 16,
color: '#666',
marginBottom: 10,
},
email: {
fontSize: 14,
color: '#007AFF',
},
});
export default TarjetaPresentacion;
Usar en App.tsx:
tsx
import TarjetaPresentacion from './src/components/TarjetaPresentacion/TarjetaPresentacion';
// En el return
<TarjetaPresentacion
nombre="Juan Pérez"
ocupacion="Desarrollador React Native"
email="juan@email.com"
/>
✅ Checklist de Componente Correcto
Nombre del componente empieza con mayúscula
Importa React
Importa componentes necesarios de react-native
Exporta por defecto el componente
Retorna JSX.Element
Estilos definidos con StyleSheet (no inline)
Props definidas con interfaz TypeScript (opcional)
Ruta de importación correcta en App.tsx
🎉 ¡Felicidades!
Has creado tu primer componente React Native. Has aprendido:
✅ Estructura básica de un componente
✅ Import/export correcto
✅ Agregar estilos con StyleSheet
✅ Pasar props al componente
✅ Reutilizar componentes múltiples veces
📚 Próximos Pasos
Explorar más componentes: Text, Image, Button, TextInput
Aprender hooks: useState, useEffect, useContext
Implementar navegación: React Navigation
Consumir APIs: Fetch, Axios
Manejar estado global: Redux, Context API
¡Excelente trabajo! Ahora tienes las bases para crear componentes personalizados. Sigue practicando creando componentes más complejos.
Comentarios
Publicar un comentario