Ciclo de Vida de um Componente - Angular
Após a criação de um componente, o framework Angular chama uma série de métodos que representam diferentes etapas do ciclo de vida desse componente. A inicialização de um componente pode ser figurativamente representada da seguinte maneira:

Durante o processo de atualização de um componente, alguns eventos do ciclo de vida também são acionados:

Portanto, o componente passa pelas seguintes etapas do ciclo de vida:
: Primeiro, o construtor do componente é executado.Construtor
: Chamado antes do métodongOnChanges
durante a configuração inicial de propriedades vinculadas por meio do mecanismo de binding, e também em qualquer reinstalação ou alteração de seus valores. Este método recebe como parâmetro um objeto da classe SimpngOnInit()
leChanges, que contém os valores anteriores e atuais das propriedades. Por exemplo, verificação de alterações:ngOnChanges(changes: SimpleChanges) { for (const inputName in changes) { const inputValues = changes[inputName]; console.log(`Previous ${inputName} == ${inputValues.previousValue}`); console.log(`Current ${inputName} == ${inputValues.currentValue}`); console.log(`Is first ${inputName} change == ${inputValues.firstChange}`); } }
: Chamado uma vez após o Angular inicializar todas as propriedades de entrada do componente com seus valores iniciais. Executado antes da inicialização do template do componente. Isso significa que, neste método, é possível atualizar o estado do componente com base em seus valores iniciais.ngOnInit
: Chamado em cada verificação de alterações nas propriedades do componente, logo após os métodosngDoCheck
engOnChanges
.ngOnInit
: Chamado uma vez após o métodongAfterContentInit
depois que todos os componentes filhos foram inicializados.ngDoCheck()
: Chamado pelo Angular ao verificar alterações no conteúdo inserido no template do componente. Executado após o métodongAfterContentChecked
e após cada chamada subsequente do métodongAfterContentInit()
.ngDoCheck()
: Chamado pelo Angular após a inicialização do template do componente, bem como do template dos componentes filhos. Executado apenas uma vez, logo após a primeira chamada do métodongAfterViewInit
.ngAfterContentChecked()
: Chamado pelo Angular após verificar mudanças no template do componente, assim como no template dos componentes filhos. Executado após a primeira chamada do métodongAfterViewChecked
e após cada chamada subsequente do métodongAfterViewInit()
.ngAfterContentChecked()
: Chamado antes de o Angular remover o componente.ngOnDestroy
eafterRender
: permitem executar código após a renderização do componente. O código dessas funções é chamado após o Angular concluir a renderização de todos os componentes na página no DOM. Essas funções se aplicam à aplicação como um todo e não a componentes individuais. Portanto, elas capturam o momento após a renderização de toda a aplicação e de todos os seus componentes.afterNextRender
A maioria desses métodos está definida em interfaces específicas, cujo nome corresponde ao nome do método sem o prefixo "ng". Por exemplo, o método ngOnInit
OnInit
import { Component, OnInit, OnDestroy } from "@angular/core";
@Component({
selector: "my-app",
standalone: true,
template: `<p>Hello Programício</p>`
})
export class AppComponent implements OnInit, OnDestroy {
constructor(){ console.log("constructor"); }
ngOnInit() { console.log("onInit"); }
ngOnDestroy() { console.log("onDestroy"); }
}
ngOnInit
O método ngOnInit()
ngOnInit()
ngOnInit
ngOnDestroy
O método ngOnDestroy()
ngOnChanges
O método ngOnChanges()
ngOnInit()
SimpleChanges
ChildComponent
import { Component, Input, OnInit, OnChanges, SimpleChanges } from "@angular/core";
@Component({
selector: "child-comp",
standalone: true,
template: `<p>Olá {{name}}</p>`
})
export class ChildComponent implements OnInit, OnChanges {
@Input() name: string = "";
constructor() { console.log("constructor"); }
ngOnInit() { console.log("onInit"); }
ngOnChanges(changes: SimpleChanges) {
for (let propName in changes) {
let change = changes[propName];
let current = JSON.stringify(change.currentValue);
let previous = JSON.stringify(change.previousValue);
console.log(`${propName}: currentValue = ${current}, previousValue = ${previous}`);
}
}
}
E suponha que este componente seja utilizado no componente principal AppComponent
import { Component, OnChanges, SimpleChanges} from "@angular/core";
import { FormsModule } from "@angular/forms";
import { ChildComponent} from "./child.component";
@Component({
selector: "my-app",
standalone: true,
imports: [FormsModule, ChildComponent],
template: `<child-comp [name]="name"></child-comp>
<input type="text" [(ngModel)]="name" />
<input type="number" [(ngModel)]="age" />`
})
export class AppComponent implements OnChanges {
name ="Tom";
age = 25;
ngOnChanges(changes: SimpleChanges) {
for (let propName in changes) {
let change = changes[propName];
let current = JSON.stringify(change.currentValue);
let previous = JSON.stringify(change.previousValue);
console.log(`${propName}: currentValue = ${current}, previousValue = ${previous}`);
}
}
}
O valor da propriedade name
ChildComponent
AppComponent
ngOnChanges()
Se executarmos a aplicação, podemos observar que, a cada alteração da propriedade name no componente principal, o método ngOnChanges

É importante notar que este método é chamado apenas quando as propriedades de entrada com o decorador @Input
age
AppComponent
ngOnChanges()
Implementação de Todos os Métodos
Vamos definir o seguinte componente filho:
import { Component,
Input,
OnInit,
DoCheck,
OnChanges,
AfterContentInit,
AfterContentChecked,
AfterViewChecked,
AfterViewInit} from "@angular/core";
@Component({
selector: "child-comp",
standalone: true,
template: `<p>Olá {{name}}</p>`
})
export class ChildComponent implements OnInit,
DoCheck,
OnChanges,
AfterContentInit,
AfterContentChecked,
AfterViewChecked,
AfterViewInit {
@Input() name: string = "";
count= 1;
ngOnInit() {
this.log(`ngOnInit`);
}
ngOnChanges() {
this.log(`OnChanges`);
}
ngDoCheck() {
this.log(`ngDoCheck`);
}
ngAfterViewInit() {
this.log(`ngAfterViewInit`);
}
ngAfterViewChecked() {
this.log(`ngAfterViewChecked`);
}
ngAfterContentInit() {
this.log(`ngAfterContentInit`);
}
ngAfterContentChecked() {
this.log(`ngAfterContentChecked`);
}
private log(msg: string) {
console.log(this.count + ". " + msg);
this.count++;
}
}
E vamos usar este componente no componente principal:
import { Component} from "@angular/core";
import { FormsModule } from "@angular/forms";
import { ChildComponent} from "./child.component";
@Component({
selector: "my-app",
standalone: true,
imports: [FormsModule, ChildComponent],
template: `<child-comp [name]="name"></child-comp>
<input type="text" [(ngModel)]="name" />`
})
export class AppComponent {
name = "Tom";
}
