Hooks do Ciclo de Vida
Os Hooks do Ciclo de Vida em Angular são métodos especiais que permitem aos desenvolvedores interagir com diferentes estágios de vida de um componente. Eles são fundamentais para controlar o fluxo de dados, gerenciar o estado e otimizar o desempenho em aplicações web modernas e Single Page Applications (SPAs).
Entre os Hooks mais utilizados estão ngOnInit
, ngOnChanges
, ngAfterViewInit
e ngOnDestroy
. O ngOnInit
é ideal para inicialização de dados e início de subscriptions, enquanto o ngOnChanges
é acionado sempre que um @Input()
é alterado. ngAfterViewInit
permite acessar o DOM e componentes filhos após a renderização da view, e ngOnDestroy
é usado para liberar recursos e cancelar subscriptions.
Neste tutorial, você aprenderá a construir componentes reutilizáveis utilizando Hooks do Ciclo de Vida, gerenciar o fluxo de dados de forma eficiente e evitar problemas comuns como prop drilling, re-renderizações desnecessárias e mutações de estado. Ao compreender e aplicar corretamente esses Hooks, seus componentes se tornarão mais previsíveis, performáticos e fáceis de manter em aplicações Angular complexas.
Exemplo Básico
typescriptimport { Component, Input, OnInit, OnChanges, OnDestroy, SimpleChanges } from '@angular/core';
@Component({
selector: 'app-user-profile',
template: ` <div> <h2>Perfil do Usuário</h2> <p>Nome: {{ name }}</p> <p>Status: {{ status }}</p> </div>
`
})
export class UserProfileComponent implements OnChanges, OnInit, OnDestroy {
@Input() name!: string;
status: string = 'Inicializando...';
constructor() {
console.log('Constructor: Componente criado');
}
ngOnChanges(changes: SimpleChanges): void {
console.log('ngOnChanges: mudanças detectadas', changes);
}
ngOnInit(): void {
console.log('ngOnInit: inicializando componente');
this.status = 'Ativo';
}
ngOnDestroy(): void {
console.log('ngOnDestroy: componente será destruído');
}
}
No exemplo acima, UserProfileComponent
demonstra a aplicação de Hooks do Ciclo de Vida. O construtor é usado apenas para criar o componente, evitando lógica pesada. ngOnChanges
é acionado sempre que o valor de @Input()
muda, permitindo reagir a alterações de dados.
ngOnInit
é ideal para inicializar dados ou iniciar subscriptions, enquanto ngOnDestroy
é usado para liberar recursos, prevenindo memory leaks. Este padrão garante que os componentes sejam reutilizáveis, estáveis e performáticos, evitando re-renderizações desnecessárias ou mutações diretas de estado.
Exemplo Prático
typescriptimport { Component, Input, OnInit, OnDestroy } from '@angular/core';
import { Subscription, interval } from 'rxjs';
@Component({
selector: 'app-live-clock',
template: ` <div> <h3>Relógio ao Vivo ({{ timezone }})</h3> <p>{{ currentTime }}</p> </div>
`
})
export class LiveClockComponent implements OnInit, OnDestroy {
@Input() timezone: string = 'UTC';
currentTime: string = '';
private clockSubscription!: Subscription;
ngOnInit(): void {
console.log('ngOnInit: relógio iniciado');
this.clockSubscription = interval(1000).subscribe(() => {
const now = new Date();
this.currentTime = now.toLocaleTimeString('pt-BR', { timeZone: this.timezone });
});
}
ngOnDestroy(): void {
console.log('ngOnDestroy: relógio parado');
if (this.clockSubscription) {
this.clockSubscription.unsubscribe();
}
}
}
Em LiveClockComponent
, os Hooks do Ciclo de Vida gerenciam fluxo de dados e recursos. ngOnInit
cria um Observable que atualiza o horário a cada segundo, enquanto ngOnDestroy
cancela o Observable para evitar memory leaks. Este padrão é essencial para dashboards, aplicativos em tempo real e interfaces dinâmicas, garantindo componentes eficientes e seguros.
Melhores práticas e armadilhas comuns em Angular:
- Inicializar dados em
ngOnInit
e cancelar subscriptions emngOnDestroy
. - Evitar manipulação direta do DOM e mutação direta de estado.
- Não colocar lógica pesada em Hooks do Ciclo de Vida.
- Utilizar
ChangeDetectionStrategy.OnPush
para otimizar re-renderizações. - Limpar dados sensíveis em
ngOnDestroy
para segurança.
📊 Tabela de Referência
Angular Element/Concept | Description | Usage Example |
---|---|---|
ngOnChanges | Chamado quando @Input() muda |
Controlar mudanças de entrada |
ngOnInit | Chamado na inicialização do componente | Inicializar dados, iniciar subscriptions |
ngDoCheck | Detectar mudanças personalizadas | Monitorar lógica complexa |
ngAfterViewInit | Após inicializar a view | Acessar DOM e componentes filhos |
ngOnDestroy | Antes de destruir o componente | Cancelar subscriptions, liberar recursos |
Resumo e próximos passos:
O uso correto dos Hooks do Ciclo de Vida em Angular permite gerenciar estado, controlar fluxo de dados e otimizar a performance dos componentes. Eles são fundamentais para criar componentes reutilizáveis e confiáveis.
Próximos passos incluem estudar ChangeDetectionStrategy
, ngAfterContentInit
, ngAfterViewChecked
e técnicas avançadas de RxJS. Ferramentas como Angular DevTools ajudam a analisar e otimizar o comportamento dos Hooks e dos componentes.
🧠 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