Aller au contenu

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.