【Angular】親から子コンポーネントにイベントを通知しよう!【Subject】

ANGULAR

みなさんこんにちは、現役エンジニアのサメハックです

未経験からWebエンジニアに転職し、
正社員として5年働いたのちフリーランスとして独立しました。

Angularの解説シリーズです。

今回は親から子コンポーネントにイベントを通知する方法について学んでいきましょう!

駆け出しエンジニアや未経験の方、
また新入社員を指導する先輩社員にとっても
わかりやすいように解説していきます!

この記事を読むと・・・
  • 親から子コンポーネントにイベントが通知出来る
  • GitHubからサンプルコードをダウンロードできる

※PCにnpm、nodeがインストールされている前提で記述します。
 yarn等をお使いの方は読み替えてください。

環境がない人はcodesansbox等を使ってね!

作りたいもの

これが今回の完成形だよ!

実行環境

Angularのバージョンが古いと動かないことがあるよ!
うまく動かなければアップデートしてね!

親から子コンポーネントにイベントを通知しよう

ここではSubjectによる状態管理
Subscriptionによる購読設定を活用します。

親コンポーネントの設定

親コンポーネント.html

<子コンポーネント [events]="Subject名.asObservable()"></子コンポーネント>

親コンポーネント.ts

Subject名: Subject = new Subject();

クリックイベント用関数() {
this.Subject名.next();
}

子コンポーネントの設定

子コンポーネント.ts

// イベントを受け取る設定
@Input() events: Observable;
// イベントの購読設定
private Subscription名: Subscription;

ngOnInit() {
// イベントを購読
this.Subscription名 = this.events.subscribe(() =>
    // クリックされたタイミングでここが呼ばれるので、任意の処理を記述
);}

ngOnDestroy() {
// ページ遷移する際に購読を停止
this.Subscription名.unsubscribe();
}
これで親コンポーネントのクリックイベントが発生したタイミングで
任意の処理が実行できるよ!

実際に動かしてみよう!

親コンポーネント設定

app.component.html

<button (click)="onClick()">ボタン</button>

<app-child [events]="eventsSubject.asObservable()"> </app-child>

app.component.ts

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

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.scss'],
})
export class AppComponent {
  eventsSubject: Subject = new Subject();

  onClick() {
    /**クリックイベントを通知 */
    this.eventsSubject.next();
  }
}

子コンポーネントの設定

childの作成

ng generate component child

child.component.ts

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

@Component({
  selector: 'app-child',
  templateUrl: './child.component.html',
  styleUrls: ['./child.component.scss'],
})
export class ChildComponent implements OnInit {
  // イベントを受け取る設定
  @Input() events: Observable;
  // イベントの購読設定
  private eventsSubscription: Subscription;
  // ブラウザ表示コメント用
  message: String;

  ngOnInit() {
    // イベントを購読する
    this.eventsSubscription = this.events.subscribe(
      () =>
        // クリックされたタイミングでここが呼ばれるので、任意の処理を記述
        (this.message = 'ボタンがクリックされました')
    );
  }

  ngOnDestroy() {
    // ページ遷移する際に購読を停止
    this.eventsSubscription.unsubscribe();
  }
}

child.component.html

<section>
  <p>子コンポーネント</p>
  {{ message }}
</section>
これで同じものが出来たよ!

サンプルコード

GitHub - same-hack/Angular-event-from-parent-to-child: 【Angular】イベントを子コンポーネントに通知
【Angular】イベントを子コンポーネントに通知. Contribute to same-hack/Angular-event-from-parent-to-child development by creating an account on GitHub.
今回作成したソースはGitHubに置いたので、
うまく動かせなかった人やコードだけ使いたい人は是非活用してね!

まとめ

  • Subjectを活用すると、子コンポーネントにクリックイベントを通知できる
  • クリックイベント以外のイベントを通知することも可能

満足いただけたら、1クリックなのでSNSフォローしてもらえると嬉しいです🦈

タイトルとURLをコピーしました