@Directive vs @Component no Angular: qual a diferença e o que escolher para iniciantes em 2024?

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Por que essa pergunta explode no Stack Overflow (e na sua mente)?

\n

Você está escrevendo seu primeiro projeto em Angular. Cria um componente, coloca o decorador @Component — tudo funciona. Depois vê em um código alheio @Directive e pensa: "Para quê? Não é a mesma coisa?". Spoiler: não, não é a mesma coisa. Mas a confusão acontece com 90% dos iniciantes.

\n

A pergunta "@Directive vs @Component no Angular" acumulou milhares de visualizações no Stack Overflow por um motivo. Vamos entender de uma vez por todas qual é a diferença, quando usar cada um e como não passar vergonha em uma entrevista. Vamos lá!

\n\n

O que é @Component? (Spoiler: também é @Directive)

\n

Para começar — revelação. @Component é um subtipo de @Directive. Sim, você ouviu direito. Qualquer componente no Angular é uma diretiva. Mas com uma diferença importante: o componente tem um template.

\n

O decorador @Component herda tudo de @Directive e adiciona seu "diferencial" — a capacidade de renderizar HTML. Se a diretiva é um "comportamento", o componente é "comportamento + um pedaço de interface".

\n\n

Exemplo de um componente simples em TypeScript

\n
import { Component } from '@angular/core';\n\n@Component({\n  selector: 'app-hello',\n  template: `<h1>Olá, {{name}}!</h1>`,\n  styles: ['h1 { color: blue; }']\n})\nexport class HelloComponent {\n  name: string = 'Mundo';\n}\n
\n

Aqui, HelloComponent é um componente completo. Ele tem seu próprio template, estilos e lógica. Pode ser usado em outro template como <app-hello></app-hello>.

\n\n

O que é @Directive? (Comportamento puro)

\n

Uma diretiva é uma classe com o decorador @Directive que altera o comportamento ou a aparência de um elemento DOM existente. A diretiva não tem seu próprio template. Ela não cria um novo elemento — ela "se prende" a um elemento já existente.

\n

No Angular, existem três tipos de diretivas:

\n
    \n
  • Componentes (sim, eles também são diretivas) — com template.
  • \n
  • Diretivas estruturais — alteram a estrutura do DOM (*ngIf, *ngFor).
  • \n
  • Diretivas de atributo — mudam a aparência ou o comportamento do elemento (ngClass, ngStyle).
  • \n
\n\n

Exemplo de uma diretiva de atributo em 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 diretiva destaca o elemento em amarelo ao passar o mouse. Ela não cria um novo nó DOM — ela "modifica" o existente. É usada assim: <div appHighlight>Passe o mouse em mim</div>.

\n\n

Diferenças principais entre @Directive vs @Component

\n

Vamos organizar tudo. Aqui está uma tabela que vai ajudar você a lembrar a diferença de uma 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
Presença de template✅ Sim, obrigatório❌ Não
Cria um novo elemento DOM✅ Sim (através do seletor)❌ Não (aplica-se a um existente)
Presença de estilos (styles)✅ Sim, pode isolar❌

Blogs

Book Recommendations