C'est quoi le Cycle de vie des composants ?
En Angular, les composants ont un cycle de vie. Cela signifie quâil y a un moment oĂč ils sont crĂ©es, mis Ă jour, dĂ©truit, etc. Tout cela est gĂ©rĂ© directement par le framework, et ils nous mettent Ă disposition des mĂ©thodes Ă utiliser directement dans les composants qui correspondent Ă leurs moments de vie. Ces mĂ©thodes sont appelĂ©es les lifecycle hooks.
Voici une liste des lifecycle hooks les plus courants dans lâordre par lequel ils sont exĂ©cutĂ©s :
ngOnChanges()
Elle est appelĂ©e chaque fois quâun ou plusieurs @Input()
changent. Vous allez lâutiliser quand vous avez besoin de recalculer des donnĂ©es en fonction des changements de plusieurs @Input()
.
import { Component, Input, OnChanges, SimpleChanges } from "@angular/core";
@Component({
standalone: true,
template: `<p>{{ fullname }}</p>`,
})
export class SomeComponent implements OnChanges {
@Input() firstname: string;
@Input() lastname: string;
fullname: string;
ngOnChanges(changes: SimpleChanges) {
if (changes.firstname || changes.lastname) {
this.fullname = `${this.firstname} ${this.lastname}`;
}
}
}
ngOnInit()
Cette mĂ©thode est appelĂ©e une seule fois Ă la crĂ©ation du composant. A lâintĂ©rieur du ngOnInit
vous ĂȘtes assurĂ© que les @Input()
sont initialisĂ©s, vous devez donc lâutiliser si vous avez besoins des @Input()
de votre composants.
import { Component, Input, OnInit, inject } from "@angular/core";
@Component({
standalone: true,
template: `<p>{{ data() }}</p>`,
})
export class AnotherComponent implements OnInit {
#service = inject(MyService);
@Input() userId: string;
readonly data = this.#service.data;
ngOnInit() {
this.#service.fetchData(this.userId);
}
}
ngAfterViewInit()
Cette mĂ©thode est appelĂ©e aprĂšs que la vue dâun composant (et de ses enfants) a Ă©tĂ© complĂštement initialisĂ©e. Câest lâendroit idĂ©al pour effectuer des manipulations liĂ©es Ă la vue, comme interagir avec des Ă©lĂ©ments du DOM ou utiliser ViewChild
pour accéder à des composants ou éléments enfants.
import { Component, AfterViewInit, ViewChild, ElementRef } from "@angular/core";
@Component({
standalone: true,
template: `
<p #greetingMessage></p>
<button (click)="changeMessage()">Changer le message</button>
`,
})
export class AnotherViewComponent implements AfterViewInit {
@ViewChild("greetingMessage") messageElement: ElementRef;
ngAfterViewInit() {
// AprÚs l'initialisation de la vue, nous pouvons accéder en toute
// sécurité à notre élément référencé.
this.messageElement.nativeElement.innerText =
"Bonjour depuis ngAfterViewInit!";
}
changeMessage() {
this.messageElement.nativeElement.innerText = "Le message a été modifié!";
}
}
Ici, nous utilisons @ViewChild
pour accéder directement à un élément du DOM dans notre template. Ensuite, grùce à ngAfterViewInit
, nous pouvons ĂȘtre sĂ»rs que cet Ă©lĂ©ment est disponible et prĂȘt Ă ĂȘtre utilisĂ©. Dans lâexemple, nous dĂ©finissons initialement un message, puis nous fournissons un bouton pour changer ce message.
ngOnDestroy()
La méthode ngOnDestroy
est appelĂ©e juste avant la destruction dâun composant ou dâune directive. Câest lâendroit idĂ©al pour effectuer des opĂ©rations de nettoyage, comme se dĂ©sabonner dâobservables, annuler des requĂȘtes HTTP en cours ou supprimer des Ă©couteurs dâĂ©vĂ©nements.
import { Component, OnDestroy } from "@angular/core";
import { Subscription } from "rxjs";
import { DataService } from "./data.service";
@Component({
standalone: true,
template: `
<h2>Some Product</h2>
<button (click)="buy()">Buy</button>
`,
})
export class SomeComponent implements OnDestroy {
subscription: Subscription;
buy() {
this.subscription = this.dataService.buy().subscribe();
}
ngOnDestroy() {
this.subscription.unsubscribe();
}
}
Dans cet exemple,lorsque lâutilisateur clique sur âBuyâ, nous voulons effectuer une requĂȘte HTTP. Pour se faire, on doit sâabonner Ă un observable grĂące Ă .subscribe()
. Toutefois, pour Ă©viter des fuites de mĂ©moire, il est essentiel de sây dĂ©sabonner une fois que le composant est dĂ©truit. Câest prĂ©cisĂ©ment le rĂŽle de la mĂ©thode ngOnDestroy()
qui sâexĂ©cute juste avant la destruction du composant. Dans cette mĂ©thode, je me dĂ©souscris du flux et ainsi amĂ©liore les performances de mon application.