Lección 16 de 20 · Lectura y práctica
Diseño de la arquitectura y planificación del proyecto de e-commerce
Concepto claveLa arquitectura de software en React Native con Expo es como el plano de un edificio: define cómo se organizan y comunican las partes de tu app de e-commerce. En lugar de construir habitaciones al azar, planificas.
Del concepto a la práctica
Taller de esta lección
La arquitectura se vuelve útil cuando asigna una responsabilidad observable a cada zona. Para la tienda de papelería, separa pantallas, componentes, contexto y servicios; así una modificación de precios no obliga a reescribir la navegación.
Ejemplo resuelto
Coloca
CatalogScreen,CartScreenyProfileScreenen pantallas.Reserva componentes para
ProductCardyCartRow.Define
CartContextpara líneas y acciones.Define un servicio que transforme productos recibidos en registros del catálogo. Un error frecuente es guardar llamadas de red y reglas del carrito dentro de cada pantalla. Corrígelo extrayendo funciones pequeñas y dejando a la pantalla como coordinadora de estados visibles.
Pruébalo
Dibuja el flujo catálogo-detalle-carrito-perfil y asigna cada archivo a una responsabilidad antes de programar.
Comprueba tu resultado
Tu esquema debe mostrar cuatro pantallas, dos componentes reutilizables, un contexto de carrito y un servicio de datos; ninguna pantalla debe ser simultáneamente servicio y proveedor global.
Responsabilidades y contrato compartido
Añade DetailScreen a las tres pantallas del ejemplo para completar cuatro. CatalogScreen muestra fuente validada; DetailScreen recibe productId y consulta esa fuente; CartScreen modifica cantidades y muestra importe; ProfileScreen representa sesión ficticia. CartProvider vive por encima de rutas que lo consumen y no realiza navegación dentro de una función de cálculo.
El catálogo común de integración tiene cuatro registros: p1 Cuaderno400centavos stock3, p2 Agenda750 stock2, p3 Lápiz225 stock5 y p4 Estuche1000 stock2. El servicio ofrece id/name/priceCents/stock y el contexto solo id/quantity. El total se deriva uniendo ambos por ID; desconocido o stock insuficiente son errores controlados, no registros invisibles sumados silenciosamente. Esta colección es distinta del pequeño ejemplo HTTP de120/650 de la lección11: no mezcles sus precios entre pruebas.
Explica dónde están carga/error, búsqueda local y sesión. Un modelo en memoria no reserva inventario real ni procesa pagos; la orden, stock y total finales requieren backend. Una función pura de subtotal puede probarse sin React, mientras el proveedor y navegación necesitan una comprobación del montaje. Capturas de las pantallas no prueban por sí mismas que comparten estado. Guarda un mapa archivo→responsabilidad y una transición de cantidad para demostrar esa relación.

Mapa de prácticaUna condición decide qué camino ejecuta el programa. Un bucle repite una operación mientras queden elementos, y termina cuando la lista se agota. Separar ambas ideas ayuda a seguir el flujo y comprobar casos límite.
Ver la infografía en tamaño completo ↗Concepto clave
La arquitectura de software en React Native con Expo es como el plano de un edificio: define cómo se organizan y comunican las partes de tu app de e-commerce. En lugar de construir habitaciones al azar, planificas dónde irán los productos, el carrito y el checkout para que los usuarios naveguen sin perderse.
Imagina una tienda física: tienes la entrada (pantalla de inicio), pasillos (navegación), mostrador (carrito) y caja (pago). En React Native, esto se traduce en componentes, pantallas, estado global y servicios. Una arquitectura sólida evita que tu app se convierta en un "spaghetti code" donde cambiar un botón rompe todo el flujo de compra.
Cómo funciona en la práctica
Para nuestra app de e-commerce, seguiremos una arquitectura basada en componentes y estado global. Primero, definimos las pantallas principales: Home, ProductList, ProductDetail, Cart y Checkout. Luego, establecemos la navegación con React Navigation, usando un stack para el flujo de compra y un tab para secciones fijas.
El estado global (con Context API o Redux) manejará el carrito y el usuario. Los servicios se encargan de llamadas a APIs, como obtener productos o procesar pagos. Aquí un ejemplo de estructura de carpetas:
/src
/components # Componentes reutilizables (Header, ProductCard)
/screens # Pantallas principales
/navigation # Configuración de React Navigation
/context # Estado global (CartContext, UserContext)
/services # Llamadas a API y lógica de negocio
/utils # Funciones helper (formatear precios)
/assets # Imágenes y fuentesCodigo en accion
Veamos cómo implementar el CartContext para manejar el estado del carrito. Primero, la versión básica sin optimizar:
// Antes: Estado local en cada pantalla
import React, { useState } from 'react';
const CartScreen = () => {
const [cart, setCart] = useState([]);
const addToCart = (product) => {
setCart([...cart, product]);
};
return (
// JSX con cart
);
};Después, refactorizado con Context API para estado global:
// Después: CartContext.js
import React, { createContext, useState, useContext } from 'react';
const CartContext = createContext();
export const CartProvider = ({ children }) => {
const [cart, setCart] = useState([]);
const addToCart = (product) => {
setCart(prevCart => [...prevCart, product]);
};
const removeFromCart = (productId) => {
setCart(prevCart => prevCart.filter(item => item.id !== productId));
};
return (
{children}
);
};
export const useCart = () => useContext(CartContext);
// Uso en cualquier pantalla
import { useCart } from '../context/CartContext';
const ProductDetail = ({ product }) => {
const { addToCart } = useCart();
return (
);
};Errores comunes
- No planificar la navegación: Usar navegación anidada sin estructura clara, causando pantallas inaccesibles. Solución: Dibuja un diagrama de flujo antes de codificar y usa React Navigation con rutas bien definidas.
- Estado duplicado: Tener el mismo dato (como el carrito) en múltiples componentes, llevando a inconsistencias. Solución: Centraliza el estado con Context API o Redux desde el inicio.
- Ignorar el rendimiento: Cargar todas las imágenes de productos a la vez, ralentizando la app. Solución: Implementa lazy loading para listas largas y optimiza assets con Expo Image.
- No manejar errores de API: Asumir que las llamadas a servicios siempre funcionan, mostrando pantallas en blanco. Solución: Agrega try-catch en servicios y estados de loading/error en componentes.
- Olvidar la escalabilidad
Checklist de dominio
- He definido al menos 5 pantallas principales para la app de e-commerce.
- He configurado React Navigation con un stack y tab navigator.
- He implementado un contexto global para el carrito de compras.
- He organizado el proyecto en carpetas por funcionalidad (components, screens, etc.).
- He creado servicios separados para llamadas a API (ej: fetchProducts).
- He optimizado imágenes y componentes para rendimiento en móviles.
- He probado la navegación entre pantallas en un emulador o dispositivo real.
Planifica y configura la arquitectura base de tu app de e-commerce
Sigue estos pasos para crear la estructura inicial de tu proyecto:
- Crea un nuevo proyecto Expo con
npx create-expo-app ecommerce-app --template blanky ábrelo en tu editor. - Instala las dependencias esenciales:
npm install @react-navigation/native @react-navigation/stack @react-navigation/bottom-tabs react-native-screens react-native-safe-area-context. - Dentro de la carpeta
src, crea las subcarpetas:components,screens,navigation,context,services,utils,assets. - En
src/navigation, creaAppNavigator.jsy configura un Bottom Tab Navigator con 3 pestañas: Home, Categorías y Perfil. - En
src/context, creaCartContext.jscon un provider que maneje un array de productos en el carrito y funciones para añadir/eliminar. - En
src/screens, crea archivos vacíos para:HomeScreen.js,ProductListScreen.js,ProductDetailScreen.js,CartScreen.js,CheckoutScreen.js. - En
App.js, envuelve tu navegador conCartProvidery asegúrate de que las pantallas se rendericen correctamente. - Ejecuta la app con
npx expo starty verifica que la navegación funcione en un emulador o dispositivo.
Pistas
- Usa expo init si create-expo-app falla, asegurándote de tener Node.js actualizado.
- Para el CartContext, recuerda usar useReducer si el estado se vuelve complejo con múltiples acciones.
- Prueba cada paso incrementalmente: primero la navegación, luego el contexto, para aislar errores.
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.