Dekoratör Referansı
Dekoratör referansı, Angular uygulama geliştirme sürecinde kritik bir rol oynar ve komponent tabanlı mimarinin temel taşlarından biridir. Dekoratörler, sınıflara, metodlara veya özelliklere meta veriler ekleyerek Angular’ın bileşenleri, direktifleri, pipe’ları ve servisleri yönetmesini sağlar. Bu yapı, modern web uygulamalarında ve SPA’larda bileşenlerin tekrar kullanılabilir, sürdürülebilir ve optimize edilmiş şekilde geliştirilmesine olanak tanır.
Angular’da sık kullanılan dekoratörler arasında @Component, @Directive, @Pipe, @Injectable ve @NgModule bulunur. @Component bir UI bileşeni oluşturur, @Directive DOM manipülasyonu sağlar, @Pipe veri dönüşümleri gerçekleştirir, @Injectable bağımlılık enjeksiyonu için kullanılır ve @NgModule uygulama modüllerini organize eder. Ayrıca @Input ve @Output dekoratörleri, bileşenler arasında veri iletimini kolaylaştırırken @ViewChild ve @ContentChild, şablon ve içerik erişimini yönetir.
Bu referans, okuyucuya dekoratörlerin nasıl doğru ve verimli kullanılacağını öğretir, prop drilling ve gereksiz yeniden render gibi yaygın hatalardan kaçınmayı sağlar. Ayrıca veri akışı, state yönetimi ve lifecycle hook’larının etkin kullanımını göstererek Angular projelerinde yüksek performanslı ve bakımı kolay uygulamalar geliştirmeyi mümkün kılar.
Temel Örnek
typescriptimport { Component, Input } from '@angular/core';
@Component({
selector: 'app-user-card',
template: ` <div class="card"> <h2>{{ name }}</h2> <p>Yaş: {{ age }}</p> </div>
`,
styles: [` .card {
padding: 16px;
border-radius: 8px;
background-color: #f5f5f5;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
text-align: center;
}
`]
})
export class UserCardComponent {
@Input() name!: string;
@Input() age!: number;
}
Yukarıdaki örnekte, @Component dekoratörü UserCardComponent sınıfını Angular bileşeni haline getirir. selector, HTML şablonunda bileşenin kullanılacağı etiketi belirtir; template ve styles ise görsel sunumu yönetir. @Input dekoratörleri, bileşenlerin ebeveynlerinden veri almasını sağlar ve prop drilling ihtiyacını ortadan kaldırır.
Angular, lifecycle hook’ları sayesinde bileşenin başlatılması, render edilmesi ve yok edilmesini otomatik yönetir. @Input ile işaretlenmiş özelliklerdeki değişiklikler, DOM’a otomatik yansır ve gereksiz yeniden render işlemleri engellenir. Bu örnek, dekoratörlerin veri akışı ve state yönetimini nasıl kolaylaştırdığını ve gerçek projelerde tekrar kullanılabilir bileşenler oluşturmayı nasıl desteklediğini gösterir.
Pratik Örnek
typescriptimport { Component, Input, Output, EventEmitter } from '@angular/core';
@Component({
selector: 'app-counter',
template: ` <div class="counter"> <h3>Sayaç: {{ count }}</h3> <button (click)="increment()">+</button> <button (click)="decrement()">-</button> </div>
`,
styles: [` .counter {
display: flex;
gap: 10px;
justify-content: center;
align-items: center;
}
`]
})
export class CounterComponent {
@Input() count: number = 0;
@Output() countChange = new EventEmitter<number>();
increment() {
this.count++;
this.countChange.emit(this.count);
}
decrement() {
this.count--;
this.countChange.emit(this.count);
}
}
Advanced Angular Implementation
typescriptimport { Component, Input, Output, EventEmitter, OnInit, OnChanges, SimpleChanges } from '@angular/core';
@Component({
selector: 'app-smart-counter',
template: ` <div class="smart-counter"> <h3>Akıllı Sayaç: {{ value }}</h3> <button (click)="increase()">+</button> <button (click)="decrease()">-</button> </div>
`,
styles: [` .smart-counter {
background-color: #e0f7fa;
padding: 16px;
border-radius: 12px;
text-align: center;
}
`]
})
export class SmartCounterComponent implements OnInit, OnChanges {
@Input() value: number = 0;
@Output() valueChange = new EventEmitter<number>();
ngOnInit() {
console.log('SmartCounter başlatıldı, değer:', this.value);
}
ngOnChanges(changes: SimpleChanges) {
if (changes['value']) {
console.log('Değer değişti:', changes['value'].currentValue);
}
}
increase() {
this.value++;
this.valueChange.emit(this.value);
}
decrease() {
this.value--;
this.valueChange.emit(this.value);
}
}
SmartCounterComponent örneği, @Input, @Output ve lifecycle hook’ları olan OnInit ile OnChanges’i bir araya getirir. Bu yapı, state yönetimi ve veri akışının optimize edilmesini sağlar. Dekoratörler, bileşenlerin tekrar kullanılabilir olmasına ve gereksiz re-render işlemlerinin önlenmesine yardımcı olur. Gerçek projelerde bu yaklaşım, performanslı ve sürdürülebilir Angular uygulamaları geliştirmek için temel bir stratejidir.
En iyi uygulamalar, sadece gerekli veriler için @Input kullanmayı ve olaylar için @Output tanımlamayı içerir. State mutasyonlarından kaçınmak ve gereksiz prop drilling’i engellemek önemlidir. Performans optimizasyonu için ChangeDetectionStrategy.OnPush önerilir. Angular DevTools ile lifecycle ve EventEmitter yönetimi izlenebilir. Dekoratörlerin doğru kullanımı, güvenli, hızlı ve ölçeklenebilir Angular uygulamaları sağlar.
📊 Kapsamlı Referans
Angular Element/Method | Description | Syntax | Example | Notes |
---|---|---|---|---|
@Component | Bileşen tanımlar | @Component({...}) | @Component({ selector:'app-demo', template:'...' }) | Ana dekoratör |
@Directive | Direktif oluşturur | @Directive({...}) | @Directive({ selector:'[highlight]' }) | DOM manipülasyonu |
@Pipe | Veri dönüştürür | @Pipe({...}) | @Pipe({name:'capitalize'}) | Şablon veri dönüşümü |
@NgModule | Modül tanımlar | @NgModule({...}) | @NgModule({ declarations:[], imports:[] }) | Uygulama modülleri |
@Injectable | DI için | @Injectable({...}) | @Injectable({ providedIn:'root' }) | Bağımlılık enjeksiyonu |
@Input | Veri alır | @Input() prop:type | @Input() title:string | Ebeveynden veri |
@Output | Olay gönderir | @Output() event=new EventEmitter() | @Output() clicked=new EventEmitter() | Bileşenler arası iletişim |
@HostListener | DOM eventi dinler | @HostListener('click') handler(){} | @HostListener('window:scroll') onScroll() | Etkinlik bağlama |
@ViewChild | Çocuk elemente erişim | @ViewChild(ChildComponent) child!:ChildComponent | Bileşen içi erişim | |
@ContentChild | Projeksiyon içeriği | @ContentChild(TemplateRef) tpl!:TemplateRef | İçerik yönetimi | |
@HostBinding | DOM property bağlama | @HostBinding('class.active') isActive=true | Dinamik sınıf/özellik |
📊 Complete Angular Properties Reference
Property | Values | Default | Description | Angular Support |
---|---|---|---|---|
selector | string | none | Bileşen seçici | tüm sürümler |
template | string | none | Bileşen şablonu | 2+ |
styles | array | string[] | none | CSS stilleri |
providers | array | [] | DI sağlayıcıları | 2+ |
inputs | array | [] | @Input listesi | 4+ |
outputs | array | [] | @Output listesi | 4+ |
animations | array | [] | Bileşen animasyonları | 4+ |
changeDetection | string | 'Default' | Change Detection stratejisi | 5+ |
encapsulation | string | 'Emulated' | CSS kapsülleme | 2+ |
standalone | boolean | false | Bağımsız bileşen | 14+ |
imports | array | [] | Modül importları | 14+ |
schemas | array | [] | Özel element izinleri | 9+ |
Dekoratör referansını anlamak, yeniden kullanılabilir ve optimize edilmiş bileşenler geliştirmeyi sağlar. Veri akışı, state yönetimi ve lifecycle hook’larını kavramak, performanslı ve sürdürülebilir Angular uygulamalarının temelidir. İleri seviye konular olarak Dependency Injection, lifecycle hook’ları, Change Detection ve RxJS ile asenkron veri yönetimi üzerine çalışmak önerilir.
🧠 Bilginizi Test Edin
Bilginizi Test Edin
Bu interaktif sınavla kendini test et ve konuyu ne kadar iyi anladığını gör
📝 Talimatlar
- Her soruyu dikkatle okuyun
- Her soru için en iyi cevabı seçin
- Quiz'i istediğiniz kadar tekrar alabilirsiniz
- İlerlemeniz üstte gösterilecek