DEV Community

mohamed Tayel
mohamed Tayel

Posted on

Angular Fundamentals: Understanding Angular Component Lifecycle

Introduction

In Angular, every component follows a lifecycle, which is defined by a series of events that occur throughout the component's existence. This lifecycle starts when the component is initialized and continues through changes in its data and properties until the component is destroyed. Angular provides lifecycle hooks, which are special methods that allow developers to execute code at specific points in a component's life.

These hooks provide great flexibility when building Angular applications, allowing us to run logic at key moments. However, not all lifecycle hooks are equally important or frequently used. In this article, we’ll focus on the most commonly used hooks: OnInit, OnChanges, and OnDestroy.

Lifecycle Hooks Overview

Every Angular component has a lifecycle, and that lifecycle can be divided into specific stages, or "lifecycle events." You can hook into these events and run custom code when they occur by implementing lifecycle hooks in your component. Some hooks, like OnInit, are fired only once when the component is first created. Others, such as OnChanges, may fire multiple times as the component's input properties change.

Grouping Lifecycle Hooks

To better understand how lifecycle hooks work, it helps to group them based on when they are fired:

  • Hooks that occur only once:

    • ngOnInit(): Fired after the component is initialized and ready to display.
    • ngOnDestroy(): Fired when the component is about to be destroyed, used for cleanup.
  • Hooks that occur multiple times:

    • ngOnChanges(): Fired whenever input properties change. This is useful when you need to react to changes in the data passed to the component.

These hooks occur in a specific order during the lifecycle of a component. However, for most use cases, you will primarily use ngOnInit to initialize data, ngOnChanges to respond to changes in input properties, and ngOnDestroy to perform cleanup.

Commonly Used Lifecycle Hooks

While Angular provides many lifecycle hooks, the following three are the most commonly used in practice:

  1. OnInit:
    • The ngOnInit method is called once after the component is initialized. This is where you can fetch data, perform setup tasks, or initialize default values for your component’s properties.
    • Use Case: Fetching data from an API for display when the component loads.

Example:

   import { Component, OnInit } from '@angular/core';

   @Component({
     selector: 'app-my-component',
     template: `<p>{{ data }}</p>`
   })
   export class MyComponent implements OnInit {
     data: string;

     ngOnInit(): void {
       this.data = 'Fetching data on init...';
       // Simulate fetching data from a service
       setTimeout(() => {
         this.data = 'Data loaded!';
       }, 2000);
     }
   }
Enter fullscreen mode Exit fullscreen mode

In this example, the ngOnInit method sets the initial value of data, and after a simulated data fetch, it updates the value.

  1. OnChanges:
    • The ngOnChanges method is called whenever the component’s input properties change. This hook is especially useful when your component depends on external data that can change over time.
    • Use Case: Responding to changes in the data passed from a parent component.

Example:

   import { Component, Input, OnChanges, SimpleChanges } from '@angular/core';

   @Component({
     selector: 'app-child-component',
     template: `<p>{{ data }}</p>`
   })
   export class ChildComponent implements OnChanges {
     @Input() data: string;

     ngOnChanges(changes: SimpleChanges): void {
       if (changes['data']) {
         console.log('Data changed:', changes['data'].currentValue);
       }
     }
   }
Enter fullscreen mode Exit fullscreen mode

Here, the ngOnChanges hook is used to log any changes to the data input property. Every time the parent component updates the data, ngOnChanges will fire and log the new value.

  1. OnDestroy:
    • The ngOnDestroy method is called right before the component is destroyed. It is mainly used for cleanup tasks such as unsubscribing from observables or detaching event listeners to prevent memory leaks.
    • Use Case: Unsubscribing from a stream or event when the component is destroyed.

Example:

   import { Component, OnDestroy } from '@angular/core';

   @Component({
     selector: 'app-my-component',
     template: `<p>Component is alive</p>`
   })
   export class MyComponent implements OnDestroy {
     intervalId: any;

     constructor() {
       this.intervalId = setInterval(() => console.log('Component is still alive'), 1000);
     }

     ngOnDestroy(): void {
       if (this.intervalId) {
         clearInterval(this.intervalId); // Cleanup the interval
         console.log('Component destroyed and interval cleared');
       }
     }
   }
Enter fullscreen mode Exit fullscreen mode

In this example, the ngOnDestroy method clears an interval when the component is destroyed to avoid performance issues or memory leaks.

Implementing a Lifecycle Hook

Implementing lifecycle hooks in Angular involves three main steps:

  1. Import the lifecycle hook interface: For example, if you're using OnInit, you need to import OnInit from @angular/core.
  2. Implement the interface: Add the lifecycle hook interface to the component class. For example, you would add implements OnInit to your class if you're using OnInit.
  3. Create the lifecycle method: Write the corresponding method, such as ngOnInit(), where you place the logic that will execute when that lifecycle event occurs.

Here’s an example of using the OnInit lifecycle hook:

import { Component, OnInit } from '@angular/core';

@Component({
  selector: 'app-sample',
  template: `<h1>Hello Angular</h1>`
})
export class SampleComponent implements OnInit {
  ngOnInit(): void {
    console.log('Component initialized');
  }
}
Enter fullscreen mode Exit fullscreen mode

In this example, the ngOnInit method is called once, when the component is first initialized, and logs a message to the console.

Conclusion

Understanding Angular's component lifecycle hooks is essential for managing data flow, responding to changes, and cleaning up resources efficiently. While Angular offers several hooks, OnInit, OnChanges, and OnDestroy are the most frequently used. Use OnInit to initialize data, OnChanges to respond to changes in input properties, and OnDestroy for cleanup.

For a deeper understanding of the other lifecycle hooks, you can explore Angular's official documentation. But for most practical purposes, these three hooks will cover a majority of your needs in Angular development.

Top comments (0)