Comunicación Padre-Hijo con Inputs y Outputs en Angular
Clase 11 de 20 • Curso de Angular: Componentes y Servicios
Resumen
Establece una comunicación entre un componente padre con uno hijo para saber qué productos quiere agregar el usuario a su carrito de compras y poder visualizar el total a pagar.
Comunicación componente hijo a padre
Paso 1: Agrégale al componente hijo un @Output()
para emitir un mensaje al componente padre cuando el usuario agrega un producto al carrito.
El método addToShoppingCart()
emitirá el evento cuando el usuario haga clic en el botón.
// components/producto/producto.component.ts
@Component({
selector: 'app-producto',
templateUrl: './producto.component.html',
styleUrls: ['./producto.component.scss']
})
export class ProductoComponent {
@Input() producto!: Producto;
@Output() addProduct = new EventEmitter<Producto>();
addToShoppingCart(p: Producto): void {
this.addProduct.emit(p);
}
}
<!-- components/producto/producto.component.html -->
<div>
<h2>{{ producto.name }}</h2>
<img [src]="producto.image" width="200px" height="200px">
<p>Precio: {{ producto.precio }}</p>
<button (click)="addToShoppingCart(producto)">Agregar al carrito</button>
</div>
Paso 2: En el componente padre crea un método para recibir el mensaje, agregarlo al carrito de compras y calcular el monto total a pagar.
// catalogo/catalogo/catalogo.component.ts
@Component({
selector: 'app-catalogo',
templateUrl: './catalogo.component.html',
styleUrls: ['./catalogo.component.scss']
})
export class CatalogoComponent {
public shoppingCart: Producto[] = [];
public total = 0;
public productos: Producto[] = [
/* ... */
];
addProductToCart(p: Producto): void {
this.shoppingCart.push(p);
this.total += p.precio;
}
}
Paso 3: El método addProductToCart()
recibe el producto, lo guarda en el array shoppingCart
y calcula el total a pagar por el usuario. Puedes imprimir estos valores fácilmente con una interpolación.
<!-- catalogo/catalogo/catalogo.component.ts -->
<div *ngIf="productos" class="catalogo">
<app-producto *ngFor="let p of productos"
[producto]="p"
(addProduct)="addProductToCart($event)"
></app-producto>
</div>
<div>
<h3>Cantidad: {{ shoppingCart.length }}</h3>
<h3>Total a pagar: {{ total }}</h3>
</div>
La comunicación de componente es escencial en cualquier aplicación front-end. Es importante saber manipular el envio de información ya sea de forma descendente o ascendente en la jerarquía de componentes.
Contribución creada con los aportes de Kevin Fiorentino.