Angular コンポーネントはどのように通信するのでしょうか?親子コンポーネント通信の 2 つの方法

青灯夜游
リリース: 2021-08-20 10:02:42
転載
2054 人が閲覧しました

この記事では、Angularにおけるコンポーネント通信を理解し、親コンポーネントと子コンポーネント間の通信、および直接関係のないコンポーネント間の通信の方法を紹介します。

Angular コンポーネントはどのように通信するのでしょうか?親子コンポーネント通信の 2 つの方法

実際のアプリケーションでは、コンポーネントはツリー構造で関連付けられるため、コンポーネント間の関係は主に次のとおりです。

  • 父と息子の関係

  • #兄弟関係

  • ##直接的な関係なし

    ##【 関連チュートリアル推奨事項: "
  • angular チュートリアル
"]

環境の準備:1.

header# を作成します。 ##コンポーネント:

ng g c コンポーネント/ヘッダー

  
ログイン後にコピー
export class HeaderComponent implements OnInit { constructor() {} ngOnInit(): void {} }
ログイン後にコピー
2.title

コンポーネントを作成します:

ng g c コンポーネント/タイトル

{{title}}
ログイン後にコピー
export class TitleComponent implements OnInit { public title: string = '标题'; constructor() {} ngOnInit(): void {} }
ログイン後にコピー
3.button

コンポーネントを作成します:

ng g cComponents/button

ログイン後にコピー
export class ButtonComponent implements OnInit { public btnName: string = '按钮'; constructor() {} ngOnInit(): void {} }
ログイン後にコピー

## を直接呼び出します。#親子関係コンポーネントに適用されます。直接呼び出しにより親子コンポーネントの結合が高まることに注意してください。明確にするために、直接呼び出しが必要です。

1. アプリとヘッダーの間に親子コンポーネント関係が形成されるように、ヘッダー コンポーネントをアプリにマウントします。2.

を使用します。 # コンポーネントに名前を付けます:

3。ヘッダー コンポーネントはまだ非常に空です。展開しましょう。そうでない場合、何を呼び出すか?

export class HeaderComponent implements OnInit { public name: string = 'HeaderComponent'; printName(): void { console.log('component name is', this.name); } }
ログイン後にコピー
4。コンポーネントが展開された後、親コンポーネント app

 

调用子组件属性: {{ header.name }}

ログイン後にコピー

5 のサブコンポーネント ヘッダーにあるプロパティと関数を呼び出すことができます。操作はコンポーネントの HTML テンプレートで実行されますが、場合によっては、親コンポーネントの ts クラスでサブコンポーネントを操作する必要もあります。次に説明します。

6. 新しいデコレーター

@ViewChild(Component)

export class AppComponent { title = 'angular-course'; @ViewChild(HeaderComponent) private header!: HeaderComponent; // 声明周期钩子: 组件及子组件视图更新后调用,执行一次 ngAfterViewInit(): void { // 调用子组件属性 console.log(this.header.name); // 调用子组件函数 this.header.printName(); } }
ログイン後にコピー

@Input および @Output

を使用する必要があります。親子関係コンポーネントに適用可能

1.headerコンポーネントで

title

を定義することで、この問題を解決します。結合されたtitleコンポーネントでの直接呼び出しは、複雑な展開の問題を引き起こします2.title# のtitle

属性に @Input() 装飾を追加します。 ## コンポーネント コンテナ:

@Input() public title: string = 'Title';3. ヘッダー コンポーネントに title 属性を追加し、値を割り当てます:public title : string = 'I am New title';

4.

header## のhtmlテンプレートで

title

コンポーネントを使用します。 # コンポーネントは次のとおりです:5. ここまでの効果を見てみましょう。インターフェイスは見にくいですが、次回はこのコンポーネントを使用しますtitle?

6 を設定したほうが便利ですか。上記の手順により、親コンポーネントのデータが子コンポーネントに渡されるので、続けましょう 子コンポーネントのデータがどのように親コンポーネントに渡されるかを見てみましょう?@Output()

デコレータを使用して次のコードを実装しましょう

Angular コンポーネントはどのように通信するのでしょうか?親子コンポーネント通信の 2 つの方法7.

title

コンポーネントでtitleChange属性を ts クラスに追加します:

@Output() public titleChange = new EventEmitter();

8.titleコンポーネントの ts クラス

ngOnInit(): void { // 定时将子组件的数据进行派发 setInterval(() => { this.titleChange.emit(this.title); }, 1500); }
ログイン後にコピー
9 にデータを定期的にディスパッチします。次に、ヘッダーの親コンポーネントを変更して、ディスパッチされたデータを受信しましょう:

 
ログイン後にコピー
onChildTitleChange(value: any) { console.log('onChildTitleChange: >>', value); }
ログイン後にコピー

コミュニケーションのためにサービスの単純な関心を使用する

直接関係のないコンポーネントに適用されます

1. サービスを通じて通信する必要があるため、まずサービスng s services/EventBus

を作成し、タイプ

Subject## の属性を宣言します。 # コミュニケーションを支援するためですAngular コンポーネントはどのように通信するのでしょうか?親子コンポーネント通信の 2 つの方法

@Injectable({ providedIn: 'root', }) export class EventBusService { public eventBus: Subject = new Subject(); constructor() {} }
ログイン後にコピー

2. トラブルを避けるため、

headerのボタン コンポーネントとタイトル コンポーネントは直接的な関係がないコンポーネントであるため、コンポーネントは再作成されませんでした。関係。3.button

コンポーネントを変換し、

triggerEventBus関数

export class ButtonComponent implements OnInit { public btnName: string = '按钮'; constructor(public eventBusService: EventBusService) {} ngOnInit(): void {} public triggerEventBus(): void { this.eventBusService.eventBus.next('我是按钮组件'); } }
ログイン後にコピー

4 をトリガーするクリック イベントを追加します。

titleコンポーネント内のシミュレートされたデータの取得

export class TitleComponent implements OnInit { constructor(public eventBusService: EventBusService) {} ngOnInit(): void { this.eventBusService.eventBus.subscribe((value) => { console.log(value); }); } }
ログイン後にコピー

Cookie、セッション、またはローカルストレージを使用して通信

1. これは非常に簡単です。デモには引き続きtitleコンポーネントとbuttonコンポーネントを使用します。今回は、タイトル コンポーネントにデータを保存します。 buttonコンポーネントからデータを取得します。localstorageのみを説明します。他はすべて同じです。

2.

titleコンポーネントのngOnInit()フックのtitlelocalstorageに保存します:window.localStorage.setItem('title', this.title);

3. ボタン コンポーネントのデータを取得します:

const title = window.localStorage.getItem('title');

結論:

この記事では、分割されたコンポーネントが適切な通信を実行できるように、Angular のコンポーネント通信を紹介しました。は保証を提供しており、これまでのコンポーネントの使用はタグの導入によって行われていました。

元のアドレス: https://juejin.cn/post/6991471300837572638

著者: Xiaoxin

プログラミング関連の知識について詳しくは、次のサイトをご覧ください。 :

プログラミング入門! !

以上がAngular コンポーネントはどのように通信するのでしょうか?親子コンポーネント通信の 2 つの方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:juejin.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!