@Directive vs @Component en Angular: ¿cuál es la diferencia y qué elegir para un principiante en 2024?

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

¿Por qué esta pregunta explota Stack Overflow (y tu cerebro)?

\n

Está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.

\n

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)

\n

Para 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).

\n

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

\n\n

Ejemplo de un componente simple en TypeScript

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

Aquí HelloComponent es un componente completo. Tiene su propia plantilla, estilos y lógica. Puede usarse en otra plantilla como <app-hello></app-hello>.

\n\n

¿Qué es @Directive? (Comportamiento puro)

\n

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

\n

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

Ejemplo de una directiva de atributo 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

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

\n\n

Diferencias clave entre @Directive vs @Component

\n

Vamos a desglosarlo. Aquí tienes una tabla que te ayudará a recordar la diferencia de una vez por todas:

\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
Característica@Component@Directive
Presencia de plantilla (template)✅ Sí, obligatorio❌ No
Crea un nuevo elemento DOM✅ Sí (a través del selector)❌ No (se aplica a uno existente)
Presencia de estilos (styles)✅ Sí, se pueden aislar❌

Blogs

Book Recommendations