Référence des décorateurs
Dans Angular, les décorateurs sont des fonctionnalités essentielles qui permettent d’ajouter des métadonnées aux classes, propriétés et méthodes, indiquant au framework comment traiter ces entités dans l’application. La maîtrise des décorateurs est cruciale pour concevoir des architectures basées sur les composants, gérer efficacement l’état, contrôler le flux de données et gérer le cycle de vie des composants dans les applications web modernes et les SPA.
Les décorateurs principaux d’Angular incluent @Component, @Directive, @Pipe, @Injectable et @NgModule. Chacun a un rôle spécifique : @Component définit un composant d’interface utilisateur, @Directive crée des directives personnalisées, @Pipe gère la transformation des données, @Injectable facilite l’injection de dépendances et @NgModule organise des classes connexes en modules cohérents. Des décorateurs additionnels comme @Input et @Output gèrent la liaison de données entre composants parents et enfants, tandis que @ViewChild et @ContentChild offrent un accès aux composants enfants ou au contenu projeté.
Ce guide fournit des explications détaillées et des exemples pratiques sur l’utilisation des décorateurs pour gérer la logique des composants, la communication d’événements et les interactions du cycle de vie, tout en évitant les pièges courants tels que le prop drilling, les re-renders inutiles et les mutations d’état directes. Les lecteurs apprendront à structurer des composants performants, réutilisables et maintenables, tout en suivant les bonnes pratiques pour des projets Angular de niveau entreprise.
Exemple de Base
typescriptimport { Component, Input } from '@angular/core';
@Component({
selector: 'app-user-card',
template: ` <div class="card"> <h2>{{ name }}</h2> <p>Âge : {{ 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;
}
Dans cet exemple de base, le décorateur @Component définit UserCardComponent comme un composant Angular réutilisable. Le sélecteur spécifie la balise HTML personnalisée, tandis que le template et les styles définissent la vue et le CSS du composant. Les décorateurs @Input permettent au composant de recevoir des données depuis son parent, assurant une gestion contrôlée de l’état et évitant le prop drilling.
Le cycle de vie du composant est géré automatiquement par Angular, garantissant l’initialisation, le rendu et la destruction appropriés. La liaison des propriétés d’entrée met à jour automatiquement la vue lorsque les données du parent changent, minimisant les re-renders inutiles. Cet exemple illustre comment les décorateurs structurent la conception des composants, la gestion de l’état et le flux de données dans des projets Angular, tout en garantissant la réutilisabilité et la performance.
Exemple Pratique
typescriptimport { Component, Input, Output, EventEmitter } from '@angular/core';
@Component({
selector: 'app-counter',
template: ` <div class="counter"> <h3>Compteur : {{ count }}</h3> <button (click)="increment()">+</button> <button (click)="decrement()">-</button> </div>
`,
styles: [` .counter {
display: flex;
gap: 10px;
align-items: center;
justify-content: 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>Compteur intelligent : {{ value }}</h3> <button (click)="increase()">+</button> <button (click)="decrease()">-</button> </div>
`,
styles: [` .smart-counter {
background-color: #eef2f7;
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 initialisé avec valeur :', this.value);
}
ngOnChanges(changes: SimpleChanges) {
if (changes['value']) {
console.log('Valeur modifiée :', changes['value'].currentValue);
}
}
increase() {
this.value++;
this.valueChange.emit(this.value);
}
decrease() {
this.value--;
this.valueChange.emit(this.value);
}
}
L’exemple avancé SmartCounterComponent combine les décorateurs @Input et @Output avec les hooks du cycle de vie OnInit et OnChanges pour gérer les données externes de manière réactive et contrôler l’état interne. Les valeurs initiales et les changements sont enregistrés pour faciliter le débogage, tandis que EventEmitter permet de notifier le parent des modifications.
Cet exemple démontre comment les décorateurs structurent des composants Angular performants et réutilisables tout en évitant les erreurs courantes comme le prop drilling et les re-renders inutiles. L’utilisation conjointe des hooks du cycle de vie, des décorateurs et des événements permet un contrôle précis du comportement et du flux de données, améliorant la maintenabilité et les performances.
Bonnes pratiques et pièges courants : Utilisez @Input uniquement pour les données nécessaires et @Output pour les événements clairement définis. Évitez les mutations directes d’état et le prop drilling excessif. L’utilisation de ChangeDetectionStrategy.OnPush optimise les performances et réduit les re-renders inutiles. Pour le débogage, Angular DevTools permet de suivre le cycle de vie et les émissions d’événements. En matière de sécurité, évitez l’injection de données non fiables et activez la vérification stricte des templates. L’usage approprié des décorateurs assure des applications Angular évolutives, maintenables et performantes.
📊 Référence Complète
Angular Element/Method | Description | Syntax | Example | Notes |
---|---|---|---|---|
@Component | Définit un composant | @Component({...}) | @Component({ selector:'app-demo', template:'...' }) | Décorateur le plus utilisé |
@Directive | Directive personnalisée | @Directive({...}) | @Directive({ selector:'[highlight]' }) | Étend le comportement du DOM |
@Pipe | Transformation de données | @Pipe({...}) | @Pipe({name:'capitalize'}) | Transforme les données dans le template |
@NgModule | Définit un module | @NgModule({...}) | @NgModule({ declarations:[], imports:[] }) | Organise composants et directives |
@Injectable | Injection de service | @Injectable({...}) | @Injectable({ providedIn:'root' }) | Injection de dépendances |
@Input | Propriété d’entrée | @Input() prop:type | @Input() title:string | Flux de données parent-enfant |
@Output | Événement de sortie | @Output() event=new EventEmitter() | @Output() clicked=new EventEmitter() | Communication enfant-parent |
@HostListener | Écoute des événements DOM | @HostListener('click') handler(){} | @HostListener('window:scroll') onScroll() | Lie événements sur l’hôte |
@ViewChild | Accès au composant enfant | @ViewChild(ChildComponent) child!:ChildComponent | Manipuler instance enfant | |
@ContentChild | Accès au contenu projeté | @ContentChild(TemplateRef) tpl!:TemplateRef | Manipuler template projeté | |
@HostBinding | Liaison propriété hôte | @HostBinding('class.active') isActive=true | Lier dynamiquement attributs DOM |
📊 Complete Angular Properties Reference
Property | Values | Default | Description | Angular Support |
---|---|---|---|---|
selector | string | none | Sélecteur du composant | Toutes versions |
template | string | none | Template du composant | 2+ |
styles | array | string[] | none | Styles CSS |
providers | array | [] | Fournisseurs de dépendances | 2+ |
inputs | array | [] | Liste des propriétés @Input | 4+ |
outputs | array | [] | Liste des événements @Output | 4+ |
animations | array | [] | Animations du composant | 4+ |
changeDetection | string | 'Default' | Stratégie de détection des changements | 5+ |
encapsulation | string | 'Emulated' | Encapsulation CSS | 2+ |
standalone | boolean | false | Composant autonome | 14+ |
imports | array | [] | Modules importés | 14+ |
schemas | array | [] | Autoriser éléments personnalisés | 9+ |
En résumé, maîtriser les décorateurs Angular permet de créer des composants maintenables, performants et réutilisables. Cela facilite la gestion de l’état, le contrôle du flux de données et la manipulation précise du cycle de vie. Les étapes suivantes consistent à explorer l’injection de dépendances, les hooks du cycle de vie, la stratégie de détection des changements et l’utilisation de RxJS pour le traitement asynchrone. L’application de ces techniques dans des projets réels, combin
ée à l’optimisation des performances et aux outils de débogage, permet d’atteindre un niveau avancé de développement Angular prêt pour la production.
🧠 Testez Vos Connaissances
Testez Vos Connaissances
Mettez-vous au défi avec ce quiz interactif et voyez à quel point vous comprenez le sujet
📝 Instructions
- Lisez chaque question attentivement
- Sélectionnez la meilleure réponse pour chaque question
- Vous pouvez refaire le quiz autant de fois que vous le souhaitez
- Votre progression sera affichée en haut