Pourquoi cette question fait exploser Stack Overflow (et votre cerveau) ?
\nVous écrivez votre premier projet Angular. Vous créez un composant, vous lui appliquez le décorateur @Component — tout fonctionne. Ensuite, vous voyez @Directive dans le code de quelqu'un d'autre et vous pensez : « Pourquoi ? C'est la même chose, non ? ». Spoiler : non, ce n'est pas la même chose. Mais la confusion survient chez 90% des débutants.
La question « @Directive vs @Component in Angular » a accumulé des milliers de vues sur Stack Overflow pour une bonne raison. Mettons une bonne fois pour toutes les choses au clair : quelle est la différence, quand utiliser quoi et comment ne pas se ridiculiser lors d'un entretien. C'est parti !
\n\nQu'est-ce que @Component ? (Spoiler : c'est aussi une @Directive)
\nPour commencer, levons le voile. @Component est un sous-type de @Directive. Oui, vous avez bien entendu. Tout composant dans Angular est une directive. Mais avec une différence importante : le composant a un template.
Le décorateur @Component hérite de tout ce que possède @Directive et ajoute sa « spécificité » — la capacité d'afficher du HTML. Si une directive est un « comportement », alors un composant est un « comportement + un morceau d'interface ».
Exemple d'un composant simple en TypeScript
\nimport { Component } from '@angular/core';\n\n@Component({\n selector: 'app-hello',\n template: `<h1>Bonjour, {{name}}!</h1>`,\n styles: ['h1 { color: blue; }']\n})\nexport class HelloComponent {\n name: string = 'Monde';\n}\n\nIci, HelloComponent est un composant complet. Il possède son propre template, ses styles et sa logique. Il peut être utilisé dans un autre template comme <app-hello></app-hello>.
Qu'est-ce que @Directive ? (Comportement pur)
\nUne directive est une classe avec le décorateur @Directive qui modifie le comportement ou l'apparence d'un élément DOM existant. Une directive n'a pas de template propre. Elle ne crée pas un nouvel élément — elle se « fixe » sur un élément déjà existant.
Dans Angular, il existe trois types de directives :
\n- \n
- Les composants (oui, ce sont aussi des directives) — avec un template. \n
- Les directives structurelles — modifient la structure du DOM (
*ngIf,*ngFor). \n - Les directives d'attribut — changent l'apparence ou le comportement d'un élément (
ngClass,ngStyle). \n
Exemple d'une directive d'attribut en TypeScript
\nimport { Directive, ElementRef, HostListener } from '@angular/core';\n\n@Directive({\n selector: '[appHighlight]'\n})\nexport class HighlightDirective {\n constructor(private el: ElementRef) {}\n\n @HostListener('mouseenter') onMouseEnter() {\n this.el.nativeElement.style.backgroundColor = 'yellow';\n }\n\n @HostListener('mouseleave') onMouseLeave() {\n this.el.nativeElement.style.backgroundColor = null;\n }\n}\n\nCette directive surligne l'élément en jaune au survol de la souris. Elle ne crée pas un nouveau nœud DOM — elle « modifie » celui qui existe. Elle s'utilise ainsi : <div appHighlight>Survole-moi</div>.
Différences clés entre @Directive et @Component
\nMettons les choses au clair. Voici un tableau qui vous aidera à retenir la différence une bonne fois pour toutes :
\n\n| Caractéristique | \n@Component | \n@Directive | \n
|---|---|---|
| Présence d'un template | \n✅ Oui, obligatoire | \n❌ Non | \n
| Crée un nouvel élément DOM | \n✅ Oui (via le sélecteur) | \n❌ Non (s'applique à un élément existant) | \n
| Présence de styles (styles) | \n✅ Oui, possibilité d'isolation | \n❌
BlogsBook RecommendationsLire aussi |