Stiven Arboleda
Así quedó el mío:
¿Cómo añadir productos al carrito de compras?
Cuando un usuario navega por una tienda en línea, es imprescindible poder añadir productos a su carrito de compras. Este proceso requiere una comunicación fluida entre los diferentes componentes de la aplicación, especialmente entre el componente de la lista (donde se muestran los productos) y el componente del carrito de compras. Exploraremos cómo implementar esta funcionalidad utilizando reactividad y comunicación entre componentes padre e hijo.
¿Cómo identificar el componente donde se hace el render de productos?
El componente list component es el encargado de renderizar la lista de productos. Aquí es donde los usuarios podrán ver y seleccionar los elementos que desean añadir a su carrito. Este componente también tiene acceso a otros componentes como AppHeader, que gestiona la interfaz del encabezado.
¿Qué proceso utilizar para almacenar productos seleccionados?
Para almacenar los productos seleccionados, necesitamos crear una señal que funcione como una lista receptora. Esta lista se llenará conforme el usuario seleccione distintos artículos. Además, se manejará un evento add to cart en el que utilizaremos reactividad para actualizar el estado del carrito.
// Actualización de la señal del carrito de compras function actualizarCarrito(eventoProducto) { carrito.update(estadoPrevio => [...estadoPrevio, eventoProducto]); }
¿Cómo suscribirse al estado del carrito de compras?
Para poder mostrar la cantidad de productos en el carrito, es posible suscribirse al estado de dicha estructura de datos. De esta manera, podemos saber cuántos elementos hay en el carrito en cualquier momento.
<h3>Cantidad en el carrito: {{carrito.length}}</h3>
¿Cómo comunicar el estado del carrito al encabezado?
El encabezado o AppHeader es responsable de mostrar el número de productos en el carrito y detalla su contenido. Para enviar el estado del carrito desde el list component al AppHeader, se utiliza un input que permite recibir parámetros desde un componente padre.
<Input() @required carrito: Producto[] = [];
¿Cómo renderizar el contenido del carrito en el menú?
En el componente de encabezado, se puede utilizar una directiva como ngFor para renderizar dinámicamente el contenido del carrito en el menú de la aplicación.
<div *ngFor="let product of carrito"> <p>{{product.title}} - {{product.price}}</p> </div>
¿Cómo añadir un contador al botón del carrito de compras?
Para mejorar la visualización, es útil añadir un contador sobre el botón del carrito. Este mostrará cuántos artículos hay dentro.
¿Cómo personalizar el diseño del contador?
Utilizando estilos CSS, puedes personalizar cómo se ve el contador. Aquí un ejemplo básico:
<button> <svg><!-- Icono carrito --></svg> <div class="contador">{{carrito.length}}</div> </button>
.contador { position: absolute; top: 2px; left: 2px; background: #000; color: #FFF; border-radius: 50%; width: 20px; height: 20px; text-align: center; font-size: 10px; }
Reto para mejorar la aplicación
Además de mostrar el número de elementos en el carrito, puedes mejorar la visualización detalla de los productos incluidos. ¡Sé creativo! Añade las imágenes o precios de los productos y calcula el total de todos los elementos del carrito. Este tipo de características no solo mejorarán la experiencia del usuario sino también tu habilidad para manejar datos dinámicos en interfaces.
¡Ánimo! Con estas mejoras, tu aplicación de compras online será mucho más interactiva y funcional.
Aquí dejo mi solución, tomé de flowbite un estilo de card para hacer el carrito y cree un método en el componente para calcular el total:
Ts:
getTotalPrice() { return this.cart.reduce((total, product) => total + product.price, 0); }
HTML:
<div> @for (product of cart; track product.id) { <div> <a href="#" class="m-3 flex flex-col items-center bg-white border border-gray-200 rounded-lg shadow md:flex-row md:max-w-xl hover:bg-gray-100 dark:border-gray-700 dark:bg-gray-800 dark:hover:bg-gray-700"> <img class="object-cover w-full rounded-t-lg h-96 md:h-auto md:w-24 md:rounded-none md:rounded-s-lg" [src]="product.image" alt=""> <div class="flex flex-col justify-between p-4 leading-normal"> <h5 class="mb-2 text-2xl font-bold tracking-tight text-gray-900 dark:text-white">{{ product.title}}</h6> <p class="mb-3 font-normal text-gray-700 dark:text-gray-400">{{ product.price | currency }}</p> </div> </a> </div> } <p>Total: {{ getTotalPrice() | currency }}</p> </div>
Stiven Arboleda
Así quedó el mío:
Eduardo Razo Cobián
asi quedo mi carrito :D
Alexander Coronell
Aquí dejo mi solución usando las características más recientes de Angular
totalPrice = computed(() => this.cart().reduce((total, product) => total + product.price, 0))
Luis Angel Castillo Vega
todos unos masters y yo aun no puedo hacer que el aumente el carrito.
Victor Hugo Vázquez Gómez
Lo lograste resolver? Si no, pasa tu codigo para que podamos ayudarte
Victor Hugo Vázquez Gómez
De preferencia tu repositorio en GitHub para que podamos ver todo el proyecto
Joseph Christoffer Condori Murga
Rafael Bautista
<ul class="max-w-md divide-y divide-gray-200"> @for(product of cart; track product;){ <li class="py-3 sm:pb-4"> <div class="flex items-center space-x-4 rtl:space-x-reverse"> <div class="flex-shrink-0"> <img class="w-16 h-16" [src]="product.image" alt="Neil image"> </div> <div class="flex-1 min-w-0"> <p class="text-lg font-medium text-gray-900 truncate"> {{product.title}} </p> </div> <div class="inline-flex items-center text-base font-semibold text-gray-900 "> ${{product.price}} </div> </div> </li> } </ul> ```Esta es mi propuesta para mostrar los productos en el carrito de compras
Juan David Gutierrez Castaño
Yo complete esta clase de manera muy distinta ya que al meter el <app-header> dentro de app.ts para que el header se renderizara en todas las paginas, no se enviaban los productos al carrito, y eso me llevo a aprender un poco mas, pues me toco implementar servicios, e implemente el signal dentro del servicio. tambien actualice el *ngfor con el @for; voy a anexar las fotos del resultado final, y por ultimo las partes mas importantes del codigo.
Israel Elias Manjarrez Quimiz
al no ver tailwind no me agrada como lo estamos usando en el curso, no entiendo la mayoria de cosas, sin embargo como lo voy revisando he de admitir que si abrevia varias cosas. Aqui como lo deje
<div> @for(itemsCart of cart; track itemsCart.id){ <article class="grid grid-cols-[80px_1fr] gap-3 p-3 border-b"> <img class="w-16 h-16 object-cover rounded" [src]="itemsCart.image"> <div class="flex flex-col justify-center"> <p class="font-medium"> {{ itemsCart.title }} </p> <p class="text-sm"> ${{ itemsCart.price }} </p> </div> </article> } </div>
Raúl Adolfo Sánchez Rodríguez
Raúl Adolfo Sánchez Rodríguez
Aprendiz Ada
Aprendiz Ada
v2
Saskia Milagros Cornejo Flores
me quedó así
Aprendiz Ada
nice
Heydi García Sánchez
Asi vamos, utilice componentes flowbite bagde en este caso
Brenda Sutara
Semanticamente deberíamos ponerle a esta etiqueta que encierra el SideMenu "aside" en vez de div?
Yuliani Paoleth Alcántara Galindo
Obviamente
Luis Angel Castillo Vega
En que momento: this.cart.update((prev) => [...prev, event]); se convirtio en una señan?? de donde??
Kengya Moncada
interesante!!
Junior Jose Blanco Mercedes
el contador no me funciona
Martha Elba Coreño Avila
yo lo hice de esta manera :
<div *ngFor = "let product of cart"> <div class="flex items-center border-b border-gray-300 py-4"> <img class="w-12 h-12 object-cover rounded" :[src]=product.image alt="Product Image"> <div class="ml-4"> <p class="text-gray-800">{{ product.title }}</p> </div> <div class="ml-auto"> <p class="text-gray-600">{{ product.price }}</p> </div> </div> <div class="mt-auto flex justify-end"> <p class="text-xl font-semibold">Total: {{totalPrice}}</p> </div> ```\<div \*ngFor = "let product of cart"> \<div class="flex items-center border-b border-gray-300 py-4"> \<img class="w-12 h-12 object-cover rounded" :\[src]=product.image alt="Product Image"> \<div class="ml-4"> \<p class="text-gray-800">{{ product.title }}\</p> \</div> \<div class="ml-auto"> \<p class="text-gray-600">{{ product.price }}\</p> \</div> \</div> \<div class="mt-auto flex justify-end"> \<p class="text-xl font-semibold">Total: {{totalPrice}}\</p> \</div>