{"id":23153,"date":"2025-12-30T06:03:33","date_gmt":"2025-12-30T06:03:33","guid":{"rendered":"https:\/\/prometteursolutions.com\/blog\/?p=23153"},"modified":"2025-12-30T06:07:22","modified_gmt":"2025-12-30T06:07:22","slug":"como-construir-una-aplicacion-de-sitio-web-de-comercio-electronico-con-react-js","status":"publish","type":"post","link":"https:\/\/prometteursolutions.com\/blog\/es\/como-construir-una-aplicacion-de-sitio-web-de-comercio-electronico-con-react-js\/","title":{"rendered":"C\u00d3MO CONSTRUIR UNA APLICACI\u00d3N DE SITIO WEB DE COMERCIO ELECTR\u00d3NICO CON REACT.JS"},"content":{"rendered":"<div class=\"dad65929\">\n<div class=\"_4f9bf79 d7dc56a8 _43c05b5\">\n<div class=\"ds-message _63c77b1\">\n<div class=\"ds-markdown\">\n<h1><strong>Gu\u00eda Definitiva: Construye Tu Propia Tienda Online con React.js<\/strong><\/h1>\n<h2><strong>\u00bfListo para crear tu propia tienda online?<\/strong><\/h2>\n<p class=\"ds-markdown-paragraph\">El comercio electr\u00f3nico no es solo el futuro, es el presente. Con millones de compras online cada d\u00eda, tener una tienda virtual robusta y atractiva es crucial. Pero, \u00bfc\u00f3mo crear una sin gastar una fortuna en desarrollo? La respuesta est\u00e1 en tus propias habilidades.<\/p>\n<p class=\"ds-markdown-paragraph\">Imagina poder\u00a0<strong>construir una aplicaci\u00f3n de comercio electr\u00f3nico con React.js<\/strong>\u00a0que sea r\u00e1pida, moderna y totalmente bajo tu control. En esta gu\u00eda completa, te llevar\u00e9 de la mano en cada paso para\u00a0<strong>desarrollar un ecommerce completo con React.js<\/strong>. Desde la primera l\u00ednea de c\u00f3digo hasta el despliegue en producci\u00f3n, cubriremos todo lo que necesitas.<\/p>\n<p class=\"ds-markdown-paragraph\"><strong>React.js<\/strong>\u00a0se ha convertido en el rey del frontend por una raz\u00f3n: sus componentes reutilizables, su alto rendimiento y su enorme ecosistema lo hacen ideal para\u00a0<strong>desarrollar la interfaz de una tienda online<\/strong>. Seg\u00fan el State of JS 2023, React mantiene una adopci\u00f3n del 80% entre desarrolladores frontend, demostrando su dominio en la creaci\u00f3n de aplicaciones web complejas.<\/p>\n<p class=\"ds-markdown-paragraph\">Al final de este\u00a0<strong>tutorial pr\u00e1ctico y paso a paso<\/strong>, no solo tendr\u00e1s una aplicaci\u00f3n funcional, sino el conocimiento profundo para personalizarla y escalarla a tus necesidades. \u00bfEmpezamos?<\/p>\n<h2><strong>Por Qu\u00e9 React.js es Tu Mejor Aliado para un Ecommerce<\/strong><\/h2>\n<h3><strong>Ventajas Clave para Tu Tienda Online<\/strong><\/h3>\n<p class=\"ds-markdown-paragraph\">Cuando hablamos de\u00a0<strong>React.js para tiendas online<\/strong>, no es una moda pasajera. Hay razones t\u00e9cnicas s\u00f3lidas que lo convierten en la mejor opci\u00f3n:<\/p>\n<p class=\"ds-markdown-paragraph\"><strong>Componentes Reutilizables = Desarrollo R\u00e1pido<\/strong><br \/>\nEn un\u00a0<strong>proyecto pr\u00e1ctico React ecommerce<\/strong>, elementos como las tarjetas de producto, botones de &#8220;a\u00f1adir al carrito&#8221; o los filtros se usan una y otra vez. Con React, creas estos\u00a0<strong>componentes React comercio electr\u00f3nico<\/strong>\u00a0una sola vez y los reutilizas en toda tu aplicaci\u00f3n. Esto acelera enormemente el desarrollo y facilita el mantenimiento.<\/p>\n<p class=\"ds-markdown-paragraph\"><strong>Gesti\u00f3n de Estado Predecible<\/strong><br \/>\n\u00bfC\u00f3mo manejar el carrito de compras, los datos del usuario o el cat\u00e1logo de productos? React, junto con herramientas como Context API o Redux, ofrece soluciones elegantes para la\u00a0<strong>gesti\u00f3n de estado (Redux\/Context)<\/strong>. Esto significa que tu aplicaci\u00f3n se comportar\u00e1 de manera consistente, algo fundamental en una tienda online donde cada interacci\u00f3n cuenta.<\/p>\n<p class=\"ds-markdown-paragraph\"><strong>Rendimiento que Retiene Clientes<\/strong><br \/>\nLa\u00a0<strong>optimizaci\u00f3n de rendimiento<\/strong>\u00a0es crucial. Nadie espera m\u00e1s de 3 segundos para ver un producto. React Virtual DOM y t\u00e9cnicas como code splitting aseguran que tu tienda cargue r\u00e1pido y sea suave al navegar. Para SEO avanzado, luego podr\u00e1s migrar f\u00e1cilmente a Next.js y aprovechar su renderizado del lado del servidor.<\/p>\n<p class=\"ds-markdown-paragraph\"><strong>Un Ecosistema que lo Tiene Todo<\/strong><br \/>\nDesde\u00a0<strong>enrutamiento con React Router<\/strong>\u00a0hasta bibliotecas de UI como Material-UI, el ecosistema React est\u00e1 maduro y lleno de soluciones probadas para cualquier desaf\u00edo de\u00a0<strong>desarrollo de comercio electr\u00f3nico<\/strong>.<\/p>\n<h2><strong>Primeros Pasos: Configurando Tu Proyecto React.js<\/strong><\/h2>\n<h3><strong>Prepara Tu Entorno de Desarrollo<\/strong><\/h3>\n<p class=\"ds-markdown-paragraph\">Antes de escribir c\u00f3digo, necesitamos las herramientas adecuadas. Para este\u00a0<strong>tutorial crear tienda online con React.js<\/strong>, necesitar\u00e1s:<\/p>\n<ul>\n<li>\n<p class=\"ds-markdown-paragraph\"><strong>Node.js<\/strong>\u00a0(versi\u00f3n 16 o superior): El motor detr\u00e1s de npm y tu entorno de ejecuci\u00f3n.<\/p>\n<\/li>\n<li>\n<p class=\"ds-markdown-paragraph\"><strong>Un editor de c\u00f3digo<\/strong>: Visual Studio Code es altamente recomendado por su integraci\u00f3n con JavaScript.<\/p>\n<\/li>\n<li>\n<p class=\"ds-markdown-paragraph\"><strong>Navegador moderno<\/strong>: Chrome o Firefox con herramientas de desarrollador.<\/p>\n<\/li>\n<\/ul>\n<h3><strong>Crea la Base de Tu Tienda Online<\/strong><\/h3>\n<p class=\"ds-markdown-paragraph\">Abre tu terminal y ejecuta el comando m\u00e1gico que iniciar\u00e1 todo:<\/p>\n<div class=\"md-code-block md-code-block-light\">\n<div class=\"md-code-block-banner-wrap\">\n<div class=\"md-code-block-banner md-code-block-banner-lite\">\n<div class=\"_121d384\">\n<div class=\"d2a24f03\"><span class=\"d813de27\">bash<\/span><\/div>\n<\/div>\n<\/div>\n<\/div>\n<pre>npx create-react-app mi-tienda-online\r\n<span class=\"token builtin class-name\">cd<\/span> mi-tienda-online\r\n<span class=\"token function\">npm<\/span> start<\/pre>\n<\/div>\n<p class=\"ds-markdown-paragraph\">\u00a1Enhorabuena! Ya tienes una aplicaci\u00f3n React b\u00e1sica funcionando en\u00a0<code>http:\/\/localhost:3000<\/code>.<\/p>\n<h3><strong>Organizaci\u00f3n que Escala: Estructura de Carpetas<\/strong><\/h3>\n<p class=\"ds-markdown-paragraph\">Una buena organizaci\u00f3n desde el principio te ahorrar\u00e1 dolores de cabeza. Te recomiendo esta estructura:<\/p>\n<div class=\"md-code-block md-code-block-light\">\n<div class=\"md-code-block-banner-wrap\">\n<div class=\"md-code-block-banner md-code-block-banner-lite\">\n<div class=\"_121d384\">\n<div class=\"d2a24f03\"><span class=\"d813de27\">text<\/span><\/div>\n<\/div>\n<\/div>\n<\/div>\n<pre>mi-tienda-online\/\r\n\u251c\u2500\u2500 src\/\r\n\u2502   \u251c\u2500\u2500 components\/     # Componentes reutilizables\r\n\u2502   \u251c\u2500\u2500 context\/        # Contextos para estado global\r\n\u2502   \u251c\u2500\u2500 pages\/          # P\u00e1ginas principales\r\n\u2502   \u251c\u2500\u2500 services\/       # Llamadas a APIs\r\n\u2502   \u251c\u2500\u2500 styles\/         # Estilos CSS\/SCSS\r\n\u2502   \u251c\u2500\u2500 utils\/          # Funciones helper\r\n\u2502   \u2514\u2500\u2500 App.js          # Componente ra\u00edz<\/pre>\n<\/div>\n<h3><strong>Configura el Enrutamiento B\u00e1sico<\/strong><\/h3>\n<p class=\"ds-markdown-paragraph\">Instala React Router para la navegaci\u00f3n entre p\u00e1ginas:<\/p>\n<div class=\"md-code-block md-code-block-light\">\n<div class=\"md-code-block-banner-wrap\">\n<div class=\"md-code-block-banner md-code-block-banner-lite\">\n<div class=\"_121d384\">\n<div class=\"d2a24f03\"><span class=\"d813de27\">bash<\/span><\/div>\n<\/div>\n<\/div>\n<\/div>\n<pre><span class=\"token function\">npm<\/span> <span class=\"token function\">install<\/span> react-router-dom<\/pre>\n<\/div>\n<p class=\"ds-markdown-paragraph\">Ahora, configura las rutas b\u00e1sicas en tu\u00a0<code>App.js<\/code>:<\/p>\n<div class=\"md-code-block md-code-block-light\">\n<div class=\"md-code-block-banner-wrap\">\n<div class=\"md-code-block-banner md-code-block-banner-lite\">\n<div class=\"_121d384\">\n<div class=\"d2a24f03\"><span class=\"d813de27\">jsx<\/span><\/div>\n<\/div>\n<\/div>\n<\/div>\n<pre><span class=\"token keyword\">import<\/span> <span class=\"token punctuation\">{<\/span> BrowserRouter<span class=\"token punctuation\">,<\/span> Routes<span class=\"token punctuation\">,<\/span> Route <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">from<\/span> <span class=\"token string\">'react-router-dom'<\/span><span class=\"token punctuation\">;<\/span>\r\n<span class=\"token keyword\">import<\/span> Home <span class=\"token keyword\">from<\/span> <span class=\"token string\">'.\/pages\/Home'<\/span><span class=\"token punctuation\">;<\/span>\r\n<span class=\"token keyword\">import<\/span> Cart <span class=\"token keyword\">from<\/span> <span class=\"token string\">'.\/pages\/Cart'<\/span><span class=\"token punctuation\">;<\/span>\r\n<span class=\"token keyword\">import<\/span> Checkout <span class=\"token keyword\">from<\/span> <span class=\"token string\">'.\/pages\/Checkout'<\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n<span class=\"token keyword\">function<\/span> <span class=\"token function\">App<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>\r\n  <span class=\"token keyword\">return<\/span> <span class=\"token punctuation\">(<\/span>\r\n    <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span><span class=\"token class-name\">BrowserRouter<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\r\n      <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span><span class=\"token class-name\">Routes<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\r\n        <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span><span class=\"token class-name\">Route<\/span> <span class=\"token attr-name\">path<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=<\/span><span class=\"token punctuation\">\"<\/span>\/<span class=\"token punctuation\">\"<\/span><\/span> <span class=\"token attr-name\">element<\/span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=<\/span><span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">&lt;<\/span><span class=\"token class-name\">Home<\/span> <span class=\"token punctuation\">\/&gt;<\/span><span class=\"token punctuation\">}<\/span><\/span> <span class=\"token punctuation\">\/&gt;<\/span><\/span>\r\n        <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span><span class=\"token class-name\">Route<\/span> <span class=\"token attr-name\">path<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=<\/span><span class=\"token punctuation\">\"<\/span>\/cart<span class=\"token punctuation\">\"<\/span><\/span> <span class=\"token attr-name\">element<\/span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=<\/span><span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">&lt;<\/span><span class=\"token class-name\">Cart<\/span> <span class=\"token punctuation\">\/&gt;<\/span><span class=\"token punctuation\">}<\/span><\/span> <span class=\"token punctuation\">\/&gt;<\/span><\/span>\r\n        <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span><span class=\"token class-name\">Route<\/span> <span class=\"token attr-name\">path<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=<\/span><span class=\"token punctuation\">\"<\/span>\/checkout<span class=\"token punctuation\">\"<\/span><\/span> <span class=\"token attr-name\">element<\/span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=<\/span><span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">&lt;<\/span><span class=\"token class-name\">Checkout<\/span> <span class=\"token punctuation\">\/&gt;<\/span><span class=\"token punctuation\">}<\/span><\/span> <span class=\"token punctuation\">\/&gt;<\/span><\/span>\r\n      <span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span><span class=\"token class-name\">Routes<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\r\n    <span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span><span class=\"token class-name\">BrowserRouter<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\r\n  <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n<span class=\"token punctuation\">}<\/span><\/pre>\n<\/div>\n<p class=\"ds-markdown-paragraph\">Con esto, ya tienes la base s\u00f3lida para empezar a\u00a0<strong>construir tu aplicaci\u00f3n de comercio electr\u00f3nico<\/strong>.<\/p>\n<h2><strong>Creando el Cat\u00e1logo de Productos: Lista, Filtros y B\u00fasqueda<\/strong><\/h2>\n<h3><strong>Componente ProductList: Tu Vitrina Digital<\/strong><\/h3>\n<p class=\"ds-markdown-paragraph\">El coraz\u00f3n de cualquier tienda online es su cat\u00e1logo. Vamos a crear un componente que muestre tus productos de forma atractiva.<\/p>\n<p class=\"ds-markdown-paragraph\">Primero, simulemos datos de productos. Crea un archivo\u00a0<code>src\/data\/products.js<\/code>:<\/p>\n<div class=\"md-code-block md-code-block-light\">\n<div class=\"md-code-block-banner-wrap\">\n<div class=\"md-code-block-banner md-code-block-banner-lite\">\n<div class=\"_121d384\">\n<div class=\"d2a24f03\"><span class=\"d813de27\">javascript<\/span><\/div>\n<\/div>\n<\/div>\n<\/div>\n<pre><span class=\"token keyword\">const<\/span> products <span class=\"token operator\">=<\/span> <span class=\"token punctuation\">[<\/span>\r\n  <span class=\"token punctuation\">{<\/span>\r\n    <span class=\"token literal-property property\">id<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span>\r\n    <span class=\"token literal-property property\">name<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">\"Zapatillas Running Pro\"<\/span><span class=\"token punctuation\">,<\/span>\r\n    <span class=\"token literal-property property\">price<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">89.99<\/span><span class=\"token punctuation\">,<\/span>\r\n    <span class=\"token literal-property property\">image<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">\"https:\/\/ejemplo.com\/zapatillas.jpg\"<\/span><span class=\"token punctuation\">,<\/span>\r\n    <span class=\"token literal-property property\">category<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">\"Calzado\"<\/span><span class=\"token punctuation\">,<\/span>\r\n    <span class=\"token literal-property property\">stock<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">15<\/span>\r\n  <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span>\r\n  <span class=\"token comment\">\/\/ M\u00e1s productos aqu\u00ed...<\/span>\r\n<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n<span class=\"token keyword\">export<\/span> <span class=\"token keyword\">default<\/span> products<span class=\"token punctuation\">;<\/span><\/pre>\n<\/div>\n<p class=\"ds-markdown-paragraph\">Ahora, crea\u00a0<code>src\/components\/ProductList.js<\/code>:<\/p>\n<div class=\"md-code-block md-code-block-light\">\n<div class=\"md-code-block-banner-wrap\">\n<div class=\"md-code-block-banner md-code-block-banner-lite\">\n<div class=\"_121d384\">\n<div class=\"d2a24f03\"><span class=\"d813de27\">jsx<\/span><\/div>\n<\/div>\n<\/div>\n<\/div>\n<pre><span class=\"token keyword\">import<\/span> <span class=\"token punctuation\">{<\/span> useState<span class=\"token punctuation\">,<\/span> useEffect <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">from<\/span> <span class=\"token string\">'react'<\/span><span class=\"token punctuation\">;<\/span>\r\n<span class=\"token keyword\">import<\/span> ProductCard <span class=\"token keyword\">from<\/span> <span class=\"token string\">'.\/ProductCard'<\/span><span class=\"token punctuation\">;<\/span>\r\n<span class=\"token keyword\">import<\/span> products <span class=\"token keyword\">from<\/span> <span class=\"token string\">'..\/data\/products'<\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n<span class=\"token keyword\">function<\/span> <span class=\"token function\">ProductList<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>\r\n  <span class=\"token keyword\">const<\/span> <span class=\"token punctuation\">[<\/span>productos<span class=\"token punctuation\">,<\/span> setProductos<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">=<\/span> <span class=\"token function\">useState<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n  \r\n  <span class=\"token comment\">\/\/ Simulamos la carga as\u00edncrona de datos<\/span>\r\n  <span class=\"token function\">useEffect<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">=&gt;<\/span> <span class=\"token punctuation\">{<\/span>\r\n    <span class=\"token comment\">\/\/ En un caso real, aqu\u00ed har\u00edas fetch a tu API<\/span>\r\n    <span class=\"token function\">setProductos<\/span><span class=\"token punctuation\">(<\/span>products<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n  <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n  \r\n  <span class=\"token keyword\">return<\/span> <span class=\"token punctuation\">(<\/span>\r\n    <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div <span class=\"token attr-name\">className<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=<\/span><span class=\"token punctuation\">\"<\/span>product-list<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\r\n      <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>h2<span class=\"token punctuation\">&gt;<\/span><\/span><span class=\"token plain-text\">Nuestros Productos<\/span><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>h2<span class=\"token punctuation\">&gt;<\/span><\/span>\r\n      <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div <span class=\"token attr-name\">className<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=<\/span><span class=\"token punctuation\">\"<\/span>grid<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\r\n        <span class=\"token punctuation\">{<\/span>productos<span class=\"token punctuation\">.<\/span><span class=\"token function\">map<\/span><span class=\"token punctuation\">(<\/span><span class=\"token parameter\">producto<\/span> <span class=\"token operator\">=&gt;<\/span> <span class=\"token punctuation\">(<\/span>\r\n          <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span><span class=\"token class-name\">ProductCard<\/span> <span class=\"token attr-name\">key<\/span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=<\/span><span class=\"token punctuation\">{<\/span>producto<span class=\"token punctuation\">.<\/span>id<span class=\"token punctuation\">}<\/span><\/span> <span class=\"token attr-name\">producto<\/span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=<\/span><span class=\"token punctuation\">{<\/span>producto<span class=\"token punctuation\">}<\/span><\/span> <span class=\"token punctuation\">\/&gt;<\/span><\/span>\r\n        <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">}<\/span>\r\n      <span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<span class=\"token punctuation\">&gt;<\/span><\/span>\r\n    <span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<span class=\"token punctuation\">&gt;<\/span><\/span>\r\n  <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n<span class=\"token punctuation\">}<\/span><\/pre>\n<\/div>\n<p class=\"ds-markdown-paragraph\">F\u00edjate c\u00f3mo usamos\u00a0<strong>hooks de React (useState, useEffect)<\/strong>\u00a0para\u00a0<strong>cargar datos as\u00edncronos<\/strong>. Este patr\u00f3n es fundamental en aplicaciones React reales.<\/p>\n<h3><strong>Componente ProductCard: Reutilizaci\u00f3n en Acci\u00f3n<\/strong><\/h3>\n<p class=\"ds-markdown-paragraph\">Crea\u00a0<code>src\/components\/ProductCard.js<\/code>:<\/p>\n<div class=\"md-code-block md-code-block-light\">\n<div class=\"md-code-block-banner-wrap\">\n<div class=\"md-code-block-banner md-code-block-banner-lite\">\n<div class=\"_121d384\">\n<div class=\"d2a24f03\"><span class=\"d813de27\">jsx<\/span><\/div>\n<\/div>\n<\/div>\n<\/div>\n<pre><span class=\"token keyword\">function<\/span> <span class=\"token function\">ProductCard<\/span><span class=\"token punctuation\">(<\/span><span class=\"token parameter\"><span class=\"token punctuation\">{<\/span> producto <span class=\"token punctuation\">}<\/span><\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>\r\n  <span class=\"token keyword\">const<\/span> <span class=\"token punctuation\">{<\/span> name<span class=\"token punctuation\">,<\/span> price<span class=\"token punctuation\">,<\/span> image <span class=\"token punctuation\">}<\/span> <span class=\"token operator\">=<\/span> producto<span class=\"token punctuation\">;<\/span>\r\n  \r\n  <span class=\"token keyword\">return<\/span> <span class=\"token punctuation\">(<\/span>\r\n    <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div <span class=\"token attr-name\">className<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=<\/span><span class=\"token punctuation\">\"<\/span>product-card<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\r\n      <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>img <span class=\"token attr-name\">src<\/span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=<\/span><span class=\"token punctuation\">{<\/span>image<span class=\"token punctuation\">}<\/span><\/span> <span class=\"token attr-name\">alt<\/span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=<\/span><span class=\"token punctuation\">{<\/span>name<span class=\"token punctuation\">}<\/span><\/span> <span class=\"token punctuation\">\/&gt;<\/span><\/span>\r\n      <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>h3<span class=\"token punctuation\">&gt;<\/span><\/span><span class=\"token punctuation\">{<\/span>name<span class=\"token punctuation\">}<\/span><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>h3<span class=\"token punctuation\">&gt;<\/span><\/span>\r\n      <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>p <span class=\"token attr-name\">className<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=<\/span><span class=\"token punctuation\">\"<\/span>price<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><span class=\"token plain-text\">$<\/span><span class=\"token punctuation\">{<\/span>price<span class=\"token punctuation\">.<\/span><span class=\"token function\">toFixed<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">}<\/span><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>p<span class=\"token punctuation\">&gt;<\/span><\/span>\r\n      <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>button <span class=\"token attr-name\">className<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=<\/span><span class=\"token punctuation\">\"<\/span>add-to-cart<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><span class=\"token plain-text\">\r\n        A\u00f1adir al Carrito\r\n      <\/span><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>button<span class=\"token punctuation\">&gt;<\/span><\/span>\r\n    <span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<span class=\"token punctuation\">&gt;<\/span><\/span>\r\n  <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n<span class=\"token punctuation\">}<\/span><\/pre>\n<\/div>\n<p class=\"ds-markdown-paragraph\">Este es un perfecto ejemplo de\u00a0<strong>componentes reutilizables<\/strong>\u00a0&#8211; lo usar\u00e1s para cada producto en tu cat\u00e1logo.<\/p>\n<h3><strong>Filtros y B\u00fasqueda: Encuentra lo que Necesitas<\/strong><\/h3>\n<p class=\"ds-markdown-paragraph\">Los usuarios necesitan encontrar productos r\u00e1pidamente. A\u00f1adamos\u00a0<strong>filtros y b\u00fasqueda<\/strong>:<\/p>\n<div class=\"md-code-block md-code-block-light\">\n<div class=\"md-code-block-banner-wrap\">\n<div class=\"md-code-block-banner md-code-block-banner-lite\">\n<div class=\"_121d384\">\n<div class=\"d2a24f03\"><span class=\"d813de27\">jsx<\/span><\/div>\n<\/div>\n<\/div>\n<\/div>\n<pre><span class=\"token keyword\">function<\/span> <span class=\"token function\">ProductList<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>\r\n  <span class=\"token keyword\">const<\/span> <span class=\"token punctuation\">[<\/span>productos<span class=\"token punctuation\">,<\/span> setProductos<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">=<\/span> <span class=\"token function\">useState<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n  <span class=\"token keyword\">const<\/span> <span class=\"token punctuation\">[<\/span>filtro<span class=\"token punctuation\">,<\/span> setFiltro<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">=<\/span> <span class=\"token function\">useState<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">''<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n  <span class=\"token keyword\">const<\/span> <span class=\"token punctuation\">[<\/span>categoria<span class=\"token punctuation\">,<\/span> setCategoria<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">=<\/span> <span class=\"token function\">useState<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">'todas'<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n  \r\n  <span class=\"token keyword\">const<\/span> productosFiltrados <span class=\"token operator\">=<\/span> productos<span class=\"token punctuation\">.<\/span><span class=\"token function\">filter<\/span><span class=\"token punctuation\">(<\/span><span class=\"token parameter\">p<\/span> <span class=\"token operator\">=&gt;<\/span> <span class=\"token punctuation\">{<\/span>\r\n    <span class=\"token keyword\">const<\/span> coincideTexto <span class=\"token operator\">=<\/span> p<span class=\"token punctuation\">.<\/span>name<span class=\"token punctuation\">.<\/span><span class=\"token function\">toLowerCase<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">includes<\/span><span class=\"token punctuation\">(<\/span>filtro<span class=\"token punctuation\">.<\/span><span class=\"token function\">toLowerCase<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n    <span class=\"token keyword\">const<\/span> coincideCategoria <span class=\"token operator\">=<\/span> categoria <span class=\"token operator\">===<\/span> <span class=\"token string\">'todas'<\/span> <span class=\"token operator\">||<\/span> p<span class=\"token punctuation\">.<\/span>category <span class=\"token operator\">===<\/span> categoria<span class=\"token punctuation\">;<\/span>\r\n    <span class=\"token keyword\">return<\/span> coincideTexto <span class=\"token operator\">&amp;&amp;<\/span> coincideCategoria<span class=\"token punctuation\">;<\/span>\r\n  <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n  \r\n  <span class=\"token keyword\">return<\/span> <span class=\"token punctuation\">(<\/span>\r\n    <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<span class=\"token punctuation\">&gt;<\/span><\/span>\r\n      <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div <span class=\"token attr-name\">className<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=<\/span><span class=\"token punctuation\">\"<\/span>filtros<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\r\n        <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>input\r\n          <span class=\"token attr-name\">type<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=<\/span><span class=\"token punctuation\">\"<\/span>text<span class=\"token punctuation\">\"<\/span><\/span>\r\n          <span class=\"token attr-name\">placeholder<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=<\/span><span class=\"token punctuation\">\"<\/span>Buscar productos...<span class=\"token punctuation\">\"<\/span><\/span>\r\n          <span class=\"token attr-name\">value<\/span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=<\/span><span class=\"token punctuation\">{<\/span>filtro<span class=\"token punctuation\">}<\/span><\/span>\r\n          <span class=\"token attr-name\">onChange<\/span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=<\/span><span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">(<\/span><span class=\"token parameter\">e<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">=&gt;<\/span> <span class=\"token function\">setFiltro<\/span><span class=\"token punctuation\">(<\/span>e<span class=\"token punctuation\">.<\/span>target<span class=\"token punctuation\">.<\/span>value<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">}<\/span><\/span>\r\n        <span class=\"token punctuation\">\/&gt;<\/span><\/span>\r\n        <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>select <span class=\"token attr-name\">value<\/span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=<\/span><span class=\"token punctuation\">{<\/span>categoria<span class=\"token punctuation\">}<\/span><\/span> <span class=\"token attr-name\">onChange<\/span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=<\/span><span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">(<\/span><span class=\"token parameter\">e<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">=&gt;<\/span> <span class=\"token function\">setCategoria<\/span><span class=\"token punctuation\">(<\/span>e<span class=\"token punctuation\">.<\/span>target<span class=\"token punctuation\">.<\/span>value<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\r\n          <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>option <span class=\"token attr-name\">value<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=<\/span><span class=\"token punctuation\">\"<\/span>todas<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><span class=\"token plain-text\">Todas las categor\u00edas<\/span><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>option<span class=\"token punctuation\">&gt;<\/span><\/span>\r\n          <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>option <span class=\"token attr-name\">value<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=<\/span><span class=\"token punctuation\">\"<\/span>Calzado<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><span class=\"token plain-text\">Calzado<\/span><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>option<span class=\"token punctuation\">&gt;<\/span><\/span>\r\n          <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>option <span class=\"token attr-name\">value<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=<\/span><span class=\"token punctuation\">\"<\/span>Ropa<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><span class=\"token plain-text\">Ropa<\/span><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>option<span class=\"token punctuation\">&gt;<\/span><\/span>\r\n        <span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>select<span class=\"token punctuation\">&gt;<\/span><\/span>\r\n      <span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<span class=\"token punctuation\">&gt;<\/span><\/span>\r\n      <span class=\"token punctuation\">{<\/span><span class=\"token comment\">\/* Renderizar productosFiltrados en lugar de productos *\/<\/span><span class=\"token punctuation\">}<\/span>\r\n    <span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<span class=\"token punctuation\">&gt;<\/span><\/span>\r\n  <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n<span class=\"token punctuation\">}<\/span><\/pre>\n<\/div>\n<h3><strong>Paginaci\u00f3n de Productos para Mejor Experiencia<\/strong><\/h3>\n<p class=\"ds-markdown-paragraph\">Si tienes muchos productos, la\u00a0<strong>paginaci\u00f3n de productos<\/strong>\u00a0es esencial:<\/p>\n<div class=\"md-code-block md-code-block-light\">\n<div class=\"md-code-block-banner-wrap\">\n<div class=\"md-code-block-banner md-code-block-banner-lite\">\n<div class=\"_121d384\">\n<div class=\"d2a24f03\"><span class=\"d813de27\">jsx<\/span><\/div>\n<\/div>\n<\/div>\n<\/div>\n<pre><span class=\"token keyword\">const<\/span> <span class=\"token punctuation\">[<\/span>paginaActual<span class=\"token punctuation\">,<\/span> setPaginaActual<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">=<\/span> <span class=\"token function\">useState<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n<span class=\"token keyword\">const<\/span> productosPorPagina <span class=\"token operator\">=<\/span> <span class=\"token number\">9<\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n<span class=\"token keyword\">const<\/span> indiceInicio <span class=\"token operator\">=<\/span> <span class=\"token punctuation\">(<\/span>paginaActual <span class=\"token operator\">-<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">*<\/span> productosPorPagina<span class=\"token punctuation\">;<\/span>\r\n<span class=\"token keyword\">const<\/span> indiceFin <span class=\"token operator\">=<\/span> indiceInicio <span class=\"token operator\">+<\/span> productosPorPagina<span class=\"token punctuation\">;<\/span>\r\n<span class=\"token keyword\">const<\/span> productosPagina <span class=\"token operator\">=<\/span> productosFiltrados<span class=\"token punctuation\">.<\/span><span class=\"token function\">slice<\/span><span class=\"token punctuation\">(<\/span>indiceInicio<span class=\"token punctuation\">,<\/span> indiceFin<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n<span class=\"token comment\">\/\/ Renderizar productosPagina en lugar de todos<\/span><\/pre>\n<\/div>\n<p class=\"ds-markdown-paragraph\">Con esto, tu cat\u00e1logo ya es funcional y profesional.<\/p>\n<h2><strong>El Coraz\u00f3n del Ecommerce: Implementando el Carrito de Compras<\/strong><\/h2>\n<h3><strong>\u00bfPor Qu\u00e9 Necesitas un Estado Global?<\/strong><\/h3>\n<p class=\"ds-markdown-paragraph\">Imagina que a\u00f1ades un producto al carrito desde la p\u00e1gina de cat\u00e1logo, y necesitas que el icono del carrito en el navbar se actualice instant\u00e1neamente. Los componentes no conectados no pueden comunicarse directamente. Ah\u00ed entra la\u00a0<strong>gesti\u00f3n de estado (Redux\/Context)<\/strong>.<\/p>\n<p class=\"ds-markdown-paragraph\">Para nuestra tienda, usaremos Context API de React &#8211; es perfecta para proyectos de tama\u00f1o medio y m\u00e1s f\u00e1cil de aprender para comenzar.<\/p>\n<h3><strong>Creando el Contexto del Carrito (CartContext)<\/strong><\/h3>\n<p class=\"ds-markdown-paragraph\">Crea\u00a0<code>src\/context\/CartContext.js<\/code>:<\/p>\n<div class=\"md-code-block md-code-block-light\">\n<div class=\"md-code-block-banner-wrap\">\n<div class=\"md-code-block-banner md-code-block-banner-lite\">\n<div class=\"_121d384\">\n<div class=\"d2a24f03\"><span class=\"d813de27\">jsx<\/span><\/div>\n<\/div>\n<\/div>\n<\/div>\n<pre><span class=\"token keyword\">import<\/span> <span class=\"token punctuation\">{<\/span> createContext<span class=\"token punctuation\">,<\/span> useState<span class=\"token punctuation\">,<\/span> useContext <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">from<\/span> <span class=\"token string\">'react'<\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n<span class=\"token keyword\">const<\/span> CartContext <span class=\"token operator\">=<\/span> <span class=\"token function\">createContext<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n<span class=\"token keyword\">export<\/span> <span class=\"token keyword\">function<\/span> <span class=\"token function\">CartProvider<\/span><span class=\"token punctuation\">(<\/span><span class=\"token parameter\"><span class=\"token punctuation\">{<\/span> children <span class=\"token punctuation\">}<\/span><\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>\r\n  <span class=\"token keyword\">const<\/span> <span class=\"token punctuation\">[<\/span>cart<span class=\"token punctuation\">,<\/span> setCart<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">=<\/span> <span class=\"token function\">useState<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n  \r\n  <span class=\"token keyword\">const<\/span> <span class=\"token function-variable function\">addToCart<\/span> <span class=\"token operator\">=<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token parameter\">producto<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">=&gt;<\/span> <span class=\"token punctuation\">{<\/span>\r\n    <span class=\"token function\">setCart<\/span><span class=\"token punctuation\">(<\/span><span class=\"token parameter\">currentCart<\/span> <span class=\"token operator\">=&gt;<\/span> <span class=\"token punctuation\">{<\/span>\r\n      <span class=\"token keyword\">const<\/span> existe <span class=\"token operator\">=<\/span> currentCart<span class=\"token punctuation\">.<\/span><span class=\"token function\">find<\/span><span class=\"token punctuation\">(<\/span><span class=\"token parameter\">item<\/span> <span class=\"token operator\">=&gt;<\/span> item<span class=\"token punctuation\">.<\/span>id <span class=\"token operator\">===<\/span> producto<span class=\"token punctuation\">.<\/span>id<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n      <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>existe<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>\r\n        <span class=\"token keyword\">return<\/span> currentCart<span class=\"token punctuation\">.<\/span><span class=\"token function\">map<\/span><span class=\"token punctuation\">(<\/span><span class=\"token parameter\">item<\/span> <span class=\"token operator\">=&gt;<\/span>\r\n          item<span class=\"token punctuation\">.<\/span>id <span class=\"token operator\">===<\/span> producto<span class=\"token punctuation\">.<\/span>id\r\n            <span class=\"token operator\">?<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token operator\">...<\/span>item<span class=\"token punctuation\">,<\/span> <span class=\"token literal-property property\">cantidad<\/span><span class=\"token operator\">:<\/span> item<span class=\"token punctuation\">.<\/span>cantidad <span class=\"token operator\">+<\/span> <span class=\"token number\">1<\/span> <span class=\"token punctuation\">}<\/span>\r\n            <span class=\"token operator\">:<\/span> item\r\n        <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n      <span class=\"token punctuation\">}<\/span>\r\n      <span class=\"token keyword\">return<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token operator\">...<\/span>currentCart<span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token operator\">...<\/span>producto<span class=\"token punctuation\">,<\/span> <span class=\"token literal-property property\">cantidad<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">1<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span>\r\n    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n  <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span>\r\n  \r\n  <span class=\"token keyword\">const<\/span> <span class=\"token function-variable function\">removeFromCart<\/span> <span class=\"token operator\">=<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token parameter\">id<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">=&gt;<\/span> <span class=\"token punctuation\">{<\/span>\r\n    <span class=\"token function\">setCart<\/span><span class=\"token punctuation\">(<\/span><span class=\"token parameter\">currentCart<\/span> <span class=\"token operator\">=&gt;<\/span> currentCart<span class=\"token punctuation\">.<\/span><span class=\"token function\">filter<\/span><span class=\"token punctuation\">(<\/span><span class=\"token parameter\">item<\/span> <span class=\"token operator\">=&gt;<\/span> item<span class=\"token punctuation\">.<\/span>id <span class=\"token operator\">!==<\/span> id<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n  <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span>\r\n  \r\n  <span class=\"token keyword\">const<\/span> <span class=\"token function-variable function\">updateQuantity<\/span> <span class=\"token operator\">=<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token parameter\">id<span class=\"token punctuation\">,<\/span> cantidad<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">=&gt;<\/span> <span class=\"token punctuation\">{<\/span>\r\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>cantidad <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>\r\n      <span class=\"token function\">removeFromCart<\/span><span class=\"token punctuation\">(<\/span>id<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n      <span class=\"token keyword\">return<\/span><span class=\"token punctuation\">;<\/span>\r\n    <span class=\"token punctuation\">}<\/span>\r\n    <span class=\"token function\">setCart<\/span><span class=\"token punctuation\">(<\/span><span class=\"token parameter\">currentCart<\/span> <span class=\"token operator\">=&gt;<\/span>\r\n      currentCart<span class=\"token punctuation\">.<\/span><span class=\"token function\">map<\/span><span class=\"token punctuation\">(<\/span><span class=\"token parameter\">item<\/span> <span class=\"token operator\">=&gt;<\/span>\r\n        item<span class=\"token punctuation\">.<\/span>id <span class=\"token operator\">===<\/span> id <span class=\"token operator\">?<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token operator\">...<\/span>item<span class=\"token punctuation\">,<\/span> cantidad <span class=\"token punctuation\">}<\/span> <span class=\"token operator\">:<\/span> item\r\n      <span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n  <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span>\r\n  \r\n  <span class=\"token keyword\">const<\/span> total <span class=\"token operator\">=<\/span> cart<span class=\"token punctuation\">.<\/span><span class=\"token function\">reduce<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span><span class=\"token parameter\">sum<span class=\"token punctuation\">,<\/span> item<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">=&gt;<\/span> sum <span class=\"token operator\">+<\/span> <span class=\"token punctuation\">(<\/span>item<span class=\"token punctuation\">.<\/span>price <span class=\"token operator\">*<\/span> item<span class=\"token punctuation\">.<\/span>cantidad<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n  \r\n  <span class=\"token keyword\">return<\/span> <span class=\"token punctuation\">(<\/span>\r\n    <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span><span class=\"token class-name\">CartContext.Provider<\/span> <span class=\"token attr-name\">value<\/span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=<\/span><span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">{<\/span>\r\n      cart<span class=\"token punctuation\">,<\/span>\r\n      addToCart<span class=\"token punctuation\">,<\/span>\r\n      removeFromCart<span class=\"token punctuation\">,<\/span>\r\n      updateQuantity<span class=\"token punctuation\">,<\/span>\r\n      total<span class=\"token punctuation\">,<\/span>\r\n      <span class=\"token literal-property property\">itemCount<\/span><span class=\"token operator\">:<\/span> cart<span class=\"token punctuation\">.<\/span><span class=\"token function\">reduce<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span><span class=\"token parameter\">sum<span class=\"token punctuation\">,<\/span> item<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">=&gt;<\/span> sum <span class=\"token operator\">+<\/span> item<span class=\"token punctuation\">.<\/span>cantidad<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\r\n      <span class=\"token punctuation\">{<\/span>children<span class=\"token punctuation\">}<\/span>\r\n    <span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span><span class=\"token class-name\">CartContext.Provider<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\r\n  <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n<span class=\"token punctuation\">}<\/span>\r\n\r\n<span class=\"token keyword\">export<\/span> <span class=\"token keyword\">const<\/span> <span class=\"token function-variable function\">useCart<\/span> <span class=\"token operator\">=<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">=&gt;<\/span> <span class=\"token function\">useContext<\/span><span class=\"token punctuation\">(<\/span>CartContext<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/pre>\n<\/div>\n<p class=\"ds-markdown-paragraph\">\u00a1Este\u00a0<strong>contexto de React (Context API)<\/strong>\u00a0es el cerebro de tu\u00a0<strong>carrito de compras React<\/strong>! Maneja toda la l\u00f3gica de a\u00f1adir, eliminar y actualizar cantidades.<\/p>\n<h3><strong>Componente CartWidget: Tu Indicador del Carrito<\/strong><\/h3>\n<p class=\"ds-markdown-paragraph\">Crea un componente peque\u00f1o para mostrar el n\u00famero de items en el carrito:<\/p>\n<div class=\"md-code-block md-code-block-light\">\n<div class=\"md-code-block-banner-wrap\">\n<div class=\"md-code-block-banner md-code-block-banner-lite\">\n<div class=\"_121d384\">\n<div class=\"d2a24f03\"><span class=\"d813de27\">jsx<\/span><\/div>\n<\/div>\n<\/div>\n<\/div>\n<pre><span class=\"token keyword\">import<\/span> <span class=\"token punctuation\">{<\/span> useCart <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">from<\/span> <span class=\"token string\">'..\/context\/CartContext'<\/span><span class=\"token punctuation\">;<\/span>\r\n<span class=\"token keyword\">import<\/span> <span class=\"token punctuation\">{<\/span> Link <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">from<\/span> <span class=\"token string\">'react-router-dom'<\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n<span class=\"token keyword\">function<\/span> <span class=\"token function\">CartWidget<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>\r\n  <span class=\"token keyword\">const<\/span> <span class=\"token punctuation\">{<\/span> itemCount <span class=\"token punctuation\">}<\/span> <span class=\"token operator\">=<\/span> <span class=\"token function\">useCart<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n  \r\n  <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>itemCount <span class=\"token operator\">===<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">return<\/span> <span class=\"token keyword\">null<\/span><span class=\"token punctuation\">;<\/span>\r\n  \r\n  <span class=\"token keyword\">return<\/span> <span class=\"token punctuation\">(<\/span>\r\n    <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span><span class=\"token class-name\">Link<\/span> <span class=\"token attr-name\">to<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=<\/span><span class=\"token punctuation\">\"<\/span>\/cart<span class=\"token punctuation\">\"<\/span><\/span> <span class=\"token attr-name\">className<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=<\/span><span class=\"token punctuation\">\"<\/span>cart-widget<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><span class=\"token plain-text\">\r\n      \ud83d\uded2\r\n      <\/span><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>span <span class=\"token attr-name\">className<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=<\/span><span class=\"token punctuation\">\"<\/span>cart-count<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><span class=\"token punctuation\">{<\/span>itemCount<span class=\"token punctuation\">}<\/span><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>span<span class=\"token punctuation\">&gt;<\/span><\/span>\r\n    <span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span><span class=\"token class-name\">Link<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\r\n  <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n<span class=\"token punctuation\">}<\/span><\/pre>\n<\/div>\n<p class=\"ds-markdown-paragraph\">A\u00f1\u00e1delo a tu navbar y ver\u00e1s c\u00f3mo se actualiza m\u00e1gicamente cuando a\u00f1ades productos.<\/p>\n<h3><strong>P\u00e1gina del Carrito: Ver y Gestionar Tu Selecci\u00f3n<\/strong><\/h3>\n<p class=\"ds-markdown-paragraph\">Crea\u00a0<code>src\/pages\/Cart.js<\/code>:<\/p>\n<div class=\"md-code-block md-code-block-light\">\n<div class=\"md-code-block-banner-wrap\">\n<div class=\"md-code-block-banner md-code-block-banner-lite\">\n<div class=\"_121d384\">\n<div class=\"d2a24f03\"><span class=\"d813de27\">jsx<\/span><\/div>\n<\/div>\n<\/div>\n<\/div>\n<pre><span class=\"token keyword\">import<\/span> <span class=\"token punctuation\">{<\/span> useCart <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">from<\/span> <span class=\"token string\">'..\/context\/CartContext'<\/span><span class=\"token punctuation\">;<\/span>\r\n<span class=\"token keyword\">import<\/span> <span class=\"token punctuation\">{<\/span> Link <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">from<\/span> <span class=\"token string\">'react-router-dom'<\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n<span class=\"token keyword\">function<\/span> <span class=\"token function\">Cart<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>\r\n  <span class=\"token keyword\">const<\/span> <span class=\"token punctuation\">{<\/span> cart<span class=\"token punctuation\">,<\/span> removeFromCart<span class=\"token punctuation\">,<\/span> updateQuantity<span class=\"token punctuation\">,<\/span> total <span class=\"token punctuation\">}<\/span> <span class=\"token operator\">=<\/span> <span class=\"token function\">useCart<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n  \r\n  <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>cart<span class=\"token punctuation\">.<\/span>length <span class=\"token operator\">===<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>\r\n    <span class=\"token keyword\">return<\/span> <span class=\"token punctuation\">(<\/span>\r\n      <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div <span class=\"token attr-name\">className<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=<\/span><span class=\"token punctuation\">\"<\/span>cart-empty<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\r\n        <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>h2<span class=\"token punctuation\">&gt;<\/span><\/span><span class=\"token plain-text\">Tu carrito est\u00e1 vac\u00edo<\/span><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>h2<span class=\"token punctuation\">&gt;<\/span><\/span>\r\n        <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span><span class=\"token class-name\">Link<\/span> <span class=\"token attr-name\">to<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=<\/span><span class=\"token punctuation\">\"<\/span>\/<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><span class=\"token plain-text\">Volver a comprar<\/span><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span><span class=\"token class-name\">Link<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\r\n      <span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<span class=\"token punctuation\">&gt;<\/span><\/span>\r\n    <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n  <span class=\"token punctuation\">}<\/span>\r\n  \r\n  <span class=\"token keyword\">return<\/span> <span class=\"token punctuation\">(<\/span>\r\n    <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div <span class=\"token attr-name\">className<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=<\/span><span class=\"token punctuation\">\"<\/span>cart-page<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\r\n      <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>h2<span class=\"token punctuation\">&gt;<\/span><\/span><span class=\"token plain-text\">Tu Carrito de Compras<\/span><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>h2<span class=\"token punctuation\">&gt;<\/span><\/span>\r\n      <span class=\"token punctuation\">{<\/span>cart<span class=\"token punctuation\">.<\/span><span class=\"token function\">map<\/span><span class=\"token punctuation\">(<\/span><span class=\"token parameter\">item<\/span> <span class=\"token operator\">=&gt;<\/span> <span class=\"token punctuation\">(<\/span>\r\n        <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div <span class=\"token attr-name\">key<\/span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=<\/span><span class=\"token punctuation\">{<\/span>item<span class=\"token punctuation\">.<\/span>id<span class=\"token punctuation\">}<\/span><\/span> <span class=\"token attr-name\">className<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=<\/span><span class=\"token punctuation\">\"<\/span>cart-item<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\r\n          <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>img <span class=\"token attr-name\">src<\/span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=<\/span><span class=\"token punctuation\">{<\/span>item<span class=\"token punctuation\">.<\/span>image<span class=\"token punctuation\">}<\/span><\/span> <span class=\"token attr-name\">alt<\/span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=<\/span><span class=\"token punctuation\">{<\/span>item<span class=\"token punctuation\">.<\/span>name<span class=\"token punctuation\">}<\/span><\/span> <span class=\"token punctuation\">\/&gt;<\/span><\/span>\r\n          <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<span class=\"token punctuation\">&gt;<\/span><\/span>\r\n            <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>h3<span class=\"token punctuation\">&gt;<\/span><\/span><span class=\"token punctuation\">{<\/span>item<span class=\"token punctuation\">.<\/span>name<span class=\"token punctuation\">}<\/span><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>h3<span class=\"token punctuation\">&gt;<\/span><\/span>\r\n            <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>p<span class=\"token punctuation\">&gt;<\/span><\/span><span class=\"token plain-text\">$<\/span><span class=\"token punctuation\">{<\/span>item<span class=\"token punctuation\">.<\/span>price<span class=\"token punctuation\">.<\/span><span class=\"token function\">toFixed<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">}<\/span><span class=\"token plain-text\"> c\/u<\/span><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>p<span class=\"token punctuation\">&gt;<\/span><\/span>\r\n            <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div <span class=\"token attr-name\">className<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=<\/span><span class=\"token punctuation\">\"<\/span>quantity-controls<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\r\n              <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>button <span class=\"token attr-name\">onClick<\/span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=<\/span><span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">=&gt;<\/span> <span class=\"token function\">updateQuantity<\/span><span class=\"token punctuation\">(<\/span>item<span class=\"token punctuation\">.<\/span>id<span class=\"token punctuation\">,<\/span> item<span class=\"token punctuation\">.<\/span>cantidad <span class=\"token operator\">-<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><span class=\"token plain-text\">\r\n                -\r\n              <\/span><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>button<span class=\"token punctuation\">&gt;<\/span><\/span>\r\n              <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>span<span class=\"token punctuation\">&gt;<\/span><\/span><span class=\"token punctuation\">{<\/span>item<span class=\"token punctuation\">.<\/span>cantidad<span class=\"token punctuation\">}<\/span><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>span<span class=\"token punctuation\">&gt;<\/span><\/span>\r\n              <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>button <span class=\"token attr-name\">onClick<\/span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=<\/span><span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">=&gt;<\/span> <span class=\"token function\">updateQuantity<\/span><span class=\"token punctuation\">(<\/span>item<span class=\"token punctuation\">.<\/span>id<span class=\"token punctuation\">,<\/span> item<span class=\"token punctuation\">.<\/span>cantidad <span class=\"token operator\">+<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><span class=\"token plain-text\">\r\n                +\r\n              <\/span><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>button<span class=\"token punctuation\">&gt;<\/span><\/span>\r\n            <span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<span class=\"token punctuation\">&gt;<\/span><\/span>\r\n            <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>button <span class=\"token attr-name\">onClick<\/span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=<\/span><span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">=&gt;<\/span> <span class=\"token function\">removeFromCart<\/span><span class=\"token punctuation\">(<\/span>item<span class=\"token punctuation\">.<\/span>id<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">}<\/span><\/span> <span class=\"token attr-name\">className<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=<\/span><span class=\"token punctuation\">\"<\/span>remove<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><span class=\"token plain-text\">\r\n              Eliminar\r\n            <\/span><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>button<span class=\"token punctuation\">&gt;<\/span><\/span>\r\n          <span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<span class=\"token punctuation\">&gt;<\/span><\/span>\r\n          <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>p <span class=\"token attr-name\">className<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=<\/span><span class=\"token punctuation\">\"<\/span>item-total<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><span class=\"token plain-text\">\r\n            $<\/span><span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">(<\/span>item<span class=\"token punctuation\">.<\/span>price <span class=\"token operator\">*<\/span> item<span class=\"token punctuation\">.<\/span>cantidad<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">toFixed<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">}<\/span>\r\n          <span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>p<span class=\"token punctuation\">&gt;<\/span><\/span>\r\n        <span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<span class=\"token punctuation\">&gt;<\/span><\/span>\r\n      <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">}<\/span>\r\n      <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div <span class=\"token attr-name\">className<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=<\/span><span class=\"token punctuation\">\"<\/span>cart-summary<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\r\n        <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>h3<span class=\"token punctuation\">&gt;<\/span><\/span><span class=\"token plain-text\">Total: $<\/span><span class=\"token punctuation\">{<\/span>total<span class=\"token punctuation\">.<\/span><span class=\"token function\">toFixed<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">}<\/span><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>h3<span class=\"token punctuation\">&gt;<\/span><\/span>\r\n        <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span><span class=\"token class-name\">Link<\/span> <span class=\"token attr-name\">to<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=<\/span><span class=\"token punctuation\">\"<\/span>\/checkout<span class=\"token punctuation\">\"<\/span><\/span> <span class=\"token attr-name\">className<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=<\/span><span class=\"token punctuation\">\"<\/span>checkout-button<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><span class=\"token plain-text\">\r\n          Proceder al Pago\r\n        <\/span><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span><span class=\"token class-name\">Link<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\r\n      <span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<span class=\"token punctuation\">&gt;<\/span><\/span>\r\n    <span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<span class=\"token punctuation\">&gt;<\/span><\/span>\r\n  <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n<span class=\"token punctuation\">}<\/span><\/pre>\n<\/div>\n<p class=\"ds-markdown-paragraph\">\u00a1Felicidades! Ya has implementado un\u00a0<strong>carrito de compras en React.js paso a paso<\/strong>\u00a0completamente funcional. Este es quiz\u00e1s el componente m\u00e1s importante de cualquier\u00a0<strong>aplicaci\u00f3n de comercio electr\u00f3nico<\/strong>.<\/p>\n<h2><strong>Del Carrito a la Compra: Checkout y Autenticaci\u00f3n<\/strong><\/h2>\n<h3><strong>Creando el Formulario de Checkout<\/strong><\/h3>\n<p class=\"ds-markdown-paragraph\">El proceso de pago debe ser sencillo y seguro. Crea\u00a0<code>src\/pages\/Checkout.js<\/code>:<\/p>\n<div class=\"md-code-block md-code-block-light\">\n<div class=\"md-code-block-banner-wrap\">\n<div class=\"md-code-block-banner md-code-block-banner-lite\">\n<div class=\"_121d384\">\n<div class=\"d2a24f03\"><span class=\"d813de27\">jsx<\/span><\/div>\n<\/div>\n<\/div>\n<\/div>\n<pre><span class=\"token keyword\">import<\/span> <span class=\"token punctuation\">{<\/span> useState <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">from<\/span> <span class=\"token string\">'react'<\/span><span class=\"token punctuation\">;<\/span>\r\n<span class=\"token keyword\">import<\/span> <span class=\"token punctuation\">{<\/span> useCart <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">from<\/span> <span class=\"token string\">'..\/context\/CartContext'<\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n<span class=\"token keyword\">function<\/span> <span class=\"token function\">Checkout<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>\r\n  <span class=\"token keyword\">const<\/span> <span class=\"token punctuation\">{<\/span> cart<span class=\"token punctuation\">,<\/span> total <span class=\"token punctuation\">}<\/span> <span class=\"token operator\">=<\/span> <span class=\"token function\">useCart<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n  <span class=\"token keyword\">const<\/span> <span class=\"token punctuation\">[<\/span>formData<span class=\"token punctuation\">,<\/span> setFormData<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">=<\/span> <span class=\"token function\">useState<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span>\r\n    <span class=\"token literal-property property\">nombre<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">''<\/span><span class=\"token punctuation\">,<\/span>\r\n    <span class=\"token literal-property property\">email<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">''<\/span><span class=\"token punctuation\">,<\/span>\r\n    <span class=\"token literal-property property\">direccion<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">''<\/span><span class=\"token punctuation\">,<\/span>\r\n    <span class=\"token literal-property property\">ciudad<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">''<\/span><span class=\"token punctuation\">,<\/span>\r\n    <span class=\"token literal-property property\">tarjeta<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">''<\/span>\r\n  <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n  \r\n  <span class=\"token keyword\">const<\/span> <span class=\"token function-variable function\">handleChange<\/span> <span class=\"token operator\">=<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token parameter\">e<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">=&gt;<\/span> <span class=\"token punctuation\">{<\/span>\r\n    <span class=\"token function\">setFormData<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span>\r\n      <span class=\"token operator\">...<\/span>formData<span class=\"token punctuation\">,<\/span>\r\n      <span class=\"token punctuation\">[<\/span>e<span class=\"token punctuation\">.<\/span>target<span class=\"token punctuation\">.<\/span>name<span class=\"token punctuation\">]<\/span><span class=\"token operator\">:<\/span> e<span class=\"token punctuation\">.<\/span>target<span class=\"token punctuation\">.<\/span>value\r\n    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n  <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span>\r\n  \r\n  <span class=\"token keyword\">const<\/span> <span class=\"token function-variable function\">handleSubmit<\/span> <span class=\"token operator\">=<\/span> <span class=\"token keyword\">async<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token parameter\">e<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">=&gt;<\/span> <span class=\"token punctuation\">{<\/span>\r\n    e<span class=\"token punctuation\">.<\/span><span class=\"token function\">preventDefault<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n    <span class=\"token comment\">\/\/ Validaci\u00f3n b\u00e1sica<\/span>\r\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>formData<span class=\"token punctuation\">.<\/span>nombre <span class=\"token operator\">||<\/span> <span class=\"token operator\">!<\/span>formData<span class=\"token punctuation\">.<\/span>email<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>\r\n      <span class=\"token function\">alert<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">'Por favor completa todos los campos'<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n      <span class=\"token keyword\">return<\/span><span class=\"token punctuation\">;<\/span>\r\n    <span class=\"token punctuation\">}<\/span>\r\n    \r\n    <span class=\"token comment\">\/\/ Aqu\u00ed procesar\u00edamos el pago<\/span>\r\n    console<span class=\"token punctuation\">.<\/span><span class=\"token function\">log<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">'Procesando pedido:'<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">{<\/span> formData<span class=\"token punctuation\">,<\/span> cart<span class=\"token punctuation\">,<\/span> total <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n    <span class=\"token function\">alert<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">'\u00a1Pedido completado con \u00e9xito! (simulaci\u00f3n)'<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n  <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span>\r\n  \r\n  <span class=\"token keyword\">return<\/span> <span class=\"token punctuation\">(<\/span>\r\n    <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div <span class=\"token attr-name\">className<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=<\/span><span class=\"token punctuation\">\"<\/span>checkout-page<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\r\n      <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>h2<span class=\"token punctuation\">&gt;<\/span><\/span><span class=\"token plain-text\">Finalizar Compra<\/span><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>h2<span class=\"token punctuation\">&gt;<\/span><\/span>\r\n      <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div <span class=\"token attr-name\">className<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=<\/span><span class=\"token punctuation\">\"<\/span>checkout-container<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\r\n        <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>form <span class=\"token attr-name\">onSubmit<\/span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=<\/span><span class=\"token punctuation\">{<\/span>handleSubmit<span class=\"token punctuation\">}<\/span><\/span> <span class=\"token attr-name\">className<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=<\/span><span class=\"token punctuation\">\"<\/span>checkout-form<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\r\n          <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>h3<span class=\"token punctuation\">&gt;<\/span><\/span><span class=\"token plain-text\">Informaci\u00f3n de Env\u00edo<\/span><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>h3<span class=\"token punctuation\">&gt;<\/span><\/span>\r\n          <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>input\r\n            <span class=\"token attr-name\">name<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=<\/span><span class=\"token punctuation\">\"<\/span>nombre<span class=\"token punctuation\">\"<\/span><\/span>\r\n            <span class=\"token attr-name\">placeholder<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=<\/span><span class=\"token punctuation\">\"<\/span>Nombre completo<span class=\"token punctuation\">\"<\/span><\/span>\r\n            <span class=\"token attr-name\">value<\/span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=<\/span><span class=\"token punctuation\">{<\/span>formData<span class=\"token punctuation\">.<\/span>nombre<span class=\"token punctuation\">}<\/span><\/span>\r\n            <span class=\"token attr-name\">onChange<\/span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=<\/span><span class=\"token punctuation\">{<\/span>handleChange<span class=\"token punctuation\">}<\/span><\/span>\r\n            <span class=\"token attr-name\">required<\/span>\r\n          <span class=\"token punctuation\">\/&gt;<\/span><\/span>\r\n          <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>input\r\n            <span class=\"token attr-name\">name<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=<\/span><span class=\"token punctuation\">\"<\/span>email<span class=\"token punctuation\">\"<\/span><\/span>\r\n            <span class=\"token attr-name\">type<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=<\/span><span class=\"token punctuation\">\"<\/span>email<span class=\"token punctuation\">\"<\/span><\/span>\r\n            <span class=\"token attr-name\">placeholder<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=<\/span><span class=\"token punctuation\">\"<\/span>Email<span class=\"token punctuation\">\"<\/span><\/span>\r\n            <span class=\"token attr-name\">value<\/span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=<\/span><span class=\"token punctuation\">{<\/span>formData<span class=\"token punctuation\">.<\/span>email<span class=\"token punctuation\">}<\/span><\/span>\r\n            <span class=\"token attr-name\">onChange<\/span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=<\/span><span class=\"token punctuation\">{<\/span>handleChange<span class=\"token punctuation\">}<\/span><\/span>\r\n            <span class=\"token attr-name\">required<\/span>\r\n          <span class=\"token punctuation\">\/&gt;<\/span><\/span>\r\n          <span class=\"token punctuation\">{<\/span><span class=\"token comment\">\/* M\u00e1s campos aqu\u00ed *\/<\/span><span class=\"token punctuation\">}<\/span>\r\n          \r\n          <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>h3<span class=\"token punctuation\">&gt;<\/span><\/span><span class=\"token plain-text\">M\u00e9todo de Pago<\/span><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>h3<span class=\"token punctuation\">&gt;<\/span><\/span>\r\n          <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>input\r\n            <span class=\"token attr-name\">name<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=<\/span><span class=\"token punctuation\">\"<\/span>tarjeta<span class=\"token punctuation\">\"<\/span><\/span>\r\n            <span class=\"token attr-name\">placeholder<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=<\/span><span class=\"token punctuation\">\"<\/span>N\u00famero de tarjeta<span class=\"token punctuation\">\"<\/span><\/span>\r\n            <span class=\"token attr-name\">value<\/span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=<\/span><span class=\"token punctuation\">{<\/span>formData<span class=\"token punctuation\">.<\/span>tarjeta<span class=\"token punctuation\">}<\/span><\/span>\r\n            <span class=\"token attr-name\">onChange<\/span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=<\/span><span class=\"token punctuation\">{<\/span>handleChange<span class=\"token punctuation\">}<\/span><\/span>\r\n          <span class=\"token punctuation\">\/&gt;<\/span><\/span>\r\n          \r\n          <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>button <span class=\"token attr-name\">type<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=<\/span><span class=\"token punctuation\">\"<\/span>submit<span class=\"token punctuation\">\"<\/span><\/span> <span class=\"token attr-name\">className<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=<\/span><span class=\"token punctuation\">\"<\/span>submit-order<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><span class=\"token plain-text\">\r\n            Pagar $<\/span><span class=\"token punctuation\">{<\/span>total<span class=\"token punctuation\">.<\/span><span class=\"token function\">toFixed<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">}<\/span>\r\n          <span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>button<span class=\"token punctuation\">&gt;<\/span><\/span>\r\n        <span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>form<span class=\"token punctuation\">&gt;<\/span><\/span>\r\n        \r\n        <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div <span class=\"token attr-name\">className<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=<\/span><span class=\"token punctuation\">\"<\/span>order-summary<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\r\n          <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>h3<span class=\"token punctuation\">&gt;<\/span><\/span><span class=\"token plain-text\">Resumen del Pedido<\/span><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>h3<span class=\"token punctuation\">&gt;<\/span><\/span>\r\n          <span class=\"token punctuation\">{<\/span>cart<span class=\"token punctuation\">.<\/span><span class=\"token function\">map<\/span><span class=\"token punctuation\">(<\/span><span class=\"token parameter\">item<\/span> <span class=\"token operator\">=&gt;<\/span> <span class=\"token punctuation\">(<\/span>\r\n            <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div <span class=\"token attr-name\">key<\/span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=<\/span><span class=\"token punctuation\">{<\/span>item<span class=\"token punctuation\">.<\/span>id<span class=\"token punctuation\">}<\/span><\/span> <span class=\"token attr-name\">className<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=<\/span><span class=\"token punctuation\">\"<\/span>order-item<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\r\n              <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>span<span class=\"token punctuation\">&gt;<\/span><\/span><span class=\"token punctuation\">{<\/span>item<span class=\"token punctuation\">.<\/span>name<span class=\"token punctuation\">}<\/span><span class=\"token plain-text\"> x <\/span><span class=\"token punctuation\">{<\/span>item<span class=\"token punctuation\">.<\/span>cantidad<span class=\"token punctuation\">}<\/span><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>span<span class=\"token punctuation\">&gt;<\/span><\/span>\r\n              <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>span<span class=\"token punctuation\">&gt;<\/span><\/span><span class=\"token plain-text\">$<\/span><span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">(<\/span>item<span class=\"token punctuation\">.<\/span>price <span class=\"token operator\">*<\/span> item<span class=\"token punctuation\">.<\/span>cantidad<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">toFixed<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">}<\/span><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>span<span class=\"token punctuation\">&gt;<\/span><\/span>\r\n            <span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<span class=\"token punctuation\">&gt;<\/span><\/span>\r\n          <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">}<\/span>\r\n          <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div <span class=\"token attr-name\">className<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=<\/span><span class=\"token punctuation\">\"<\/span>order-total<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\r\n            <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>strong<span class=\"token punctuation\">&gt;<\/span><\/span><span class=\"token plain-text\">Total:<\/span><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>strong<span class=\"token punctuation\">&gt;<\/span><\/span>\r\n            <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>strong<span class=\"token punctuation\">&gt;<\/span><\/span><span class=\"token plain-text\">$<\/span><span class=\"token punctuation\">{<\/span>total<span class=\"token punctuation\">.<\/span><span class=\"token function\">toFixed<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">}<\/span><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>strong<span class=\"token punctuation\">&gt;<\/span><\/span>\r\n          <span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<span class=\"token punctuation\">&gt;<\/span><\/span>\r\n        <span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<span class=\"token punctuation\">&gt;<\/span><\/span>\r\n      <span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<span class=\"token punctuation\">&gt;<\/span><\/span>\r\n    <span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<span class=\"token punctuation\">&gt;<\/span><\/span>\r\n  <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n<span class=\"token punctuation\">}<\/span><\/pre>\n<\/div>\n<h3><strong>Implementando Autenticaci\u00f3n B\u00e1sica<\/strong><\/h3>\n<p class=\"ds-markdown-paragraph\">Para guardar el historial de pedidos, necesitamos\u00a0<strong>autenticaci\u00f3n de usuarios<\/strong>. Creemos un contexto simple:<\/p>\n<div class=\"md-code-block md-code-block-light\">\n<div class=\"md-code-block-banner-wrap\">\n<div class=\"md-code-block-banner md-code-block-banner-lite\">\n<div class=\"_121d384\">\n<div class=\"d2a24f03\"><span class=\"d813de27\">jsx<\/span><\/div>\n<\/div>\n<\/div>\n<\/div>\n<pre><span class=\"token comment\">\/\/ src\/context\/AuthContext.js<\/span>\r\n<span class=\"token keyword\">import<\/span> <span class=\"token punctuation\">{<\/span> createContext<span class=\"token punctuation\">,<\/span> useState<span class=\"token punctuation\">,<\/span> useContext <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">from<\/span> <span class=\"token string\">'react'<\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n<span class=\"token keyword\">const<\/span> AuthContext <span class=\"token operator\">=<\/span> <span class=\"token function\">createContext<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n<span class=\"token keyword\">export<\/span> <span class=\"token keyword\">function<\/span> <span class=\"token function\">AuthProvider<\/span><span class=\"token punctuation\">(<\/span><span class=\"token parameter\"><span class=\"token punctuation\">{<\/span> children <span class=\"token punctuation\">}<\/span><\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>\r\n  <span class=\"token keyword\">const<\/span> <span class=\"token punctuation\">[<\/span>user<span class=\"token punctuation\">,<\/span> setUser<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">=<\/span> <span class=\"token function\">useState<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">null<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n  \r\n  <span class=\"token keyword\">const<\/span> <span class=\"token function-variable function\">login<\/span> <span class=\"token operator\">=<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token parameter\">email<span class=\"token punctuation\">,<\/span> password<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">=&gt;<\/span> <span class=\"token punctuation\">{<\/span>\r\n    <span class=\"token comment\">\/\/ Simulaci\u00f3n - en realidad validar\u00edas con backend<\/span>\r\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>email <span class=\"token operator\">&amp;&amp;<\/span> password<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>\r\n      <span class=\"token function\">setUser<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span> email<span class=\"token punctuation\">,<\/span> <span class=\"token literal-property property\">name<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">'Usuario Demo'<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n      <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">true<\/span><span class=\"token punctuation\">;<\/span>\r\n    <span class=\"token punctuation\">}<\/span>\r\n    <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">;<\/span>\r\n  <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span>\r\n  \r\n  <span class=\"token keyword\">const<\/span> <span class=\"token function-variable function\">logout<\/span> <span class=\"token operator\">=<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">=&gt;<\/span> <span class=\"token punctuation\">{<\/span>\r\n    <span class=\"token function\">setUser<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">null<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n  <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span>\r\n  \r\n  <span class=\"token keyword\">return<\/span> <span class=\"token punctuation\">(<\/span>\r\n    <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span><span class=\"token class-name\">AuthContext.Provider<\/span> <span class=\"token attr-name\">value<\/span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=<\/span><span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">{<\/span> user<span class=\"token punctuation\">,<\/span> login<span class=\"token punctuation\">,<\/span> logout <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\r\n      <span class=\"token punctuation\">{<\/span>children<span class=\"token punctuation\">}<\/span>\r\n    <span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span><span class=\"token class-name\">AuthContext.Provider<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\r\n  <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n<span class=\"token punctuation\">}<\/span>\r\n\r\n<span class=\"token keyword\">export<\/span> <span class=\"token keyword\">const<\/span> <span class=\"token function-variable function\">useAuth<\/span> <span class=\"token operator\">=<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">=&gt;<\/span> <span class=\"token function\">useContext<\/span><span class=\"token punctuation\">(<\/span>AuthContext<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/pre>\n<\/div>\n<p class=\"ds-markdown-paragraph\">Con esto, ya puedes\u00a0<strong>conectar React frontend con backend para ecommerce<\/strong>\u00a0en el futuro, a\u00f1adiendo llamadas reales a tu API.<\/p>\n<h2><strong>Conectando con el Mundo Real: Pagos y Backend<\/strong><\/h2>\n<h3><strong>Simulando una Conexi\u00f3n a una API Backend<\/strong><\/h3>\n<p class=\"ds-markdown-paragraph\">En una aplicaci\u00f3n real, tu frontend de React se comunicar\u00eda con un backend. As\u00ed es c\u00f3mo\u00a0<strong>c\u00f3mo conectar React frontend con backend<\/strong>\u00a0de forma b\u00e1sica:<\/p>\n<p class=\"ds-markdown-paragraph\">Crea\u00a0<code>src\/services\/api.js<\/code>:<\/p>\n<div class=\"md-code-block md-code-block-light\">\n<div class=\"md-code-block-banner-wrap\">\n<div class=\"md-code-block-banner md-code-block-banner-lite\">\n<div class=\"_121d384\">\n<div class=\"d2a24f03\"><span class=\"d813de27\">javascript<\/span><\/div>\n<\/div>\n<\/div>\n<\/div>\n<pre><span class=\"token keyword\">const<\/span> <span class=\"token constant\">API_URL<\/span> <span class=\"token operator\">=<\/span> process<span class=\"token punctuation\">.<\/span>env<span class=\"token punctuation\">.<\/span><span class=\"token constant\">REACT_APP_API_URL<\/span> <span class=\"token operator\">||<\/span> <span class=\"token string\">'http:\/\/localhost:5000\/api'<\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n<span class=\"token keyword\">export<\/span> <span class=\"token keyword\">async<\/span> <span class=\"token keyword\">function<\/span> <span class=\"token function\">createOrder<\/span><span class=\"token punctuation\">(<\/span><span class=\"token parameter\">orderData<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>\r\n  <span class=\"token keyword\">const<\/span> response <span class=\"token operator\">=<\/span> <span class=\"token keyword\">await<\/span> <span class=\"token function\">fetch<\/span><span class=\"token punctuation\">(<\/span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`<\/span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${<\/span><span class=\"token constant\">API_URL<\/span><span class=\"token interpolation-punctuation punctuation\">}<\/span><\/span><span class=\"token string\">\/orders<\/span><span class=\"token template-punctuation string\">`<\/span><\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">{<\/span>\r\n    <span class=\"token literal-property property\">method<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">'POST'<\/span><span class=\"token punctuation\">,<\/span>\r\n    <span class=\"token literal-property property\">headers<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span>\r\n      <span class=\"token string-property property\">'Content-Type'<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">'application\/json'<\/span><span class=\"token punctuation\">,<\/span>\r\n    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span>\r\n    <span class=\"token literal-property property\">body<\/span><span class=\"token operator\">:<\/span> <span class=\"token constant\">JSON<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">stringify<\/span><span class=\"token punctuation\">(<\/span>orderData<span class=\"token punctuation\">)<\/span>\r\n  <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n  \r\n  <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>response<span class=\"token punctuation\">.<\/span>ok<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>\r\n    <span class=\"token keyword\">throw<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token class-name\">Error<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">'Error al crear el pedido'<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n  <span class=\"token punctuation\">}<\/span>\r\n  \r\n  <span class=\"token keyword\">return<\/span> response<span class=\"token punctuation\">.<\/span><span class=\"token function\">json<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n<span class=\"token punctuation\">}<\/span>\r\n\r\n<span class=\"token keyword\">export<\/span> <span class=\"token keyword\">async<\/span> <span class=\"token keyword\">function<\/span> <span class=\"token function\">getProducts<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>\r\n  <span class=\"token keyword\">const<\/span> response <span class=\"token operator\">=<\/span> <span class=\"token keyword\">await<\/span> <span class=\"token function\">fetch<\/span><span class=\"token punctuation\">(<\/span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`<\/span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${<\/span><span class=\"token constant\">API_URL<\/span><span class=\"token interpolation-punctuation punctuation\">}<\/span><\/span><span class=\"token string\">\/products<\/span><span class=\"token template-punctuation string\">`<\/span><\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n  <span class=\"token keyword\">return<\/span> response<span class=\"token punctuation\">.<\/span><span class=\"token function\">json<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n<span class=\"token punctuation\">}<\/span><\/pre>\n<\/div>\n<p class=\"ds-markdown-paragraph\">Esta es una\u00a0<strong>API RESTful<\/strong>\u00a0t\u00edpica que podr\u00edas consumir desde tus componentes.<\/p>\n<h3><strong>Integrando una Pasarela de Pago (Ejemplo con Stripe)<\/strong><\/h3>\n<p class=\"ds-markdown-paragraph\">La\u00a0<strong>pasarela de pago integraci\u00f3n<\/strong>\u00a0es crucial. Para Stripe, primero instala el SDK:<\/p>\n<div class=\"md-code-block md-code-block-light\">\n<div class=\"md-code-block-banner-wrap\">\n<div class=\"md-code-block-banner md-code-block-banner-lite\">\n<div class=\"_121d384\">\n<div class=\"d2a24f03\"><span class=\"d813de27\">bash<\/span><\/div>\n<\/div>\n<\/div>\n<\/div>\n<pre><span class=\"token function\">npm<\/span> <span class=\"token function\">install<\/span> @stripe\/stripe-js<\/pre>\n<\/div>\n<p class=\"ds-markdown-paragraph\">Luego, en tu componente de checkout:<\/p>\n<div class=\"md-code-block md-code-block-light\">\n<div class=\"md-code-block-banner-wrap\">\n<div class=\"md-code-block-banner md-code-block-banner-lite\">\n<div class=\"_121d384\">\n<div class=\"d2a24f03\"><span class=\"d813de27\">jsx<\/span><\/div>\n<\/div>\n<\/div>\n<\/div>\n<pre><span class=\"token keyword\">import<\/span> <span class=\"token punctuation\">{<\/span> loadStripe <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">from<\/span> <span class=\"token string\">'@stripe\/stripe-js'<\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n<span class=\"token keyword\">const<\/span> stripePromise <span class=\"token operator\">=<\/span> <span class=\"token function\">loadStripe<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">'tu_llave_publica'<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n<span class=\"token keyword\">async<\/span> <span class=\"token keyword\">function<\/span> <span class=\"token function\">handleStripeCheckout<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>\r\n  <span class=\"token keyword\">const<\/span> stripe <span class=\"token operator\">=<\/span> <span class=\"token keyword\">await<\/span> stripePromise<span class=\"token punctuation\">;<\/span>\r\n  \r\n  <span class=\"token keyword\">const<\/span> response <span class=\"token operator\">=<\/span> <span class=\"token keyword\">await<\/span> <span class=\"token function\">fetch<\/span><span class=\"token punctuation\">(<\/span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`<\/span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${<\/span><span class=\"token constant\">API_URL<\/span><span class=\"token interpolation-punctuation punctuation\">}<\/span><\/span><span class=\"token string\">\/create-checkout-session<\/span><span class=\"token template-punctuation string\">`<\/span><\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">{<\/span>\r\n    <span class=\"token literal-property property\">method<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">'POST'<\/span><span class=\"token punctuation\">,<\/span>\r\n    <span class=\"token literal-property property\">body<\/span><span class=\"token operator\">:<\/span> <span class=\"token constant\">JSON<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">stringify<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span> cart<span class=\"token punctuation\">,<\/span> <span class=\"token literal-property property\">userInfo<\/span><span class=\"token operator\">:<\/span> formData <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span>\r\n  <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n  \r\n  <span class=\"token keyword\">const<\/span> session <span class=\"token operator\">=<\/span> <span class=\"token keyword\">await<\/span> response<span class=\"token punctuation\">.<\/span><span class=\"token function\">json<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n  \r\n  <span class=\"token keyword\">const<\/span> result <span class=\"token operator\">=<\/span> <span class=\"token keyword\">await<\/span> stripe<span class=\"token punctuation\">.<\/span><span class=\"token function\">redirectToCheckout<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span>\r\n    <span class=\"token literal-property property\">sessionId<\/span><span class=\"token operator\">:<\/span> session<span class=\"token punctuation\">.<\/span>id\r\n  <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n  \r\n  <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>result<span class=\"token punctuation\">.<\/span>error<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>\r\n    <span class=\"token function\">alert<\/span><span class=\"token punctuation\">(<\/span>result<span class=\"token punctuation\">.<\/span>error<span class=\"token punctuation\">.<\/span>message<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n  <span class=\"token punctuation\">}<\/span>\r\n<span class=\"token punctuation\">}<\/span><\/pre>\n<\/div>\n<p class=\"ds-markdown-paragraph\"><strong>Nota importante:<\/strong>\u00a0Nunca expongas tus claves secretas en el frontend. El proceso real involucra tu backend creando la sesi\u00f3n de checkout.<\/p>\n<p class=\"ds-markdown-paragraph\">Para\u00a0<strong>integrar PayPal en una app React.js<\/strong>, el proceso es similar pero con el SDK de PayPal.<\/p>\n<h3><strong>El Papel Crucial de las Variables de Entorno<\/strong><\/h3>\n<p class=\"ds-markdown-paragraph\">Nunca hardcodees claves de API en tu c\u00f3digo. Usa\u00a0<strong>variables de entorno<\/strong>:<\/p>\n<div class=\"md-code-block md-code-block-light\">\n<div class=\"md-code-block-banner-wrap\">\n<div class=\"md-code-block-banner md-code-block-banner-lite\">\n<div class=\"_121d384\">\n<div class=\"d2a24f03\"><span class=\"d813de27\">javascript<\/span><\/div>\n<\/div>\n<\/div>\n<\/div>\n<pre><span class=\"token comment\">\/\/ En tu .env.local (no subir a GitHub!)<\/span>\r\n<span class=\"token constant\">REACT_APP_STRIPE_PUBLIC_KEY<\/span><span class=\"token operator\">=<\/span>pk_test_tu_llave\r\n<span class=\"token constant\">REACT_APP_API_URL<\/span><span class=\"token operator\">=<\/span>https<span class=\"token operator\">:<\/span><span class=\"token operator\">\/<\/span><span class=\"token operator\">\/<\/span>tu<span class=\"token operator\">-<\/span>backend<span class=\"token punctuation\">.<\/span>com<span class=\"token operator\">\/<\/span>api<\/pre>\n<\/div>\n<p class=\"ds-markdown-paragraph\">Accede a ellas as\u00ed:<\/p>\n<div class=\"md-code-block md-code-block-light\">\n<div class=\"md-code-block-banner-wrap\">\n<div class=\"md-code-block-banner md-code-block-banner-lite\">\n<div class=\"_121d384\">\n<div class=\"d2a24f03\"><span class=\"d813de27\">javascript<\/span><\/div>\n<\/div>\n<\/div>\n<\/div>\n<pre><span class=\"token keyword\">const<\/span> stripeKey <span class=\"token operator\">=<\/span> process<span class=\"token punctuation\">.<\/span>env<span class=\"token punctuation\">.<\/span><span class=\"token constant\">REACT_APP_STRIPE_PUBLIC_KEY<\/span><span class=\"token punctuation\">;<\/span><\/pre>\n<\/div>\n<h2><strong>Preparando Tu Tienda para Producci\u00f3n<\/strong><\/h2>\n<h3><strong>Dise\u00f1o Responsive: Imprescindible en 2024<\/strong><\/h3>\n<p class=\"ds-markdown-paragraph\">Tu tienda debe verse bien en todos los dispositivos. Usa CSS Grid y Flexbox:<\/p>\n<div class=\"md-code-block md-code-block-light\">\n<div class=\"md-code-block-banner-wrap\">\n<div class=\"md-code-block-banner md-code-block-banner-lite\">\n<div class=\"_121d384\">\n<div class=\"d2a24f03\"><span class=\"d813de27\">css<\/span><\/div>\n<\/div>\n<\/div>\n<\/div>\n<pre><span class=\"token comment\">\/* En tu App.css *\/<\/span>\r\n<span class=\"token selector\">.product-grid<\/span> <span class=\"token punctuation\">{<\/span>\r\n  <span class=\"token property\">display<\/span><span class=\"token punctuation\">:<\/span> grid<span class=\"token punctuation\">;<\/span>\r\n  <span class=\"token property\">grid-template-columns<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token function\">repeat<\/span><span class=\"token punctuation\">(<\/span>auto-fill<span class=\"token punctuation\">,<\/span> <span class=\"token function\">minmax<\/span><span class=\"token punctuation\">(<\/span>280px<span class=\"token punctuation\">,<\/span> 1fr<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n  <span class=\"token property\">gap<\/span><span class=\"token punctuation\">:<\/span> 2rem<span class=\"token punctuation\">;<\/span>\r\n  <span class=\"token property\">padding<\/span><span class=\"token punctuation\">:<\/span> 2rem<span class=\"token punctuation\">;<\/span>\r\n<span class=\"token punctuation\">}<\/span>\r\n\r\n<span class=\"token atrule\"><span class=\"token rule\">@media<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token property\">max-width<\/span><span class=\"token punctuation\">:<\/span> 768px<span class=\"token punctuation\">)<\/span><\/span> <span class=\"token punctuation\">{<\/span>\r\n  <span class=\"token selector\">.product-grid<\/span> <span class=\"token punctuation\">{<\/span>\r\n    <span class=\"token property\">grid-template-columns<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token function\">repeat<\/span><span class=\"token punctuation\">(<\/span>2<span class=\"token punctuation\">,<\/span> 1fr<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n    <span class=\"token property\">gap<\/span><span class=\"token punctuation\">:<\/span> 1rem<span class=\"token punctuation\">;<\/span>\r\n    <span class=\"token property\">padding<\/span><span class=\"token punctuation\">:<\/span> 1rem<span class=\"token punctuation\">;<\/span>\r\n  <span class=\"token punctuation\">}<\/span>\r\n<span class=\"token punctuation\">}<\/span>\r\n\r\n<span class=\"token atrule\"><span class=\"token rule\">@media<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token property\">max-width<\/span><span class=\"token punctuation\">:<\/span> 480px<span class=\"token punctuation\">)<\/span><\/span> <span class=\"token punctuation\">{<\/span>\r\n  <span class=\"token selector\">.product-grid<\/span> <span class=\"token punctuation\">{<\/span>\r\n    <span class=\"token property\">grid-template-columns<\/span><span class=\"token punctuation\">:<\/span> 1fr<span class=\"token punctuation\">;<\/span>\r\n  <span class=\"token punctuation\">}<\/span>\r\n<span class=\"token punctuation\">}<\/span><\/pre>\n<\/div>\n<p class=\"ds-markdown-paragraph\">El\u00a0<strong>dise\u00f1o responsive<\/strong>\u00a0no es un lujo, es una necesidad. M\u00e1s del 60% de las compras online se realizan desde m\u00f3viles.<\/p>\n<h3><strong>Pruebas B\u00e1sicas para Mayor Confiabilidad<\/strong><\/h3>\n<p class=\"ds-markdown-paragraph\">Las\u00a0<strong>pruebas (testing)<\/strong>\u00a0garantizan que tu tienda funcione correctamente. Instala React Testing Library:<\/p>\n<div class=\"md-code-block md-code-block-light\">\n<div class=\"md-code-block-banner-wrap\">\n<div class=\"md-code-block-banner md-code-block-banner-lite\">\n<div class=\"_121d384\">\n<div class=\"d2a24f03\"><span class=\"d813de27\">bash<\/span><\/div>\n<\/div>\n<\/div>\n<\/div>\n<pre><span class=\"token function\">npm<\/span> <span class=\"token function\">install<\/span> --save-dev @testing-library\/react @testing-library\/jest-dom<\/pre>\n<\/div>\n<p class=\"ds-markdown-paragraph\">Crea una prueba b\u00e1sica para tu ProductCard:<\/p>\n<div class=\"md-code-block md-code-block-light\">\n<div class=\"md-code-block-banner-wrap\">\n<div class=\"md-code-block-banner md-code-block-banner-lite\">\n<div class=\"_121d384\">\n<div class=\"d2a24f03\"><span class=\"d813de27\">jsx<\/span><\/div>\n<\/div>\n<\/div>\n<\/div>\n<pre><span class=\"token comment\">\/\/ src\/components\/ProductCard.test.js<\/span>\r\n<span class=\"token keyword\">import<\/span> <span class=\"token punctuation\">{<\/span> render<span class=\"token punctuation\">,<\/span> screen <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">from<\/span> <span class=\"token string\">'@testing-library\/react'<\/span><span class=\"token punctuation\">;<\/span>\r\n<span class=\"token keyword\">import<\/span> ProductCard <span class=\"token keyword\">from<\/span> <span class=\"token string\">'.\/ProductCard'<\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n<span class=\"token function\">test<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">'muestra el nombre y precio del producto'<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">=&gt;<\/span> <span class=\"token punctuation\">{<\/span>\r\n  <span class=\"token keyword\">const<\/span> mockProduct <span class=\"token operator\">=<\/span> <span class=\"token punctuation\">{<\/span>\r\n    <span class=\"token literal-property property\">id<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span>\r\n    <span class=\"token literal-property property\">name<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">'Producto Test'<\/span><span class=\"token punctuation\">,<\/span>\r\n    <span class=\"token literal-property property\">price<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">29.99<\/span><span class=\"token punctuation\">,<\/span>\r\n    <span class=\"token literal-property property\">image<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">'test.jpg'<\/span>\r\n  <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span>\r\n  \r\n  <span class=\"token function\">render<\/span><span class=\"token punctuation\">(<\/span><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span><span class=\"token class-name\">ProductCard<\/span> <span class=\"token attr-name\">producto<\/span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=<\/span><span class=\"token punctuation\">{<\/span>mockProduct<span class=\"token punctuation\">}<\/span><\/span> <span class=\"token punctuation\">\/&gt;<\/span><\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n  \r\n  <span class=\"token function\">expect<\/span><span class=\"token punctuation\">(<\/span>screen<span class=\"token punctuation\">.<\/span><span class=\"token function\">getByText<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">'Producto Test'<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">toBeInTheDocument<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n  <span class=\"token function\">expect<\/span><span class=\"token punctuation\">(<\/span>screen<span class=\"token punctuation\">.<\/span><span class=\"token function\">getByText<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">'$29.99'<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">toBeInTheDocument<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/pre>\n<\/div>\n<h3><strong>Despliegue en Vercel: Tu Tienda Online en Minutos<\/strong><\/h3>\n<p class=\"ds-markdown-paragraph\">El\u00a0<strong>despliegue (deployment)<\/strong>\u00a0nunca fue tan f\u00e1cil. Con Vercel:<\/p>\n<ol start=\"1\">\n<li>\n<p class=\"ds-markdown-paragraph\">Sube tu c\u00f3digo a GitHub<\/p>\n<\/li>\n<li>\n<p class=\"ds-markdown-paragraph\">Ve a\u00a0<a href=\"https:\/\/vercel.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">vercel.com<\/a><\/p>\n<\/li>\n<li>\n<p class=\"ds-markdown-paragraph\">Conecta tu repositorio<\/p>\n<\/li>\n<li>\n<p class=\"ds-markdown-paragraph\">\u00a1Listo! Tu tienda estar\u00e1 online en minutos<\/p>\n<\/li>\n<\/ol>\n<p class=\"ds-markdown-paragraph\">Vercel detecta autom\u00e1ticamente que es una aplicaci\u00f3n React y configura todo por ti. Incluye HTTPS gratis, CDN global y despliegues instant\u00e1neos.<\/p>\n<h2><strong>Tu Tienda Online con React.js est\u00e1 Lista<\/strong><\/h2>\n<p class=\"ds-markdown-paragraph\">\u00a1Lo lograste! Has completado este\u00a0<strong>tutorial completo ecommerce React.js desde cero<\/strong>. Repasemos lo que construiste:<\/p>\n<p class=\"ds-markdown-paragraph\">\u2705\u00a0<strong>Configuraci\u00f3n profesional<\/strong>\u00a0de un proyecto React con estructura escalable<br \/>\n\u2705\u00a0<strong>Cat\u00e1logo de productos<\/strong>\u00a0con filtros, b\u00fasqueda y paginaci\u00f3n<br \/>\n\u2705\u00a0<strong>Sistema completo de carrito<\/strong>\u00a0con gesti\u00f3n de estado global<br \/>\n\u2705\u00a0<strong>Proceso de checkout<\/strong>\u00a0con formularios validados<br \/>\n\u2705\u00a0<strong>Integraci\u00f3n con pasarelas de pago<\/strong>\u00a0(simulada, lista para conectar)<br \/>\n\u2705\u00a0<strong>Aplicaci\u00f3n lista para producci\u00f3n<\/strong>\u00a0con dise\u00f1o responsive<\/p>\n<h3><strong>Pr\u00f3ximos Pasos y Recursos<\/strong><\/h3>\n<p class=\"ds-markdown-paragraph\">Tu viaje acaba de comenzar. Para llevar tu tienda al siguiente nivel:<\/p>\n<ol start=\"1\">\n<li>\n<p class=\"ds-markdown-paragraph\"><strong>Conecta un Backend Real<\/strong>: Mira nuestro tutorial\u00a0<strong>crear tienda online con React.js y Node.js<\/strong>\u00a0para a\u00f1adir MongoDB, autenticaci\u00f3n real y panel de administraci\u00f3n.<\/p>\n<\/li>\n<li>\n<p class=\"ds-markdown-paragraph\"><strong>Mejora el SEO<\/strong>: Implementa Next.js para renderizado del lado del servidor y mejores posiciones en Google.<\/p>\n<\/li>\n<li>\n<p class=\"ds-markdown-paragraph\"><strong>A\u00f1ade Funcionalidades Avanzadas<\/strong>: Sistema de reviews, recomendaciones personalizadas, m\u00faltiples m\u00e9todos de pago.<\/p>\n<\/li>\n<li>\n<p class=\"ds-markdown-paragraph\"><strong>Descarga el C\u00f3digo Completo<\/strong>: \u00bfQuieres el proyecto completo con estilos avanzados y m\u00e1s caracter\u00edsticas?\u00a0<a href=\"https:\/\/github.com\/tu-usuario\/tienda-react-completa\" target=\"_blank\" rel=\"noopener noreferrer\">Descarga el repositorio completo desde GitHub<\/a>.<\/p>\n<\/li>\n<\/ol>\n<h3><strong>\u00bfQuieres Aprender M\u00e1s?<\/strong><\/h3>\n<ul>\n<li>\n<p class=\"ds-markdown-paragraph\"><strong>Curso Avanzado de React para Ecommerce<\/strong>: Patrones avanzados y optimizaciones<\/p>\n<\/li>\n<li>\n<p class=\"ds-markdown-paragraph\"><strong>Gu\u00eda de Performance<\/strong>: Lleva tu tienda de 0 a 100 en Lighthouse<\/p>\n<\/li>\n<li>\n<p class=\"ds-markdown-paragraph\"><strong>Monetizaci\u00f3n y Marketing<\/strong>: C\u00f3mo hacer que tu tienda genere ingresos<\/p>\n<\/li>\n<\/ul>\n<h2><strong>Preguntas Frecuentes sobre Ecommerce con React.js<\/strong><\/h2>\n<h3><strong>\u00bfReact.js es bueno para el SEO de una tienda online?<\/strong><\/h3>\n<p class=\"ds-markdown-paragraph\">React por s\u00ed solo tiene desaf\u00edos de SEO porque renderiza en el cliente. Sin embargo, usando Next.js (framework de React) con renderizado del lado del servidor (SSR) o generaci\u00f3n est\u00e1tica (SSG), obtienes excelente SEO. Muchas grandes tiendas online usan esta combinaci\u00f3n.<\/p>\n<h3><strong>\u00bfPuedo usar esta gu\u00eda con un backend como Firebase o Django?<\/strong><\/h3>\n<p class=\"ds-markdown-paragraph\">\u00a1Absolutamente! Los principios son los mismos. Solo cambiar\u00eda c\u00f3mo\u00a0<strong>cargas datos as\u00edncronos<\/strong>\u00a0desde tu API. En lugar de un archivo local, har\u00edas fetch a tu backend de Firebase o Django REST Framework.<\/p>\n<h3><strong>\u00bfEs obligatorio usar Redux para el carrito de compras?<\/strong><\/h3>\n<p class=\"ds-markdown-paragraph\">No, para nada. Como vimos, Context API es suficiente para la mayor\u00eda de tiendas medianas. Redux es excelente para aplicaciones muy complejas con mucha l\u00f3gica de estado, pero a\u00f1ade complejidad. Empieza con Context y migra solo si lo necesitas.<\/p>\n<h3><strong>\u00bfCu\u00e1nto cuesta desplegar una tienda hecha con React.js?<\/strong><\/h3>\n<p class=\"ds-markdown-paragraph\">Puede ser completamente gratis al principio. Vercel, Netlify y GitHub Pages ofrecen planes gratuitos. Solo pagar\u00e1s cuando tengas mucho tr\u00e1fico. El dominio (<a href=\"https:\/\/tutienda.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">tutienda.com<\/a>)\u00a0cuesta alrededor de $10-15 anuales.<\/p>\n<h3><strong>\u00bfTe gust\u00f3 esta gu\u00eda?<\/strong><\/h3>\n<p class=\"ds-markdown-paragraph\">Suscr\u00edbete a nuestro newsletter para recibir m\u00e1s\u00a0<strong>tutoriales pr\u00e1cticos sobre desarrollo web<\/strong>, actualizaciones de React y consejos exclusivos para\u00a0<strong>optimizar tu aplicaci\u00f3n de comercio electr\u00f3nico<\/strong>.<\/p>\n<p class=\"ds-markdown-paragraph\">\u00bfTienes preguntas o quieres compartir tu proyecto? \u00a1D\u00e9janos un comentario abajo! Nos encanta ver lo que construye nuestra comunidad.<\/p>\n<p class=\"ds-markdown-paragraph\"><strong>\u00bfListo para comenzar tu pr\u00f3xima tienda online? \u00a1El c\u00f3digo te espera!\u00a0<\/strong><\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Gu\u00eda Definitiva: Construye Tu Propia Tienda Online con React.js \u00bfListo para crear tu propia tienda online? El comercio electr\u00f3nico no es solo el futuro, es el presente. Con millones de compras online cada d\u00eda, tener una tienda virtual robusta y atractiva es crucial. Pero, \u00bfc\u00f3mo crear una sin gastar una fortuna en desarrollo? La respuesta [&hellip;]<\/p>\n","protected":false},"author":23,"featured_media":4048,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"content-type":"","om_disable_all_campaigns":false,"footnotes":""},"categories":[1159],"tags":[],"class_list":{"0":"post-23153","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-uncategorized-es"},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.8 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Gu\u00eda 2026: Ecommerce con React.js - Carrito y Pagos<\/title>\n<meta name=\"description\" content=\"Aprende a construir una aplicaci\u00f3n de comercio electr\u00f3nico con React.js. Gu\u00eda completa: carrito de compras React, integraci\u00f3n pasarela de pago, gesti\u00f3n de estado y despliegue. \u00a1C\u00f3digo pr\u00e1ctico incluido!\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/prometteursolutions.com\/blog\/es\/como-construir-una-aplicacion-de-sitio-web-de-comercio-electronico-con-react-js\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Gu\u00eda 2026: Ecommerce con React.js - Carrito y Pagos\" \/>\n<meta property=\"og:description\" content=\"Aprende a construir una aplicaci\u00f3n de comercio electr\u00f3nico con React.js. Gu\u00eda completa: carrito de compras React, integraci\u00f3n pasarela de pago, gesti\u00f3n de estado y despliegue. \u00a1C\u00f3digo pr\u00e1ctico incluido!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/prometteursolutions.com\/blog\/es\/como-construir-una-aplicacion-de-sitio-web-de-comercio-electronico-con-react-js\/\" \/>\n<meta property=\"og:site_name\" content=\"blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prometteurSolutions\/timeline\/\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-30T06:03:33+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-12-30T06:07:22+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/prometteursolutions.com\/blog\/wp-content\/uploads\/2021\/11\/MicrosoftTeams-image-12.png\" \/>\n\t<meta property=\"og:image:width\" content=\"951\" \/>\n\t<meta property=\"og:image:height\" content=\"501\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"raman\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@Iamprometteur\" \/>\n<meta name=\"twitter:site\" content=\"@Iamprometteur\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"raman\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/prometteursolutions.com\/blog\/es\/como-construir-una-aplicacion-de-sitio-web-de-comercio-electronico-con-react-js\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/prometteursolutions.com\/blog\/es\/como-construir-una-aplicacion-de-sitio-web-de-comercio-electronico-con-react-js\/\"},\"author\":{\"name\":\"raman\",\"@id\":\"https:\/\/prometteursolutions.com\/blog\/#\/schema\/person\/a8b19c23ac440968cb8277d1219da48b\"},\"headline\":\"C\u00d3MO CONSTRUIR UNA APLICACI\u00d3N DE SITIO WEB DE COMERCIO ELECTR\u00d3NICO CON REACT.JS\",\"datePublished\":\"2025-12-30T06:03:33+00:00\",\"dateModified\":\"2025-12-30T06:07:22+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/prometteursolutions.com\/blog\/es\/como-construir-una-aplicacion-de-sitio-web-de-comercio-electronico-con-react-js\/\"},\"wordCount\":1898,\"publisher\":{\"@id\":\"https:\/\/prometteursolutions.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/prometteursolutions.com\/blog\/es\/como-construir-una-aplicacion-de-sitio-web-de-comercio-electronico-con-react-js\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/prometteursolutions.com\/blog\/wp-content\/uploads\/2021\/11\/MicrosoftTeams-image-12.png\",\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/prometteursolutions.com\/blog\/es\/como-construir-una-aplicacion-de-sitio-web-de-comercio-electronico-con-react-js\/\",\"url\":\"https:\/\/prometteursolutions.com\/blog\/es\/como-construir-una-aplicacion-de-sitio-web-de-comercio-electronico-con-react-js\/\",\"name\":\"Gu\u00eda 2026: Ecommerce con React.js - Carrito y Pagos\",\"isPartOf\":{\"@id\":\"https:\/\/prometteursolutions.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/prometteursolutions.com\/blog\/es\/como-construir-una-aplicacion-de-sitio-web-de-comercio-electronico-con-react-js\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/prometteursolutions.com\/blog\/es\/como-construir-una-aplicacion-de-sitio-web-de-comercio-electronico-con-react-js\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/prometteursolutions.com\/blog\/wp-content\/uploads\/2021\/11\/MicrosoftTeams-image-12.png\",\"datePublished\":\"2025-12-30T06:03:33+00:00\",\"dateModified\":\"2025-12-30T06:07:22+00:00\",\"description\":\"Aprende a construir una aplicaci\u00f3n de comercio electr\u00f3nico con React.js. Gu\u00eda completa: carrito de compras React, integraci\u00f3n pasarela de pago, gesti\u00f3n de estado y despliegue. \u00a1C\u00f3digo pr\u00e1ctico incluido!\",\"breadcrumb\":{\"@id\":\"https:\/\/prometteursolutions.com\/blog\/es\/como-construir-una-aplicacion-de-sitio-web-de-comercio-electronico-con-react-js\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/prometteursolutions.com\/blog\/es\/como-construir-una-aplicacion-de-sitio-web-de-comercio-electronico-con-react-js\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/prometteursolutions.com\/blog\/es\/como-construir-una-aplicacion-de-sitio-web-de-comercio-electronico-con-react-js\/#primaryimage\",\"url\":\"https:\/\/prometteursolutions.com\/blog\/wp-content\/uploads\/2021\/11\/MicrosoftTeams-image-12.png\",\"contentUrl\":\"https:\/\/prometteursolutions.com\/blog\/wp-content\/uploads\/2021\/11\/MicrosoftTeams-image-12.png\",\"width\":951,\"height\":501,\"caption\":\"Ecommerce Website Application\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/prometteursolutions.com\/blog\/es\/como-construir-una-aplicacion-de-sitio-web-de-comercio-electronico-con-react-js\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/prometteursolutions.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"C\u00d3MO CONSTRUIR UNA APLICACI\u00d3N DE SITIO WEB DE COMERCIO ELECTR\u00d3NICO CON REACT.JS\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/prometteursolutions.com\/blog\/#website\",\"url\":\"https:\/\/prometteursolutions.com\/blog\/\",\"name\":\"blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/prometteursolutions.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/prometteursolutions.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/prometteursolutions.com\/blog\/#organization\",\"name\":\"blog\",\"url\":\"https:\/\/prometteursolutions.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/prometteursolutions.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/prometteursolutions.com\/blog\/wp-content\/uploads\/2021\/04\/new-logo.png\",\"contentUrl\":\"https:\/\/prometteursolutions.com\/blog\/wp-content\/uploads\/2021\/04\/new-logo.png\",\"width\":211,\"height\":60,\"caption\":\"blog\"},\"image\":{\"@id\":\"https:\/\/prometteursolutions.com\/blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/prometteurSolutions\/timeline\/\",\"https:\/\/x.com\/Iamprometteur\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/prometteursolutions.com\/blog\/#\/schema\/person\/a8b19c23ac440968cb8277d1219da48b\",\"name\":\"raman\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/prometteursolutions.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/85b952b5d8cf5cdbbb4ea41025b2b84ba089c12d8352f935442901a6c6106dcc?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/85b952b5d8cf5cdbbb4ea41025b2b84ba089c12d8352f935442901a6c6106dcc?s=96&d=mm&r=g\",\"caption\":\"raman\"},\"url\":\"https:\/\/prometteursolutions.com\/blog\/author\/raman\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Gu\u00eda 2026: Ecommerce con React.js - Carrito y Pagos","description":"Aprende a construir una aplicaci\u00f3n de comercio electr\u00f3nico con React.js. Gu\u00eda completa: carrito de compras React, integraci\u00f3n pasarela de pago, gesti\u00f3n de estado y despliegue. \u00a1C\u00f3digo pr\u00e1ctico incluido!","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/prometteursolutions.com\/blog\/es\/como-construir-una-aplicacion-de-sitio-web-de-comercio-electronico-con-react-js\/","og_locale":"en_US","og_type":"article","og_title":"Gu\u00eda 2026: Ecommerce con React.js - Carrito y Pagos","og_description":"Aprende a construir una aplicaci\u00f3n de comercio electr\u00f3nico con React.js. Gu\u00eda completa: carrito de compras React, integraci\u00f3n pasarela de pago, gesti\u00f3n de estado y despliegue. \u00a1C\u00f3digo pr\u00e1ctico incluido!","og_url":"https:\/\/prometteursolutions.com\/blog\/es\/como-construir-una-aplicacion-de-sitio-web-de-comercio-electronico-con-react-js\/","og_site_name":"blog","article_publisher":"https:\/\/www.facebook.com\/prometteurSolutions\/timeline\/","article_published_time":"2025-12-30T06:03:33+00:00","article_modified_time":"2025-12-30T06:07:22+00:00","og_image":[{"width":951,"height":501,"url":"https:\/\/prometteursolutions.com\/blog\/wp-content\/uploads\/2021\/11\/MicrosoftTeams-image-12.png","type":"image\/png"}],"author":"raman","twitter_card":"summary_large_image","twitter_creator":"@Iamprometteur","twitter_site":"@Iamprometteur","twitter_misc":{"Written by":"raman","Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/prometteursolutions.com\/blog\/es\/como-construir-una-aplicacion-de-sitio-web-de-comercio-electronico-con-react-js\/#article","isPartOf":{"@id":"https:\/\/prometteursolutions.com\/blog\/es\/como-construir-una-aplicacion-de-sitio-web-de-comercio-electronico-con-react-js\/"},"author":{"name":"raman","@id":"https:\/\/prometteursolutions.com\/blog\/#\/schema\/person\/a8b19c23ac440968cb8277d1219da48b"},"headline":"C\u00d3MO CONSTRUIR UNA APLICACI\u00d3N DE SITIO WEB DE COMERCIO ELECTR\u00d3NICO CON REACT.JS","datePublished":"2025-12-30T06:03:33+00:00","dateModified":"2025-12-30T06:07:22+00:00","mainEntityOfPage":{"@id":"https:\/\/prometteursolutions.com\/blog\/es\/como-construir-una-aplicacion-de-sitio-web-de-comercio-electronico-con-react-js\/"},"wordCount":1898,"publisher":{"@id":"https:\/\/prometteursolutions.com\/blog\/#organization"},"image":{"@id":"https:\/\/prometteursolutions.com\/blog\/es\/como-construir-una-aplicacion-de-sitio-web-de-comercio-electronico-con-react-js\/#primaryimage"},"thumbnailUrl":"https:\/\/prometteursolutions.com\/blog\/wp-content\/uploads\/2021\/11\/MicrosoftTeams-image-12.png","inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/prometteursolutions.com\/blog\/es\/como-construir-una-aplicacion-de-sitio-web-de-comercio-electronico-con-react-js\/","url":"https:\/\/prometteursolutions.com\/blog\/es\/como-construir-una-aplicacion-de-sitio-web-de-comercio-electronico-con-react-js\/","name":"Gu\u00eda 2026: Ecommerce con React.js - Carrito y Pagos","isPartOf":{"@id":"https:\/\/prometteursolutions.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/prometteursolutions.com\/blog\/es\/como-construir-una-aplicacion-de-sitio-web-de-comercio-electronico-con-react-js\/#primaryimage"},"image":{"@id":"https:\/\/prometteursolutions.com\/blog\/es\/como-construir-una-aplicacion-de-sitio-web-de-comercio-electronico-con-react-js\/#primaryimage"},"thumbnailUrl":"https:\/\/prometteursolutions.com\/blog\/wp-content\/uploads\/2021\/11\/MicrosoftTeams-image-12.png","datePublished":"2025-12-30T06:03:33+00:00","dateModified":"2025-12-30T06:07:22+00:00","description":"Aprende a construir una aplicaci\u00f3n de comercio electr\u00f3nico con React.js. Gu\u00eda completa: carrito de compras React, integraci\u00f3n pasarela de pago, gesti\u00f3n de estado y despliegue. \u00a1C\u00f3digo pr\u00e1ctico incluido!","breadcrumb":{"@id":"https:\/\/prometteursolutions.com\/blog\/es\/como-construir-una-aplicacion-de-sitio-web-de-comercio-electronico-con-react-js\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/prometteursolutions.com\/blog\/es\/como-construir-una-aplicacion-de-sitio-web-de-comercio-electronico-con-react-js\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/prometteursolutions.com\/blog\/es\/como-construir-una-aplicacion-de-sitio-web-de-comercio-electronico-con-react-js\/#primaryimage","url":"https:\/\/prometteursolutions.com\/blog\/wp-content\/uploads\/2021\/11\/MicrosoftTeams-image-12.png","contentUrl":"https:\/\/prometteursolutions.com\/blog\/wp-content\/uploads\/2021\/11\/MicrosoftTeams-image-12.png","width":951,"height":501,"caption":"Ecommerce Website Application"},{"@type":"BreadcrumbList","@id":"https:\/\/prometteursolutions.com\/blog\/es\/como-construir-una-aplicacion-de-sitio-web-de-comercio-electronico-con-react-js\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/prometteursolutions.com\/blog\/"},{"@type":"ListItem","position":2,"name":"C\u00d3MO CONSTRUIR UNA APLICACI\u00d3N DE SITIO WEB DE COMERCIO ELECTR\u00d3NICO CON REACT.JS"}]},{"@type":"WebSite","@id":"https:\/\/prometteursolutions.com\/blog\/#website","url":"https:\/\/prometteursolutions.com\/blog\/","name":"blog","description":"","publisher":{"@id":"https:\/\/prometteursolutions.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/prometteursolutions.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/prometteursolutions.com\/blog\/#organization","name":"blog","url":"https:\/\/prometteursolutions.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/prometteursolutions.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/prometteursolutions.com\/blog\/wp-content\/uploads\/2021\/04\/new-logo.png","contentUrl":"https:\/\/prometteursolutions.com\/blog\/wp-content\/uploads\/2021\/04\/new-logo.png","width":211,"height":60,"caption":"blog"},"image":{"@id":"https:\/\/prometteursolutions.com\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/prometteurSolutions\/timeline\/","https:\/\/x.com\/Iamprometteur"]},{"@type":"Person","@id":"https:\/\/prometteursolutions.com\/blog\/#\/schema\/person\/a8b19c23ac440968cb8277d1219da48b","name":"raman","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/prometteursolutions.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/85b952b5d8cf5cdbbb4ea41025b2b84ba089c12d8352f935442901a6c6106dcc?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/85b952b5d8cf5cdbbb4ea41025b2b84ba089c12d8352f935442901a6c6106dcc?s=96&d=mm&r=g","caption":"raman"},"url":"https:\/\/prometteursolutions.com\/blog\/author\/raman\/"}]}},"_links":{"self":[{"href":"https:\/\/prometteursolutions.com\/blog\/wp-json\/wp\/v2\/posts\/23153","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prometteursolutions.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prometteursolutions.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prometteursolutions.com\/blog\/wp-json\/wp\/v2\/users\/23"}],"replies":[{"embeddable":true,"href":"https:\/\/prometteursolutions.com\/blog\/wp-json\/wp\/v2\/comments?post=23153"}],"version-history":[{"count":1,"href":"https:\/\/prometteursolutions.com\/blog\/wp-json\/wp\/v2\/posts\/23153\/revisions"}],"predecessor-version":[{"id":23154,"href":"https:\/\/prometteursolutions.com\/blog\/wp-json\/wp\/v2\/posts\/23153\/revisions\/23154"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prometteursolutions.com\/blog\/wp-json\/wp\/v2\/media\/4048"}],"wp:attachment":[{"href":"https:\/\/prometteursolutions.com\/blog\/wp-json\/wp\/v2\/media?parent=23153"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prometteursolutions.com\/blog\/wp-json\/wp\/v2\/categories?post=23153"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prometteursolutions.com\/blog\/wp-json\/wp\/v2\/tags?post=23153"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}