Lección 7 de 20 · Lectura y práctica
Implementación de pestañas (Tab Navigator) y navegación en stack
Tipo de lección: VideoConcepto claveEn el desarrollo de aplicaciones móviles, la navegación es como el sistema de calles de una ciudad. Imagina que tu app es una ciudad: las pestañas (Tab Navigator) son las avenidas principales.
Del concepto a la práctica
Taller de esta lección
Las pestañas deben representar destinos principales y el stack debe resolver el detalle dentro de una sección. En la tienda, las pestañas pueden ser Catálogo, Carrito y Perfil; el stack del catálogo contiene Catálogo y Detalle. Esta separación evita que cada detalle se convierta en una pestaña.
Ejemplo resuelto
Crea el tab raíz con las tres secciones.
Inserta un stack como pantalla
Catálogodel tab.Define
Detalledentro de ese stack.Abre un producto y vuelve con el botón de atrás; después cambia de pestaña. Un error frecuente es registrar
Detallesimultáneamente como tab y como stack sin una razón funcional. Corrígelo dejando el detalle dentro del flujo que lo origina y reservando tabs para destinos persistentes.
Pruébalo
Añade cuatro productos y verifica que abrir el tercero no cambie la pestaña activa a una nueva sección.
Comprueba tu resultado
La barra debe conservar tres pestañas; el detalle debe aparecer sobre el catálogo y el retorno debe llevar al listado, no al perfil ni al carrito.
Jerarquía de rutas sin nombres ambiguos
Declara un tab raíz con nombres CatalogoTab, CarritoTab y PerfilTab; CatalogoTab renderiza CatalogStack, cuyo stack tiene Catalogo y Detalle. Esto separa los identificadores técnicos aunque las etiquetas visibles sigan siendo Catálogo/Carrito/Perfil. Desde Catalogo, navigate('Detalle',{productId:'p3'}) abre el detalle dentro del stack. Desde fuera de él, dirige la navegación al padre con su pantalla/params adecuados; no presupongas que una ruta anidada es accesible globalmente por nombre.
El cuarto registro es p4={id:'p4',name:'Estuche'} y p3 sigue siendo Lápiz según el fixture previo. Espera tres tabs, Detalle de Lápiz y retorno explícito al listado. Desactiva el header del tab que contiene el stack si quieres evitar dos cabeceras, sin ocultar la del stack que proporciona atrás. Las pestañas inferiores no se vuelven superiores automáticamente en Android.
Volver entre pestañas normalmente preserva sus pantallas según configuración y ciclo de vida; documenta cualquier reset/unmount elegido. Coloca CartProvider por encima de tabs para compartir el carrito. Navegar no debe limpiar ese estado. No pases callbacks ni grandes objetos por params; ID y valores serializables evitan otra fuente de verdad. Prueba el cambio al carrito y regreso al catálogo después de abrir el detalle.

Mapa de prácticaLas pestañas organizan secciones y cada stack conserva su historial de pantallas. Pasar un identificador de producto permite abrir el detalle sin duplicar el objeto completo; comprueba el regreso y los parámetros.
Ver la infografía en tamaño completo ↗Tipo de lección: Video
Concepto clave
En el desarrollo de aplicaciones móviles, la navegación es como el sistema de calles de una ciudad. Imagina que tu app es una ciudad: las pestañas (Tab Navigator) son las avenidas principales que conectan distritos importantes, mientras que la navegación en stack son las calles internas de cada distrito que te permiten explorar en profundidad.
En React Native con Expo, implementamos esta navegación usando React Navigation, la biblioteca estándar de la industria. El Tab Navigator organiza las secciones principales de tu app en pestañas inferiores (iOS) o superiores (Android), mientras que el Stack Navigator maneja las transiciones entre pantallas dentro de cada sección. Esta combinación crea una experiencia de usuario intuitiva que los usuarios de iOS y Android reconocen inmediatamente.
Cómo funciona en la práctica
Vamos a crear una app de noticias con tres secciones principales: Inicio, Búsqueda y Perfil. Cada sección tendrá su propia pestaña, y dentro de cada una, podrás navegar a pantallas detalladas.
Paso 1: Instala las dependencias necesarias. En tu proyecto Expo, ejecuta:
npx expo install @react-navigation/native @react-navigation/bottom-tabs @react-navigation/stack
npx expo install react-native-screens react-native-safe-area-contextPaso 2: Configura la navegación principal. Crearás un Tab Navigator que contenga tres Stack Navigators, uno para cada sección. Esto te permite tener navegación independiente dentro de cada pestaña.
Código en acción
Aquí tienes la implementación completa de nuestra app de noticias:
// App.js
import React from 'react';
import { NavigationContainer } from '@react-navigation/native';
import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
import { createStackNavigator } from '@react-navigation/stack';
import Ionicons from '@expo/vector-icons/Ionicons';
// Pantallas de ejemplo
function HomeScreen() { return null; }
function ArticleScreen() { return null; }
function SearchScreen() { return null; }
function SearchResultsScreen() { return null; }
function ProfileScreen() { return null; }
function SettingsScreen() { return null; }
// Stack Navigators
const HomeStack = createStackNavigator();
function HomeStackScreen() {
return (
);
}
const SearchStack = createStackNavigator();
function SearchStackScreen() {
return (
);
}
const ProfileStack = createStackNavigator();
function ProfileStackScreen() {
return (
);
}
// Tab Navigator principal
const Tab = createBottomTabNavigator();
export default function App() {
return (
({
tabBarIcon: ({ focused, color, size }) => {
let iconName;
if (route.name === 'Inicio') {
iconName = focused ? 'home' : 'home-outline';
} else if (route.name === 'Buscar') {
iconName = focused ? 'search' : 'search-outline';
} else if (route.name === 'Perfil') {
iconName = focused ? 'person' : 'person-outline';
}
return ;
},
tabBarActiveTintColor: '#007AFF',
tabBarInactiveTintColor: 'gray',
})}
>
);
}Ahora, veamos cómo navegar entre pantallas dentro de un stack. Aquí está el antes (navegación básica) y después (con parámetros):
// ANTES: Navegación simple
function HomeScreen({ navigation }) {
return (
Errores comunes
- Anidar Stack Navigators incorrectamente: No coloques un Stack Navigator dentro de otro sin necesidad. Esto crea jerarquías confusas. En su lugar, usa un Tab Navigator con Stack Navigators como hijos.
- Olvidar headerShown: false: Cuando anidas navigators, aparecen múltiples headers. Configura
options={{ headerShown: false }}en las pantallas del Tab Navigator para evitar duplicados. - No manejar el estado de navegación: Al pasar entre pestañas, el estado del stack se mantiene. Si necesitas resetearlo, usa
navigation.reset()o configura listeners en el Tab Navigator. - Iconos inconsistentes entre plataformas: iOS y Android tienen convenciones diferentes para los iconos de pestañas. Usa bibliotecas como
@expo/vector-iconsy verifica cómo se ven en ambos sistemas. - Pasar objetos complejos por parámetros: Evita pasar grandes objetos o funciones por parámetros de navegación. En su lugar, pasa IDs y recupera los datos desde un estado global o una API.
Checklist de dominio
- Puedo crear un Tab Navigator con al menos 3 pestañas usando
createBottomTabNavigator - Sé configurar iconos personalizados para cada pestaña que cambien según el estado activo/inactivo
- Puedo anidar un Stack Navigator dentro de cada pestaña para navegación interna
- Sé pasar parámetros entre pantallas y recuperarlos correctamente en la pantalla destino
- Puedo manejar el estado de navegación al cambiar entre pestañas (preservar o resetear stacks)
- Reconozco y soluciono el problema de headers duplicados en navigators anidados
- Sé probar la navegación en ambos dispositivos (iOS y Android) y ajustar para diferencias de plataforma
Crear una app de tienda con navegación por pestañas y stacks
Vas a construir una app de tienda en línea con React Native y Expo que implemente navegación por pestañas y stacks. Sigue estos pasos:
- Configuración inicial: Crea un nuevo proyecto Expo con
npx create-expo-app TiendaAppe instala las dependencias de React Navigation necesarias. - Estructura de navegación: Implementa un Tab Navigator con 4 pestañas: Inicio, Categorías, Carrito y Perfil. Cada pestaña debe usar Ionicons como iconos.
- Stack Navigators: Dentro de cada pestaña, crea un Stack Navigator:
- Inicio: Pantallas "Productos Destacados" y "Detalle de Producto"
- Categorías: Pantallas "Lista de Categorías" y "Productos por Categoría"
- Carrito: Pantallas "Resumen del Carrito" y "Proceso de Pago"
- Perfil: Pantallas "Mi Perfil" y "Configuración"
- Paso de parámetros: En la pantalla "Productos Destacados", crea un botón que navegue a "Detalle de Producto" pasando un objeto producto con id, nombre y precio.
- Personalización: Configura colores diferentes para las pestañas activas en iOS (#007AFF) y Android (#6200EE). Usa
Platform.OSpara detectar el sistema operativo. - Pruebas: Ejecuta la app en un emulador iOS y Android (o dispositivo físico) para verificar que la navegación funcione correctamente en ambas plataformas.
Pistas
- Recuerda que cada Stack Navigator debe estar envuelto en su propio componente funcional
- Usa screenOptions en el Tab Navigator para configurar los iconos de manera dinámica basándote en route.name
- Para los colores por plataforma, puedes crear una función que retorne el color apropiado según Platform.OS
Evalua tu comprension
Completa el quiz interactivo de arriba para ganar XP.
Sigue con React Native con Expo: Desarrollo de Apps Nativas para iOS y Android
Esta lección forma parte de un curso de Cursalo. Revisa su programa y elige entre la compra individual o el acceso a toda la escuela.
Si ya tenías acceso a este curso, entra con tu cuenta: tus derechos y tu progreso se conservan. No necesitas comprarlo de nuevo.