Concepto clave
La navegación y gestión de estado son dos pilares fundamentales en el desarrollo de apps móviles con React Native. Imagina que tu app es una ciudad: la navegación son las calles y avenidas que conectan diferentes barrios (pantallas), mientras que el estado es la información que los ciudadanos (componentes) comparten entre sí, como noticias o eventos. Sin una buena planificación de calles, los usuarios se pierden; sin un sistema eficiente para compartir información, la app se vuelve caótica.
En React Native con Expo, usamos bibliotecas como React Navigation para la navegación y Redux o Context API para el estado. La navegación maneja cómo los usuarios se mueven entre pantallas, usando stacks, tabs o drawers. La gestión de estado controla datos que múltiples componentes necesitan, como el perfil del usuario o configuraciones de la app. Combinarlos bien es clave para apps escalables y mantenibles.
Cómo funciona en la práctica
Vamos a crear una app simple de tareas para ver la navegación y gestión de estado en acción. Primero, instala las dependencias: expo install @react-navigation/native @react-navigation/stack react-redux redux. Luego, estructura tu proyecto con estas carpetas: screens/ para pantallas, store/ para el estado, y navigation/ para configurar rutas.
Paso 1: Configura el store de Redux en store/index.js para gestionar las tareas. Paso 2: Crea un stack navigator en navigation/AppNavigator.js con dos pantallas: HomeScreen y TaskDetailScreen. Paso 3: En HomeScreen, muestra una lista de tareas desde el estado y un botón para añadir nuevas. Paso 4: En TaskDetailScreen, permite editar una tarea específica, actualizando el estado global. Conecta las pantallas al store usando useSelector y useDispatch de React-Redux.
Código en acción
Aquí tienes un ejemplo funcional de configuración básica. Antes: sin gestión de estado, los datos pasan por props y se pierden al navegar.
// Antes: HomeScreen sin estado global
import React from 'react';
import { View, Text } from 'react-native';
export default function HomeScreen({ navigation }) {
const tasks = ['Tarea 1', 'Tarea 2']; // Estado local
return (
{tasks.map((task, index) => (
{task}
))}
);
}Después: integrando Redux para estado global accesible en cualquier pantalla.
// Después: HomeScreen con Redux import React from 'react'; import { View, Text, Button } from 'react-native'; import { useSelector, useDispatch } from 'react-redux'; import { addTask } from '../store/taskSlice'; export default function HomeScreen({ navigation }) { const tasks = useSelector(state => state.tasks); // Estado global const dispatch = useDispatch(); const handleAddTask = () => { dispatch(addTask('Nueva tarea')); // Actualiza estado }; return ( {tasks.map((task, index) => ( navigation.navigate('TaskDetail', { taskId: index })}> {task} ))}); }
Errores comunes
- Anidar navigators incorrectamente: Mezclar stack, tab y drawer navigators sin planificar puede causar bugs de navegación. Solución: Diseña la estructura de navegación en papel primero y usa un solo navigator raíz.
- Estado duplicado: Guardar los mismos datos en el estado local y global, llevando a inconsistencias. Solución: Decide qué datos son globales (ej., usuario) y cuáles locales (ej., input temporal).
- No limpiar listeners de navegación: Olvidar remover event listeners en
useEffectpuede causar fugas de memoria. Solución: Siempre retorna una función de limpieza enuseEffect. - Pasar props en exceso por navegación: Enviar objetos grandes como parámetros de ruta, ralentizando la app. Solución: Pasa IDs y recupera datos del estado global.
- Ignorar el rendimiento en listas grandes: No usar
FlatListoSectionListpara listas, afectando la fluidez. Solución: Optimiza listas con estas componentes ykeyExtractor.
Checklist de dominio
- ¿Puedes configurar un stack navigator con al menos tres pantallas en Expo?
- ¿Sabes conectar un componente a Redux usando
useSelectoryuseDispatch? - ¿Has implementado navegación con parámetros y manejado su recepción?
- ¿Puedes diferenciar cuándo usar estado local vs. global en una app real?
- ¿Has probado la navegación en ambos iOS y Android para verificar consistencia?
- ¿Sabes depurar errores comunes de navegación como "undefined is not an object"?
- ¿Puedes refactorizar una app para mover estado de props a un store global?
Crea una app de notas con navegación y estado global
En este ejercicio, desarrollarás una app simple de notas móvil que use React Navigation para navegar entre pantallas y Redux para gestionar el estado global de las notas. Sigue estos pasos:
- Inicia un nuevo proyecto Expo:
expo init NotesAppy elige la plantilla en blanco. - Instala las dependencias necesarias:
expo install @react-navigation/native @react-navigation/stack react-redux redux @reduxjs/toolkit. - Crea la estructura de carpetas:
screens/,store/,navigation/. - En
store/notesSlice.js, define un slice de Redux con acciones para añadir, editar y eliminar notas. UsacreateSlicede Redux Toolkit. - Configura el store en
store/index.jsy envuélvelo alrededor de la app enApp.js. - En
navigation/AppNavigator.js, crea un stack navigator con dos pantallas:HomeScreen(lista de notas) yNoteDetailScreen(detalle/edición). - Implementa
HomeScreenenscreens/HomeScreen.js: muestra notas desde el store, un botón para añadir nuevas, y navega aNoteDetailScreenal tocar una nota. - Implementa
NoteDetailScreenenscreens/NoteDetailScreen.js: permite ver y editar una nota, actualizando el store al guardar. - Prueba la app en un emulador o dispositivo: añade notas, edítalas, y verifica que los cambios persistan al navegar.
- Opcional: Añade un drawer navigator para una pantalla de configuración que cambie el tema (claro/oscuro) usando estado global.
- Usa
createStackNavigatorde React Navigation para definir las rutas enAppNavigator.js. - En el slice de Redux, define el estado inicial como un array de objetos con
id,title, ycontent. - Para navegar con parámetros, pasa el
idde la nota ennavigation.navigatey recupéralo conroute.params.
Evalua tu comprension
Completa el quiz interactivo de arriba para ganar XP.