@Directive vs @Component dans Angular : quelle est la différence et que choisir pour un débutant en 2024 ?

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Pourquoi cette question fait exploser Stack Overflow (et votre cerveau) ?

\n

Vous é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.

\n

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\n

Qu'est-ce que @Component ? (Spoiler : c'est aussi une @Directive)

\n

Pour 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.

\n

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 ».

\n\n

Exemple d'un composant simple en TypeScript

\n
import { 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
\n

Ici, 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>.

\n\n

Qu'est-ce que @Directive ? (Comportement pur)

\n

Une 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.

\n

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
\n\n

Exemple d'une directive d'attribut en TypeScript

\n
import { 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
\n

Cette 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>.

\n\n

Différences clés entre @Directive et @Component

\n

Mettons les choses au clair. Voici un tableau qui vous aidera à retenir la différence une bonne fois pour toutes :

\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
Caractéristique@Component@Directive
Présence d'un template✅ Oui, obligatoire❌ Non
Crée un nouvel élément DOM✅ Oui (via le sélecteur)❌ Non (s'applique à un élément existant)
Présence de styles (styles)✅ Oui, possibilité d'isolation❌

Blogs

Book Recommendations