【Angular】@Inputデコレーターの使い方をわかりやすく解説!

この記事ではAngularの『@Inputデコレーター』について、

  • Angularの「@Inputデコレーター」とは
  • Angularの「@Inputデコレーター」の使い方
  • 子コンポーネントの「プロパティ名」と親コンポーネントの「属性名」を異なるように設定する方法

などを分かりやすく説明するように心掛けています。ご参考になれば幸いです。

Angularの「@Inputデコレーター」とは

Angularの「@Inputデコレーター」とは

Angularでは、親コンポーネント子コンポーネントの間で値を共有するために、「@Inputデコレーター」と「@Outputデコレーター」を使用します。

  • @Inputデコレーター
    • 親コンポーネントから子コンポーネントに値を渡すときに使用します。
  • @Outputデコレーター
    • 子コンポーネントから親コンポーネントに値を渡すときに使用します。

この記事では「@Inputデコレーター」の使い方を説明します。

Angularの「@Inputデコレーター」の使い方

Angularの@Inputデコレーターを使用する手順を以下に示します。

Angularの@Inputデコレーターを使用する手順

  • 子コンポーネントを作成する
  • 親コンポーネントを作成する
  • モジュールに親コンポーネントと子コンポーネントを設定する

上記の手順について、順番に説明します。

子コンポーネントを作成する

以下のプログラムは、今回作成した子コンポーネントの一例です。

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

@Component({
  selector: 'app-child',
  template: `{{childItem}}`,
})
export class ChildComponent {
  @Input() childItem: string | undefined;
}

子コンポーネントの作成は以下の手順で行います。

子コンポーネントの作成手順

  • Inputをインポートする
  • @Inputデコレーターを追加して、プロパティを設定する

上記の手順について、順番に説明します。

Inputをインポートする

import { Component, Input } from '@angular/core'; //Inputをインポート

子コンポーネント(ここでは、ChildComponent)で@Inputデコレーターを使用するためには、上記のプログラムのように「Input」をインポートします。

@Inputデコレーターを追加して、プロパティを設定する

@Input() childItem: string | undefined;

次に、親コンポーネントから値を受け取るためのプロパティを定義します。

親コンポーネントから値を受け取るためには、以下の構文でプロパティを定義します。プロパティ定義の前に@Inputデコレーターを追加しているのがポイントです。

@Inputデコレーターの構文

@Input プロパティ名:データ型;

上記のプログラムではstring型またはundefined型のchildItemプロパティを定義しています。

親コンポーネントを作成する

以下のプログラムは、今回作成した親コンポーネントの一例です。

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

@Component({
  selector: 'app-root',
  template: `<app-child [childItem] = 'parentItem' ></app-child>`,
})
export class AppComponent {
  parentItem = 'Hello Angular!'
}

子コンポーネント(ChildComponent)を呼び出すために、子コンポーネント(ChildComponent)のセレクタ(ここでは、app-child)を親コンポーネント(AppComponent)のテンプレートの要素に使用します。

また、上記のプログラムの「[childItem] = 'parentItem'」はプロパティバインディングの構文であり、親コンポーネント(AppComponent)のparentItemプロパティをchildItem属性にバインドしています(結びつけています)。角括弧[]で囲まれているchildItem属性は、子コンポーネントにおいて、@Inputデコレーターを追加して定義したプロパティ名と同じにします。

これは、「親コンポーネント(AppComponent)のparentItemプロパティ」から「子コンポーネント(ChildComponent)のchildItemプロパティ」への単方向データバインディングとなっています。

ポイント

@Inputデコレーターを追加したプロパティは、親コンポーネントから子コンポーネントを呼ぶ際の属性として使用することができ、親コンポーネントから値を受け取ることができるようになります。

これまで説明したプログラムの場合、子コンポーネント(ChildComponent)で定義したchildItemプロパティは、親コンポーネントにおいて「[childItem] = 'parentItem'」のように属性として使用しています。その結果、子コンポーネント(ChildComponent)は親コンポーネント(AppComponent)のparentItemプロパティの値('Hello Angular!')を受け取ることができるようになっています。

モジュールに親コンポーネントと子コンポーネントを設定する

以下のプログラムは、今回作成したAppModuleモジュールの一例です。

import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';

import { AppComponent } from './app.component';
import { ChildComponent } from './child.component';

@NgModule({
  declarations: [
    AppComponent,
    ChildComponent
  ],
  imports: [
    BrowserModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

Angularアプリはモジュールから成り立っています。そのため、モジュールにはAngularアプリを構成するコンポーネントやサービスを登録する必要があります。

親コンポーネント(AppComponent)はデフォルトでAppModuleモジュールに登録されています。しかし今回、新たに子コンポーネント(ChildComponent)を作成したので、これをAppModuleモジュールに登録する必要があります。

子コンポーネントをAppModuleモジュールに登録するには以下の手順で行います。

子コンポーネントをAppModuleモジュールに登録する手順

  • 子コンポーネントをインポートする
  • 子コンポーネントを@NgModuleデコレーターのdeclarations配列に追加する

上記の手順について、順番に説明します。

子コンポーネントをインポートする

import { ChildComponent } from './child.component'; //子コンポーネント(ChildComponent)をインポート

まず、上記に示すように子コンポーネント(ChildComponent)をインポートします。

子コンポーネントを@NgModuleデコレーターのdeclarations配列に追加する

@NgModule({
  declarations: [
    AppComponent,
    ChildComponent  //追加
  ],
})

次に、子コンポーネント(ChildComponent)を@NgModuleデコレーターのdeclarations配列に追加します。これにより、子コンポーネント(ChildComponent)がAppModuleモジュールに登録されます。

以上で準備が完了です。では実際にアプリを実行してみましょう。実行結果は以下のようになります。

プログラムの実行結果

Angularの「@Inputデコレーター」の使い方(実行結果)

また、これまで説明したプログラムにおいて、親コンポーネント(AppComponent)子コンポーネント(ChildComponent)の関係を図で表すと以下のようになります。

Angularの「@Inputデコレーター」の使い方

子コンポーネントの「プロパティ名」と親コンポーネントの「属性名」を異なるように設定する方法

今まで説明したプログラムでは、子コンポーネント(ChildComponent)のプロパティ名は以下のように記述しているので「childItem」です。

@Input() childItem: string | undefined;

また、親コンポーネント(AppComponent)の属性名も以下のように記述しているので「childItem」です。

<app-child [childItem] = 'parentItem' ></app-child>

このように、今まで説明したプログラムでは子コンポーネントの「プロパティ名」と親コンポーネントの「属性名」が等しくなってます

では、子コンポーネントの「プロパティ名」と親コンポーネントの「属性名」を異なるようにしたい場合には、どのようにすればよいでしょうか。

以下に示すように@Inputデコレーターに引数を渡すことで、子コンポーネントの「プロパティ名」と親コンポーネントの「属性名」を異なるようにできます。

@Input('childData') childItem: string | undefined;

上記のプログラムでは、子コンポーネント(ChildComponent)のchildItemプロパティに対応する属性は「childData」であると宣言しています。

この場合、親コンポーネント(AppComponent)では、以下のように属性名を「childData」にして記述します。

<app-child [childData] = 'parentItem' ></app-child>

補足

@Inputデコレーターに引数がない場合には、属性名とプロパティ名が等しくなります。そのため、以下の記述はどちらも同じ意味となります。

@Input() childItem: string | undefined;
@Input('childItem') childItem: string | undefined;

単なる文字列を子コンポーネントに渡す場合には、角括弧[]はいらない

単なる文字列を子コンポーネントに渡す場合には、角括弧[]はいりません。

例えば、親コンポーネント(AppComponent)から文字列(‘Hello Angular!’)を子コンポーネント(ChildComponent)のchildItemプロパティに渡す場合には、以下のように記述します。

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

@Component({
  selector: 'app-root',
  template: `<app-child childItem = 'Hello Angular!' ></app-child>`,
})
export class AppComponent {
}

本記事のまとめ

この記事ではAngularの『@Inputデコレーター』について、以下の内容を説明しました。

  • Angularの「@Inputデコレーター」とは
  • Angularの「@Inputデコレーター」の使い方
  • 子コンポーネントの「プロパティ名」と親コンポーネントの「属性名」を異なるように設定する方法

お読み頂きありがとうございました。