Gestión de Carrito de Compras en Angular con ngOnChanges
Clase 46 de 71 • Curso de Angular: Creación de Aplicaciones Web
Resumen
¿Cómo funciona la arquitectura actual de componentes en Angular?
Para dominar Angular, es fundamental entender cómo los componentes se comunican entre sí. En este caso, la arquitectura consta de tres nodos base, con ListComponent
funcionando como un nodo maestro. Este nodo maestro gestiona la comunicación entre componentes a través de inputs
y outputs
.
- Renderización de múltiples productos:
ListComponent
usang-for
para renderizar múltiples productos. - Comunicación entre componentes:
- Cada vez que un usuario añade un producto al carrito,
ProductComponent
envía una notificación aListComponent
por medio de unoutput
. ListComponent
no solo mantiene una referencia de los productos en el carrito, sino que además notifica aHeaderComponent
de los cambios por medio de uninput
.HeaderComponent
actualiza el carrito de compras en el side menu de la aplicación.
- Cada vez que un usuario añade un producto al carrito,
Este flujo asegura una interacción reactiva y eficiente entre los componentes. Un reto adicional ha sido mejorar el aspecto visual y calcular el total de la lista del carrito.
¿Cómo mejorar el aspecto visual y cálculo del total?
Para una mejor presentación visual, se usaron mejoras sencillas utilizando flex
para organizar la imagen, título y precio del producto en un formato más ordenado y claro. Sin embargo, el objetivo final importante es mostrar el total de los productos en el carrito. Esto se puede lograr siguiendo estos pasos:
¿Cómo calcular el total de los productos?
Proponiendo un método dentro de HeaderComponent
llamado CalcularTotal
, se logra acumular el precio de todos los productos en el carrito. Una forma eficiente de hacerlo es usando el método reduce
en JavaScript.
calcularTotal() {
return this.carrito.reduce((total, producto) => total + producto.price, 0);
}
- Acumulador: Inicializado en cero y actualizándose con el precio de cada producto.
- Retorno del total: Este método devuelve directamente el total acumulado.
¿Por qué evitar funciones en el template?
Aunque string interpolation en Angular permite llamar funciones directamente en el template, hacerlo puede afectar el rendimiento de la aplicación, a menos que la función sea un signAll
. Para evitar problemas de rendimiento:
- Mantener los datos procesados en el template: Ya preprocesados para evitar ejecución directa.
- Uso de señales o computed signals: Aunque
card
no es una señal y no se puede usar directamente comocomputed
, es importante gestionar cómo se recalcula el total con nuevos datos.
¿Cuál es una solución más eficiente?
Adoptar prácticas recomendadas usando ngOnChanges
para recalcular el total cuando hay cambios en el input
:
- Crear una variable
total
como señal:
total = signAll(0);
- Uso de
ngOnChanges
: Verifica cambios en elinput
.
ngOnChanges(changes: SimpleChanges) {
if (changes.carrito) {
this.total.set(this.calcularTotal());
}
}
- Propagación: Cada cambio en
carrito
recalcula eltotal
. - Mejor rendimiento: Sin ejecutar funciones en el template directamente, quedando optimizado mediante señales.
Con este enfoque, Angular optimiza la interacción de componentes y mejora el rendimiento al evitar funciones directas dentro del template. Además, fomentar estas prácticas avanzadas asegura un código limpio, eficiente y escalable. Recuerda que la programación es un mundo vasto y siempre hay nuevas técnicas y estrategias por aprender. ¡Sigue explorando y ampliando tus habilidades!