PR

ngOnInitとは?Angularのライフサイクルを1からわかりやすく

TypeScript

結論「ngOnInitは、Angularのライフサイクルフックの1つで、コンポーネントが初期化された直後に呼び出されます。主に、初期化処理やデータの準備を行うために使用されます。」

Angularのライフサイクルは、コンポーネントやディレクティブが「生成」「変化」「破棄」という流れで動作する仕組みを指します。ngOnInitはこのライフサイクルの中で、初期化のために特化したフックです。

ngOnInitを理解するために、このページではAngularのライフサイクル/ライフサイクルフックの概念について解説します。

スポンサーリンク

Angularのライフサイクルとは?

Angularのコンポーネントは以下のような「一生」を持っています:

  1. 生成 (Creation)
    コンポーネントが作られる瞬間。
  2. 変化 (Change Detection)
    データが更新され、それに応じてビューが再描画される過程。
  3. 破棄 (Destruction)
    役割を終えて、メモリから削除されるタイミング。

この一連の流れが「ライフサイクル」です。

よりシステム的に言えば、対象のコードがロードされ、そのコードが外部からのリクエストで様々な動作をし、最終的に処理が終了する~、という一連の流れをライフサイクルと呼びます。

日常生活の例で考えてみると以下のようなイメージです。

  • 生成: 新しい家を建てる。
  • 変化: 家具を配置し直したり、壁を塗り替える。
  • 破棄: 家を解体する。

ライフサイクルフックとは?

ライフサイクルフックは、ライフサイクルの特定のタイミングで実行される「きっかけ」や「スイッチ」のようなものです。開発者がこれを利用して、適切なタイミングでカスタムロジックを追加することができます。

これをシステム的に捉えると、ライフサイクルフックは「状態遷移」に基づくイベント駆動型プログラミングの一部と説明できます。アプリケーションやコンポーネントは、それぞれの状態(生成、更新、破棄など)において異なる責務を持ち、ライフサイクルフックはその責務を実行するトリガーとして機能します。

Angularの主要フック

タイミングフック名主な用途
生成時constructorコンポーネントのインスタンス化。依存性の注入。
初期化時ngOnInit初期設定や外部データの取得を実行。
変更検知時ngOnChangesngDoCheck入力データの変更を検知。
描画後ngAfterViewInitDOM要素や子コンポーネントが完全に初期化された後の処理。
破棄時ngOnDestroyメモリ解放やサブスクリプション解除。

ngOnInitの役割と特徴

ngOnInitは、Angularがすべての入力プロパティ(@Input)を設定した後、1度だけ呼び出されます。生成フェーズの一部として、コンポーネントの初期化処理を担当します。

特徴

  • 呼び出し回数: 一度だけ呼び出される。
  • 依存性注入後に実行: コンストラクタで設定された依存性を利用可能。
  • データが利用可能: 入力プロパティ(@Input)が初期化された状態。

用途

  1. 初期データの設定
    • APIからのデータ取得。
    • 初期状態を設定する。
  2. 入力データの利用
    • @Inputで渡された値を基にロジックを実行。
  3. コンストラクタとの分離
    • 初期化ロジックをコンストラクタから分離し、コードを整理する。

ngOnInitを通じてライフサイクルを理解する

ここからは具体的にどんな感じで動作するのか?をイメージできるように実際のコードを用いてご説明します。

以下のコードでngOnInitがライフサイクル全体の中でどのように機能するかを見てみましょう。

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

@Component({
  selector: 'app-demo',
  template: `<p>{{message}}</p>`
})
export class DemoComponent implements OnInit {
  @Input() userName: string = ''; // 入力プロパティ
  message: string = '';

  constructor() {
    console.log('Constructor: コンポーネントが生成されました');
  }

  ngOnInit() {
    console.log('ngOnInit: 初期化処理を実行します');
    this.message = `こんにちは、${this.userName}さん!`;
  }
}

このコードは、Angularのコンポーネントを使って、ユーザー名を受け取り、その名前を使ってメッセージを表示する仕組みを実現しています。以下に、実行結果と動作の原理をわかりやすく説明します。

実行結果

このコンポーネントを以下のように使用すると、画面に「こんにちは、〇〇さん!」と表示されます。

<app-demo [userName]="'太郎'"></app-demo>

画面の表示:

こんにちは、太郎さん!

動作の原理

  1. コンポーネントの基本構成
    • @Component デコレーターでコンポーネントの情報を設定します。
    • selector: 'app-demo' により、このコンポーネントは <app-demo> というタグで使用可能になります。
    • template: <p>{{message}}</p> で、HTMLテンプレートに表示する内容を指定しています。
  2. 入力プロパティ (@Input)
    • @Input() デコレーターを使うと、親コンポーネントから値を受け取ることができます。
    • この例では、userName プロパティが入力プロパティで、親コンポーネントから値が渡されます。
  3. コンストラクター
    • constructor() は、コンポーネントが生成されたタイミングで一度だけ呼び出されます。
    • ここでは特別な処理はしていませんが、ログ出力で確認できます。
  4. ngOnInit メソッド
    • ngOnInit() は、コンポーネントが初期化された後に呼び出されます。
    • このメソッドで、userName を使って message の内容を設定しています。
  5. 動作の流れ
    • 親コンポーネントから <app-demo [userName]="'太郎'"></app-demo> として userName に値が渡されます。
    • ngOnInit() が実行され、message プロパティに「こんにちは、太郎さん!」という文字列がセットされます。
    • テンプレートの <p>{{message}}</p> がその値を表示します。
タイトルとURLをコピーしました