Angularの@Input、@Output、EventEmitterを理解する

Angularを初めて使う人にとって、特にサンプルコードを見て勉強するとき、InputとOutputデコレーターは少し混乱するものだと思います。 この記事では、最も簡単な方法でそれらを説明します。

データを交換するツール

まず最初に、Input と Output の考え方は、コンポーネント間でデータを交換することです。

入力はデータを受信するために使用され、出力はデータを送信するために使用されます。 出力は、イベント プロデューサ、通常は EventEmitter オブジェクトを公開してデータを送信します。

したがって、このようなコード

@Component({
selector: 'todo-item',
...
})export class TodoItemComponent {
@Input() item
@Output() onChange = new EventEmitter()
}

を見た場合、それは

  • 私に送られるデータを期待しています。 私はそれを受け取り、item プロパティに格納します
  • ところで、私は onChange プロパティを介してデータを生成して送信します。

例えば、TodoItem コンポーネントを含む TodoList コンポーネントがあるとしましょう。 TodoList テンプレートでは、

...
<todo-item
="myTask"
(onChange)="handleChange($event)"
</todo-item>
...

と表示されていると思いますが、これは、

  • TodoList が myTask プロパティにデータ値を入れて TodoItem に渡し
  • TodoItem から出されるデータは TodoList

で handleChange() 関数が受信して処理される、ことを意味しています。

@Input と @Output の動作

この例を見てみましょう。 ここでは、app コンポーネントの中にネストされた hello コンポーネントという 2 つのコンポーネントを作成しました。 hello コンポーネントには Input と Output があります

hello.component.ts
@Component({
selector: 'hello',
template: `
<h3 (click)="onClick.emit('Neo')">
...
</h3>
`
})export class HelloComponent {
@Input() myFriend: string
@Output() onClick = new EventEmitter()
}

文字列値を受け取ることを期待し、それを myFriend プロパティに格納します。

@Input() myFriend: string

それをクリックするたびに、Output プロパティの onClick は文字列 ‘Neo’ を外部に放出します。

<h3 (click)="onClick.emit('Neo')">

以下はアプリコンポーネントです

app.component.ts
export class AppComponent {
ng = 'Angular'
myName = 'Neo' upCase(st:string): void { ... }
}app.component.html
<hello myFriend="{{ ng }}" (onClick)="upCase($event)"></hello>
<h3>My name is {{ myName }}</h3>

アプリコンポーネントはテンプレートでhelloタグを使い、2つのことを行っていることに注意してください。

  • ng プロパティを介して文字列値 ‘Angular’ を hello に渡す
<hello myFriend="{{ ng }}"
  • hello から送信された値を受け取り、その値を upCase() 関数で処理する
<hello myFriend="{{ ng }}" (onClick)="upCase($event)">

このアプリはここで実行できます