Angularの親子コンポーネント通信の詳細な説明

Angularの親子コンポーネント通信の詳細な説明

概要

Angularコンポーネント通信

コンポーネント ツリー、番号 1 はルート コンポーネント AppComponent です。

コンポーネントは疎結合されており、互いの知識が少ないほど良いです。

コンポーネント 4 のボタンをクリックすると、コンポーネント 5 の初期化ロジックがトリガーされます。

従来のアプローチ: ボタン 4 のクリック イベントでコンポーネント 5 のメソッドを呼び出します。タイトカップリング。

Angular: コンポーネント 4 がコンポーネント 5 の存在をまったく認識せずに実装されています。

疎結合を使用してコンポーネント間でデータを渡し、再利用性の高いコンポーネントを開発します。

入力プロパティと出力プロパティを使用して、親子関係にあるコンポーネント間でデータを渡します。

1. 入力および出力プロパティの概要

コンポーネントはブラックボックス モデルとして設計されており、入力プロパティを使用して外部から受信した内容を宣言します。これらのものがどこから来たのかを知る必要はありません。

コンポーネントは、外部から必要なものが提供されたときに、何をすべきかを知るだけで済みます。

コンポーネントは出力プロパティを通じてイベントを発行し、外部の世界に興味深い内容を伝えます。どのコンポーネントにイベントが発行されるかを知る必要はありません。

興味のある人は誰でも、コンポーネントによって発行されるイベントをサブスクライブできます。

2. 入力属性

サブコンポーネントは、@Input() デコレータで装飾された 2 つの入力プロパティを定義します。

@入力()
  在庫コード: 文字列;
  @入力()
  量:数値;

親コンポーネントは、属性を子コンポーネントの入力属性にバインドすることにより、stock 属性を子コンポーネントの stockCode 属性にバインドします。

<div>
  私は親コンポーネントです</div>
<div>
  <input type="text" [(ngModel)]="stock" placeholder="株コードを入力してください">
  <app-order [stockCode]=在庫 [amount]="100"></app-order>
</div>

3. プロパティバインディングは親コンポーネントから子コンポーネントへの一方向です。

サブコンポーネントの stockCode の値を 3 秒ごとに Apple にリセットします。

OrderComponentクラスをエクスポートし、OnInitを実装します。

  @入力()
  stockCode: 文字列;
  @入力()
  量:数値;

  コンストラクタ() { 
    設定間隔(()=>{
      this.stockCode = 'Apple'
    },3000)
  }

  ngOnInit() {
  }
}

子コンポーネントの stockCode の値が Apple に変更されても、親コンポーネントの stock の値は変更されません。これは、バインディングが一方向であることを意味します。親コンポーネントのみが子コンポーネントを変更でき、子コンポーネントのプロパティを変更しても親コンポーネントには影響しません。

4. 出力プロパティ

Angular コンポーネントは EventEmitter オブジェクトを使用してカスタム イベントを発行し、他のコンポーネントで処理することができます。 EventEmitter は、Rxjs の Subject クラスのサブクラスです。レスポンシブ プログラミングでは、オブザーバーとしてもオブザーバーとしても使用できます。つまり、EventEmitter オブジェクトは、emit メソッドを通じてカスタム イベントを発行することができ、また、subscribe メソッドを通じて EventEmitter によって発行されたイベント ストリームをサブスクライブすることもできます。

EventEmit を使用してコンポーネント内からイベントを発行するにはどうすればよいですか?

シナリオ例: 見積コンポーネント

証券取引所に接続し、株価の変化をリアルタイムで表示できるコンポーネントが必要だとします。このコンポーネントをさまざまな金融アプリケーションで再利用できるようにするには、株価をリアルタイムで表示するだけでなく、コンポーネントの外部に最新の株価を送信して、他のコンポーネントが株価の変化に基づいて対応するビジネス ロジックを実行できるようにする必要があります。

注: クラスまたはインターフェースを使用して特定のデータ構造を明示的に定義することをお勧めします。

1. まずIBMの株価のリアルタイムの変化をシミュレートする

エクスポートクラス PriceQuoteComponent は OnInit を実装します {

  // 株価サービスに接続せず、乱数ジェネレータを使用して株価の変化をシミュレートし、株価コードと最新価格を表示します。stockCode:string="IBM";
  価格:数;

  コンストラクタ() {
    設定間隔(()=>{
      priceQuote:PriceQuote = new PriceQuote(this.stockCode,100*Math.random()); とします。
      this.price=priceQuote.lastPrice;
    },1000)
  }

  ngOnInit() {
  }

}


//株価情報をカプセル化するために引用オブジェクトをカプセル化します //クラスまたはインターフェースを使用して特定のデータ構造を明確に定義することは良い習慣です export class PriceQuote {
  コンストラクター(public stockCode: string, //株価コード public lastPrice: number //最新価格) {
  }
}

2. 情報を出力し、購読に興味がある人を外部に知らせる

EventEmit の背後にある型は、発行されるイベント内のデータの型です。

'@angular/core' から Component、OnInit、EventEmitter、Output をインポートします。

@成分({
  セレクター: 'app-price-quote',
  テンプレート URL: './price-quote.component.html',
  スタイル URL: ['./price-quote.component.css']
})
エクスポートクラス PriceQuoteComponent は OnInit を実装します {

  // 株価サービスに接続せず、乱数ジェネレータを使用して株価の変化をシミュレートし、株価コードと最新価格を表示します。stockCode: string = "IBM";
  価格: 数;

  @Output() // 出力イベントはOutputとして記述する必要があります
  //EventEmitter には汎用の lastPrice が必要です: EventEmitter<PriceQuote> = new EventEmitter();
  //

  コンストラクタ() {
    間隔を設定する(() => {
      priceQuote を作成します: PriceQuote = new PriceQuote(this.stockCode, 100 * Math.random());
      this.price = priceQuote.lastPrice;
      //lastPrice を使用して値を出力します this.lastPrice.emit(priceQuote);
    }, 1000)
  }

  ngOnInit() {
  }

}
//株価情報をカプセル化するために引用オブジェクトをカプセル化します //クラスまたはインターフェースを使用して特定のデータ構造を明確に定義することは良い習慣です export class PriceQuote {
  コンストラクター(public stockCode: string, //株価コード public lastPrice: number //最新価格) {
  }
}

3. 見積情報を受信し、親コンポーネントに表示する

親コンポーネント テンプレートは、イベント バインディングを通じてこのイベントをキャプチャして処理します。

クラスAppComponentをエクスポートします。
  在庫 = "";
  価格見積: 価格見積 = 新しい価格見積("", 0);

  //イベントの種類は、子コンポーネントが発行するときに発行されるデータのタイプです //親コンポーネントはpriceQuoteHandler(event:PriceQuote){を取得できます
    this.priceQuote=イベント;
  }
}

ステンシル

<!-- デフォルトでは、イベント名は出力属性の名前になります -->
<app-price-quote (lastPrice)="priceQuoteHandler($event)"></app-price-quote>

<div>
  これは引用コンポーネントの外側にあります<br/>
  株式コードは{{priceQuote.stockCode}}です。
  株価は{{priceQuote.lastPrice | number:"2.0-2"}}です
</div>

デフォルトでは、イベント名は出力属性の名前です。イベント名は次のように変更できます。

@Output("priceChange") // イベントを起動するには出力が必要です
  //EventEmitter には汎用の lastPrice が必要です: EventEmitter<PriceQuote> = new EventEmitter();

テンプレートも変更され、

<app-price-quote (priceChange)="priceQuoteHandler($event)"></app-price-quote>

要約する

イベントは出力プロパティを通じて発行され、データはイベントを通じて伝達されます。これらは、親コンポーネント テンプレートのイベント バインディングを通じてキャプチャされ、処理されます。

2 つのコンポーネント間に親子関係がない場合に、疎結合でデータを渡す方法。このとき、仲介モードを使用する必要があります。

上記は、Angular 親子コンポーネント間の通信の詳細な説明です。Angular 親子コンポーネント間の通信の詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • Angularの動的コンポーネントの詳細な説明
  • Angular のパフォーマンス最適化: サードパーティ コンポーネントと遅延読み込みテクノロジー
  • Angularコンポーネント間の通信の実装例
  • 角度コンポーネント間の値転送テスト方法の詳細な説明
  • Angular7はプロジェクト、コンポーネント、サービスを作成し、サービスを使用します
  • Angular イベント: 異なるコンポーネント間でデータを渡す方法
  • Angularjs1.5 関数を使用してコンポーネントの外部に値を渡す例
  • Angular6 学習ノートの詳細説明: マスタースレーブコンポーネント
  • Angularコンポーネントの仲介モードの詳細な説明

<<:  最新のmysql-5.7.21のインストールと設定方法

>>:  Win10 インストール Linux システム チュートリアル ダイアグラム

推薦する

Docker ベースの ELK を素早く構築する方法

[概要] この記事では、自作の Docker プラットフォームをベースに完全な ELK システムを素...

Windows での mysql-5.7.28 のダウンロード、インストール、および構成に関する詳細なグラフィックとテキストのチュートリアル

最近MySQLデータベースのバージョンを変更する必要があり、それを記録するために記事を書きます1. ...

MySQL 高可用性クラスタの展開とフェイルオーバーの実装

目次1. 内閣府1. コンセプト2. MHAの構成3. MHAの特徴2. MySQL+MHAをビルド...

react-diagram シリアル化 Json 解釈 ケース分析

このドキュメントの目的はreact-diagramフレームワーク モデルの Json シリアル化を説...

Vueのライフサイクルについて詳しく説明します

目次序文1. Vue2 のライフサイクルインスタンスのライフサイクルその他のライフサイクルフック2....

親子コンポーネントの通信を解決するための3つのVueスロット

目次序文環境の準備カテゴリコンポーネントアプリのコンポーネント1. デフォルトスロット2. 名前付き...

docker を使用して Linux 環境に Springboot パッケージをデプロイするチュートリアル

springboot には tomcat サーバーが組み込まれているため、jar パッケージにパッケ...

MySQL データベースのマスター スレーブ分離のサンプル コード

導入MySQL データベースの読み取りと書き込みの分離を設定すると、データベースに対する書き込み操作...

Vueコンポーネントの再利用と拡張の詳細な説明

目次概要延長は必要ですか?スロットJavaScript ユーティリティ関数拡張コンポーネントの複数の...

HTML テーブルタグチュートリアル (35): 列間属性 COLSPAN

複雑なテーブル構造では、一部のセルが垂直方向に複数のセルにまたがるため、列間属性 COLSPAN を...

Linuxシステムにおけるプロセス管理の詳細な説明

目次1. プロセスとスレッドの概念2. プロセス管理とは何ですか? 3. プロセス管理の役割4. L...

Linuxで同一ファイルを見つける方法

コンピュータを使用すると、システム内に大量のゴミが生成されます。最も一般的なケースは、同じファイルが...

Vue ソング プログレス バーのサンプル コード

なお、これはvue-cliで作成したプロジェクトではありません。vue.jsを参照して記述したHTM...

Vmwareでディスクを追加する方法:ディスクを拡張する

この記事では、ディスクを追加または拡張して、Vmare で有効にする方法について説明します。シナリオ...

JavaScriptで配列かどうかを判断するためのさまざまな方法のまとめ

目次序文配列.isArrayコンストラクタインスタンスプロトタイプオブジェクト.プロトタイプ.toS...