Wyszukaj / o blogu

Angular: cykle życia komponentu

Opublikowano pon 01 lutego 2021 w angular • 2 min read

angular

Tabela przedstawiająca life cycle hooki (wg kolejności ich życia)

Haki cykli życia Interfejs Wykrywa zmianę?*
ngOnChanges OnChanges Tak
ngOnInit OnInit Nie
ngDoCheck DoCheck Tak
ngAfterContentInit AfterContentInit Nope
ngAfterContentChecked AfterContentChecked Ja
ngAfterViewInit AfterViewInit Nej
ngAfterViewChecked AfterViewChecked Yup
ngOnDestroy OnDestroy Nope

*Uruchamiane wielokrotnie

Dyrektywy podobnie jak komponenty mogą korzystać z haków cykli życia (life cycle hooks)

ngOnChanges

Uruchamia się jako 1 ze wszystkich hooków oraz za każdym razem kiedy zmienia się property (referencja, zatem jeśli referencja nie ulega zmianie, ew zmiany w ramach obiektu nie będą zauważone referencja przecież zostaje ta sama) tego komponentu (zmienia się zawsze kiedy zmianie ulegnie property zw z input). Uruchamia się gdy powstaje komponent.

export class ChildComponent implements OnChanges {
  @Input() name
  ngOnChanges(changes: SimpleChanges) {
    for (const prop of Object.keys(changes)) {
      console.log(changes[prop])
    }
  }
}

źródło: Sposób na śledzenie zmian property @Input – ngOnChanges i Angular

ngOnChanges best practice - always use SimpleChanges - always

OnInit

Uruchamia się jednokrotnie (zaraz po ngOnChange), pełni rolę konstruktora dla obiektu [zwykły konstruktor komponentu jest powiązany z TS a nie Angularem]. Dobre do inicjalizowania danych, uruchomienie logiki startowej, w metodzie ngOnInit należy się odwołać do wstrzykniętych zależności

ngOnInit jest szybsze od konstruktora (który może nie mieć dostępu do wszystkich właściwości komponentu), dlatego ten jest wykorzystywany jedynie wstrzykiwania zależności, duża ilość logiki w konstruktorze spowalnia komponent i utrudnia testowanie.

DoCheck

Hook ten uruchamia się po to by sprawdzić czy nastąpiły zmiany w danych i czy należy zmienić szablon html. Może wykonywać się wiele razy, przez to również trzeba uważać przy jego wykonywaniu. W odróżnieniu od innych hooków (ngOnChanges) ngDoCheck sprawdza min. również wnętrza obiektów (dane) i rozpozna zmianę oraz wywoła zdarzenie - podobnie będzie to wyglądało np. w przypadku wpisywania tekstu do inputu. Uwaga: powoduje wykonanie wywołanie również we wszystkich komponentach położonych niżej, obciąża również aplikację.

export class ChildComponent DoCheck {
  @Input() dog: Dog;
  // Uruchomi się zawsze z Change Detection
  ngDoCheck(): void {
    console.log('Uruchamiam się zawsze :smile:')
  }
}

DoCheck wykrywanie zminan – Angular i ngDoCheck

AfterContentInit

Wywołuje się raz, po tym jak wykona się ngDoCheck - ma dostęp do komponentów wyświetlanych przez

AfterContentChecked

Uruchamia się za każdym razem jak zostaje uruchomiony changeDetection -> Oznacza, że komponent został już sprawdzony i zaraz zostanie wyrenderowany z nowymi danymi (np. do pobrania najnowszych/końcowych danych)

AfterViewInit

Uruchomi się raz w cyklu życia komponentu. Ma dostęp do komponentów, które zostały wstrzyknięte przy pomocy ViewChild.

AfterViewChecked

Uruchamia się po detekcji zmiany - gdy widok komponentu lub jego dziecka zostanie sprawdzony przez change detection -> czy zmiany nastąpiły?/czy należy je zmienić?

OnDestroy

Wywołuje się tylko gdy Angular będzie niszczony przez Angulara (np przy pomocy ngIf, inaczej rzecz ujmując gdy likwidowana jest logika, aplikacji która zajmuje pamięć przeglądarki).

@HostListener('window:beforeunload') - listener zakładany na metodę, który wykona się przy wpisanej w argument akcji


Źródła:

Hooking into the component lifecycle