Referência de Decorators
Em Angular, os decorators são funções especiais que adicionam metadados a classes, propriedades, métodos ou parâmetros, indicando ao framework como esses elementos devem se comportar. A Referência de Decorators é essencial porque fornece uma visão completa de como estruturar componentes reutilizáveis, gerenciar estado, controlar fluxo de dados e lifecycle de aplicações modernas e SPAs.
Decorators como @Component, @Directive, @Pipe, @Injectable e @NgModule são fundamentais. @Component define elementos de interface, @Directive cria comportamentos customizados, @Pipe transforma dados em templates, @Injectable permite injeção de dependências e @NgModule organiza classes em módulos. Decorators adicionais, como @Input e @Output, facilitam a comunicação entre componentes pai e filho, enquanto @ViewChild e @ContentChild permitem acessar filhos ou conteúdo projetado no template.
Esta referência ensina como aplicar cada decorator seguindo as melhores práticas de Angular, evitando armadilhas comuns, como prop drilling, re-renderizações desnecessárias e mutações de estado. Ao final, o leitor estará apto a aplicar decorators de forma eficiente em projetos reais, garantindo componentes escaláveis, de alta performance e manutenção simplificada.
Exemplo Básico
typescriptimport { Component, Input } from '@angular/core';
@Component({
selector: 'app-user-card',
template: ` <div class="card"> <h2>{{ name }}</h2> <p>Idade: {{ age }}</p> </div>
`,
styles: [` .card {
padding: 16px;
border-radius: 8px;
background-color: #f0f0f0;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
text-align: center;
}
`]
})
export class UserCardComponent {
@Input() name!: string;
@Input() age!: number;
}
No exemplo acima, o decorator @Component transforma a classe UserCardComponent em um componente reutilizável. O selector define a tag HTML para inserção no template, enquanto template e styles definem a interface e aparência do componente. Os decorators @Input permitem que dados sejam passados do componente pai, evitando prop drilling e simplificando a gestão de estado.
O Angular gerencia automaticamente o ciclo de vida do componente, incluindo inicialização, renderização e destruição. Alterações nas propriedades @Input atualizam automaticamente a view, reduzindo re-renderizações desnecessárias. Este exemplo demonstra como decorators controlam o fluxo de dados, o gerenciamento de estado e a estrutura do componente em projetos reais.
Exemplo Prático
typescriptimport { Component, Input, Output, EventEmitter } from '@angular/core';
@Component({
selector: 'app-counter',
template: ` <div class="counter"> <h3>Contador: {{ count }}</h3> <button (click)="increment()">+</button> <button (click)="decrement()">-</button> </div>
`,
styles: [` .counter {
display: flex;
gap: 10px;
align-items: center;
justify-content: center;
}
`]
})
export class CounterComponent {
@Input() count: number = 0;
@Output() countChange = new EventEmitter<number>();
increment() {
this.count++;
this.countChange.emit(this.count);
}
decrement() {
this.count--;
this.countChange.emit(this.count);
}
}
Advanced Angular Implementation
typescriptimport { Component, Input, Output, EventEmitter, OnInit, OnChanges, SimpleChanges } from '@angular/core';
@Component({
selector: 'app-smart-counter',
template: ` <div class="smart-counter"> <h3>Contador Inteligente: {{ value }}</h3> <button (click)="increase()">+</button> <button (click)="decrease()">-</button> </div>
`,
styles: [` .smart-counter {
background-color: #e0f7fa;
padding: 16px;
border-radius: 12px;
text-align: center;
}
`]
})
export class SmartCounterComponent implements OnInit, OnChanges {
@Input() value: number = 0;
@Output() valueChange = new EventEmitter<number>();
ngOnInit() {
console.log('SmartCounter inicializado com valor:', this.value);
}
ngOnChanges(changes: SimpleChanges) {
if (changes['value']) {
console.log('Valor alterado:', changes['value'].currentValue);
}
}
increase() {
this.value++;
this.valueChange.emit(this.value);
}
decrease() {
this.value--;
this.valueChange.emit(this.value);
}
}
O SmartCounterComponent utiliza @Input, @Output e hooks de lifecycle como OnInit e OnChanges para gerenciar dados de forma reativa e comunicar alterações ao componente pai. Decorators tornam o componente reutilizável, otimizado e seguro, prevenindo prop drilling e re-renderizações desnecessárias. Esta integração de fluxo de dados e gerenciamento de estado permite a criação de componentes escaláveis e manuteníveis, essenciais em aplicações reais.
Boas práticas incluem usar @Input apenas para dados essenciais e @Output para eventos específicos. Evite alterar diretamente o estado ou usar prop drilling excessivo. Para otimização de performance, considere ChangeDetectionStrategy.OnPush. Utilize ferramentas como Angular DevTools para monitorar lifecycle e EventEmitter. Evite injetar dados inseguros e habilite template checking. O uso correto de decorators garante aplicativos Angular seguros, performáticos e escaláveis.
📊 Referência Completa
| Angular Element/Method | Description | Syntax | Example | Notes |
|---|---|---|---|---|
| @Component | Define um componente | @Component({...}) | @Component({ selector:'app-demo', template:'...' }) | Decorator mais usado |
| @Directive | Cria diretiva customizada | @Directive({...}) | @Directive({ selector:'[highlight]' }) | Manipula DOM |
| @Pipe | Transforma dados | @Pipe({...}) | @Pipe({name:'capitalize'}) | Para alterar exibição de dados |
| @NgModule | Define módulo | @NgModule({...}) | @NgModule({ declarations:[], imports:[] }) | Organiza componentes |
| @Injectable | Permite DI | @Injectable({...}) | @Injectable({ providedIn:'root' }) | Necessário para injeção de dependências |
| @Input | Entrada do componente | @Input() prop:type | @Input() title:string | Recebe dados do pai |
| @Output | Saída do componente | @Output() event=new EventEmitter() | @Output() clicked=new EventEmitter() | Envia dados ao pai |
| @HostListener | Escuta eventos DOM | @HostListener('click') handler(){} | @HostListener('window:scroll') onScroll() | Binding de eventos |
| @ViewChild | Acesso a filhos | @ViewChild(ChildComponent) child!:ChildComponent | Manipula instância do filho | |
| @ContentChild | Acesso a conteúdo projetado | @ContentChild(TemplateRef) tpl!:TemplateRef | Gerencia template content | |
| @HostBinding | Binding de propriedades | @HostBinding('class.active') isActive=true | Binding dinâmico do DOM |
📊 Complete Angular Properties Reference
| Property | Values | Default | Description | Angular Support |
|---|---|---|---|---|
| selector | string | none | Selector do componente | todas versões |
| template | string | none | Template do componente | 2+ |
| styles | array | string[] | none | CSS do componente |
| providers | array | [] | Providers de dependência | 2+ |
| inputs | array | [] | Lista de @Input | 4+ |
| outputs | array | [] | Lista de @Output | 4+ |
| animations | array | [] | Animações | 4+ |
| changeDetection | string | 'Default' | Estratégia de Change Detection | 5+ |
| encapsulation | string | 'Emulated' | Encapsulamento CSS | 2+ |
| standalone | boolean | false | Componente standalone | 14+ |
| imports | array | [] | Módulos importados | 14+ |
| schemas | array | [] | Permite elementos customizados | 9+ |
Aprender a Referência de Decorators capacita desenvolvedores a construir componentes reutilizáveis, otimizados e escaláveis. Esse conhecimento controla fluxo de dados, gerenciamento de estado e ciclo de vida, sendo fundamental para projetos reais. Próximos passos incluem estudar Dependency Injection, lifecycle hooks, Change Detection Strategy e gerenciamento de dados assíncronos com RxJS, consolidando habilidades avançadas em Angular.
🧠 Teste Seu Conhecimento
Teste Seu Conhecimento
Desafie-se com este questionário interativo e veja o quão bem você entende o tópico
📝 Instruções
- Leia cada pergunta cuidadosamente
- Selecione a melhor resposta para cada pergunta
- Você pode refazer o quiz quantas vezes quiser
- Seu progresso será mostrado no topo