みなさんこんにちは、現役エンジニアのサメハックです
未経験から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フォローしてもらえると嬉しいです🦈