Merhaba, bu yazıda Angular ile @Input ve @Output kullanarak componentler arası veri gönderme ve işlem yapmayı göreceğiz. Input ve Output nedir? ve nasıl kullanılır? bunları cevaplayarak başlayalım.
Input ve Output kısaca componentler arası bilgi alışverişini sağlayan yapıdır.
@Input: Parent componentten child componente veri göndermek için kullanılır.
@Output: Child componentteki bilgiyi parent componente göndermek için kullanılır.
Blog sitesindeki yazıyı alkışlama ve alkış sayısı üzerinden sıfırdan bir örnek yapalım ve bu iki işlemi daha iyi anlayalım;
İki tane component oluşturalım: post-detail ve clap adında.
ng g c components/post-detail ng g c components/clap
Componentleri oluşturduktan hemen sonra route ayarlamasını yapalım;
app-routing.module.ts
const routes: Routes = [
{
path: '', component: PostDetailComponent
}
]
Şimdi post-detail componentine birkaç paragraf yazı ekleyelim ve clap componenti burada çağıralım;
.post-detail.component.html
<div class="post-detail">
<h1>Lorem ipsum</h1>
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut ultrices nibh a fringilla mattis. Donec posuere tincidunt urna, eget vestibulum libero ornare quis. Vivamus laoreet lobortis sagittis. Maecenas urna nulla, auctor consectetur sem dignissim.
</p>
<app-clap></app-clap>
</div>
clap.component.html
<div class="clap">
<a>
<img class="icon" src="https://image.flaticon.com/icons/svg/109/109669.svg">
<span class="count">1536</span>
</a>
</div>
clap.component.scss
.clap {
a {
display: flex;
align-items: center;
cursor: pointer;
transition: .3s;
.icon {
width: 28px;
height: 28px;
margin-right: 10px;
}
.count {
font-weight: 700;
}
&:hover {
padding-left: 3px;
}
}
}
Şuana kadarki görüntümüz şu şekilde;
Şimdi geldik @Input ve @Output olaylarına. Burada;
- Alkış sayısını parent componentten (PostDetailComponent) child componente (ClapComponent) @Input ile göndereceğiz.
- Alkışlamak için tıkladığımızda ise @Output ile child componentten parent componente bilgi göndereceğiz.
clap.component.ts içerisinde input ve outputları tanımlayalım;
import { Input, Output, EventEmitter } from '@angular/core';
@Input() clapCount: number = 0;
@Output() changeClap = new EventEmitter();
clap() {
this.changeClap.emit();
}
- clapCount: alkış sayımızdır, bunu clap.component.html içerisinde yazdıracağız. Tanımlarken 0 değerini verdik çünkü eğer bu veri gönderilmezse varsayılan olarak 0 ı yazdırsın.
- changeClap: ClapComponent'te alkışa tıklandığı zaman clap() methodunu çalıştıracağız, bu methoddan ise EventEmitter ile parent componente (PostDetailComponent) bu aksiyonu ileteceğiz. Burada istersek veride gönderebiliyoruz .emit(parametre) şeklinde.
clap.component.html'i şu şekilde düzenleyelim;
<div class="clap">
<a (click)="clap()">
<img class="icon" src="https://image.flaticon.com/icons/svg/109/109669.svg">
<span class="count">{{ clapCount }}</span>
</a>
</div>
PostDetailComponent'e geri dönelim şimdi @Input ile tanımladığımız clapCount'u kullanalım;
<app-clap [clapCount]="15"></app-clap>
Bu tanımlamadan sonra 15 olarak gönderdiğimiz alkış sayısı ekrana yazılmış oluyor.
Ama bunu değişkenden alalım, bunun için post-detail.component.ts de clap adında bir değişken oluşturalım ve html de bu değişken ile gönderelim alkış sayısını;
clap = 15;
post-detail.component.html
<app-clap [clapCount]="clap"></app-clap>
Aynı işlemi yapmış olduk.
Şimdide @Output ile tanımladığımız alkışlamak için tıkladığımızda çalışacak changeClap'ı kullanalım ama önce bu iletişimi karşılayacak methodu yazalım;
post-detail.component.ts;
clickClap() {
console.log('alkışlandı...');
}
post-detail.component.html
<app-clap [clapCount]="clap" (changeClap)="clickClap()"></app-clap>
Bu tanımlamadan sonra alkışa tıklandığında konsolda alkışlandı... diye yazdığını görüyoruz. Son olarak alkışlandıkça alkış sayısını arttıralım ve bitirelim. Bu işlemi parent componentteki methodumuzda clickClap() da yapıyoruz;
clickClap() {
console.log('alkışlandı...');
this.clap++;
}
Bu kadar.
Yaptığımız örneği buradan inceleyebilirsiniz.
Umarım detaylara fazla girip zorlaştırmamışımdır konuyu. Çok basit bir konudur. Sorunuz olursa yorumlarda belirtebilirsiniz.
Teşekkürler.

Yorumlar 3 yorum yapıldı.
Yeni Yorum