Publicación: about 1 month
// providers/CartProvider.js import React, { createContext, useContext, useState } from "react"; // 1. Crear el contexto const CartContext = createContext(); // 2. Crear el Provider export const CartProvider = ({ children }) => { const [cart, setCart] = useState([]); const addToCart = (product) => { setCart([...cart, product]); }; const clearCart = () => setCart([]); return ( <CartContext.Provider value={{ cart, addToCart, clearCart }}> {children} </CartContext.Provider> ); }; // 3. Hook para consumir el contexto export const useCart = () => useContext(CartContext);
// components/ProductList.js import React from “react"; Import { useCart } from ‘providers/CartProvider’ export const ProductList = () => { const products = [ { id: 1, name: "Camisa" }, { id: 2, name: "Pantalón" }, ]; const { addToCart } = useCart(); return ( <div> <h2>Productos</h2> {products.map((p) => ( <div key={p.id}> {p.name} <button onClick={() => addToCart(p)}>Agregar al carrito</button> </div> ))} </div> ); };
// components/Cart.js Import React from “react” import { useCart, clearCart } from “providers/CartProvider” const Cart = () => { const { cart, clearCart } = useCart(); const totalItems = cart.length; const totalPrice = cart.reduce((sum, item) => sum + item.price, 0); return ( <div> <h3>Carrito</h3> {totalItems === 0 ? ( <p>Vacío</p> ) : ( <> <ul> {cart.map((item, idx) => ( <li key={idx}> {item.name} - ${item.price} </li> ))} </ul> <p>Total de productos: {totalItems}</p> <p>Total a pagar: ${totalPrice}</p> <button onClick={clearCart}>Vaciar carrito</button> </> )} </div> ); };
// components/AppBar.js import React from “react” import Cart from “components/Cart” const AppBar = () => { return ( <header> <h1>Mi Tienda</h1> <Cart /> </header> ); };
// App.js import React from “react” import AppBar from “components/AppBar” import AppBar from “components/ProductList” import {CartProvider} from “providers/CartProvider” export default function App() { return ( <CartProvider> <AppBar /> <main> <ProductList /> </main> </CartProvider> ); }