¿Por qué esta pregunta explota Stack Overflow (y tu cerebro)?
\nEstás escribiendo tu primer proyecto en Angular. Creas un componente, le pones el decorador @Component — todo funciona. Luego ves en código ajeno @Directive y piensas: «¿Y eso? ¿No es lo mismo?». Spoiler: no, no es lo mismo. Pero la confusión surge en el 90% de los principiantes.
La pregunta «@Directive vs @Component in Angular» ha acumulado miles de visitas en Stack Overflow por una razón. Aclaremos de una vez por todas cuál es la diferencia, cuándo usar cada uno y cómo no quedar mal en una entrevista. ¡Allá vamos!
\n\n¿Qué es @Component? (Spoiler: también es @Directive)
\nPara empezar, una revelación. @Component es un subtipo de @Directive. Sí, oíste bien. Cualquier componente en Angular es una directiva. Pero con una diferencia importante: el componente tiene una plantilla (template).
El decorador @Component hereda todo de @Directive y añade su «característica especial»: la capacidad de renderizar HTML. Si la directiva es «comportamiento», el componente es «comportamiento + un fragmento de interfaz».
Ejemplo de un componente simple en TypeScript
\nimport { Component } from '@angular/core';\n\n@Component({\n selector: 'app-hello',\n template: `<h1>¡Hola, {{name}}!</h1>`,\n styles: ['h1 { color: blue; }']\n})\nexport class HelloComponent {\n name: string = 'Mundo';\n}\n\nAquí HelloComponent es un componente completo. Tiene su propia plantilla, estilos y lógica. Puede usarse en otra plantilla como <app-hello></app-hello>.
¿Qué es @Directive? (Comportamiento puro)
\nUna directiva es una clase con el decorador @Directive que modifica el comportamiento o la apariencia de un elemento DOM existente. La directiva no tiene su propia plantilla. No crea un nuevo elemento — se «engancha» a uno ya existente.
En Angular hay tres tipos de directivas:
\n- \n
- Componentes (sí, también son directivas) — con plantilla. \n
- Directivas estructurales — modifican la estructura del DOM (
*ngIf,*ngFor). \n - Directivas de atributo — cambian la apariencia o el comportamiento de un elemento (
ngClass,ngStyle). \n
Ejemplo de una directiva de atributo 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\nEsta directiva resalta el elemento en amarillo al pasar el ratón. No crea un nuevo nodo DOM — «modifica» el existente. Se usa así: <div appHighlight>Pasa el ratón sobre mí</div>.
Diferencias clave entre @Directive vs @Component
\nVamos a desglosarlo. Aquí tienes una tabla que te ayudará a recordar la diferencia de una vez por todas:
\n\n| Característica | \n@Component | \n@Directive | \n
|---|---|---|
| Presencia de plantilla (template) | \n✅ Sí, obligatorio | \n❌ No | \n
| Crea un nuevo elemento DOM | \n✅ Sí (a través del selector) | \n❌ No (se aplica a uno existente) | \n
| Presencia de estilos (styles) | \n✅ Sí, se pueden aislar | \n❌
BlogsBook RecommendationsLeer también |