ホームページ > ウェブフロントエンド > jsチュートリアル > Angular がコンテンツ投影に ng-content を使用する方法についての簡単な説明

Angular がコンテンツ投影に ng-content を使用する方法についての簡単な説明

青灯夜游
リリース: 2021-07-02 11:00:59
転載
2559 人が閲覧しました

Angular がコンテンツ投影に ng-content を使用する方法についての簡単な説明

この記事では、コンテンツ投影に ng-content を使用して、柔軟で再利用可能なコンポーネントを作成する方法を検討します。

ng-content

ng-content 要素は、外部コンテンツまたは動的コンテンツを挿入するためのプレースホルダーです。親コンポーネントは外部コンテンツを子コンポーネントに渡し、Angular がテンプレートを解析すると、外部コンテンツは ng-content が表示される子コンポーネント テンプレートに挿入されます。

コンテンツ プロジェクションを使用して、再利用可能なコンポーネントを作成できます。これらのコンポーネントは同様のロジックとレイアウトを備えており、多くの場所で使用できます。一般に、いくつかのパブリックコンポーネントをカプセル化するときによく使用されます。 [関連チュートリアルの推奨事項: "angular チュートリアル"]

コンテンツ プロジェクションを使用しないでください

ng-content を使用する必要がある理由を理解するにはコンテンツの投影のために、まず非常に一般的なボタン コンポーネントを作成しましょう。

btn.component.ts

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

@Component({
  selector: 'app-btn',
  templateUrl: './btn.component.html',
  styleUrls: ['./btn.component.scss'],
})
export class BtnComponent {
  constructor() {}

  onClick($event: any) {
    console.log($event);
  }
}
ログイン後にコピー

btn.component.html

<button (click)=onClick($event)>
  Click Me
</button>
ログイン後にコピー

このコンポーネントでは、ボタンのテキストは常に Click Me です。別のテキストを渡したい場合は?最も一般的に使用される @Input デコレータを思い浮かべるかもしれませんが、テキストだけではなく HTML を渡したい場合はどうすればよいでしょうか?現時点では、この記事の主人公である ng-content を使用する必要があります。

シングル スロット コンテンツ プロジェクション

コンテンツ プロジェクションの最も基本的な形式は、シングル スロット コンテンツ プロジェクションです。単一スロット コンテンツの投影とは、コンポーネントを投影できるコンポーネントを作成することを意味します。

単一スロット コンテンツ プロジェクションを使用するコンポーネントを作成するには、上記のコンポーネントにいくつかの簡単な変更を加えるだけです。Click Me<ng-content> に置き換えます。 </ng-content>

btn.component.html

<button (click)=onClick($event)>
  <ng-content></ng-content>
</button>
ログイン後にコピー

btn コンポーネントが使用される場所:

<app-btn>Cancel</app-btn>
<app-btn><b>Submit</b></app-btn>
ログイン後にコピー

In<app-btn></app-btn> のコンテンツは btn コンポーネントに渡され、ng-contnet に表示されます。

マルチスロット コンテンツ プロジェクション

上記の btn コンポーネントは非常に単純ですが、実際には ng-content の方がこれよりも強力です。コンポーネントには複数のスロットを含めることができ、各スロットには、そのスロットにどのコンテンツを入れるかを決定する CSS セレクターを指定できます。このモードは、マルチスロット コンテンツ プロジェクションと呼ばれます。このモードを使用する場合は、投影されたコンテンツを表示する場所を指定する必要があります。これは、ng-contentselect 属性を使用して実行できます。

マルチスロット コンテンツ プロジェクションを使用するコンポーネントを作成するには、次の手順を実行する必要があります:

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

  • コンポーネント テンプレートで、投影されたコンテンツを表示する場所に ng-content 要素を追加します。

  • select 属性を ng-content 要素に追加します。 Angular で使用されるセレクターは、タグ名、属性、CSS クラス、および :not 疑似クラスの任意の組み合わせをサポートします。

より複雑なカード コンポーネントを作成してみましょう。

card.component.html

<div class="card">
  <div class="header">
    <ng-content select="header"></ng-content>
  </div>
  <div class="content">
    <ng-content select="content"></ng-content>
  </div>
  <div class="footer">
    <ng-content select="footer"></ng-content>
  </div>
</div>
ログイン後にコピー

カード コンポーネントが使用される場所:

app.component.html

<app-card>
  <header>
    <h1>Angular</h1>
  </header>
  <content>One framework. Mobile & desktop.</content>
  <footer><b>Super-powered by Google </b></footer>
</app-card>

<app-card>
  <header>
    <h1 style="color:red;">React</h1>
  </header>
  <content>A JavaScript library for building user interfaces</content>
  <footer><b>Facebook Open Source </b></footer>
</app-card>
ログイン後にコピー

If in app-ヘッダー、コンテンツ、フッターに属さないコンテンツがカードにありますか?たとえば、app-card コンポーネントを次のように使用すると:

app.component.html

<app-card>
  <header>
    <h1>Angular</h1>
  </header>
  <div>Not match any selector</div>
  <content>One framework. Mobile & desktop.</content>
  <footer><b>Super-powered by Google </b></footer>
  <div>This text will not not be shown</div>
</app-card>
ログイン後にコピー

、両方の div## がわかるでしょう。 # はページ内にレンダリングされません。この問題を解決するには、コンポーネントに selector を使用せずに ng-content タグを追加します。他のスロットに一致しないすべてのコンテンツは、このスロットでレンダリングされます。

card.component.html

<div class="card">
  <div class="header">
    <ng-content select="header"></ng-content>
  </div>
  <div class="content">
    <ng-content select="content"></ng-content>
  </div>
  <div class="footer">
    <ng-content select="footer"></ng-content>
  </div>
  <ng-content></ng-content>
</div>
ログイン後にコピー

ngProjectAs

場合によっては、

ng-container を使用してコンテンツをラップして渡す必要があります。コンポーネント内で。ほとんどの場合、ngIfngSwitch などの構造ディレクティブを使用する必要があることが原因です。たとえば、ヘッダーは特定の状況下でのみカード コンポーネントに渡されます。

以下の例では、ヘッダーを

ng-container でラップします。

<app-card>
  <ng-container>
    <header>
      <h1>Angular</h1>
    </header>
  </ng-container>
  <content>One framework. Mobile & desktop.</content>
  <footer><b>Super-powered by Google </b></footer>
</app-card>
ログイン後にコピー

ng-container の存在により、ヘッダー部分はレンダリングしたいスロットにレンダリングされず、ng- にレンダリングされます。 selector.content で。

この場合、

ngProjectAs 属性を使用できます。

この属性を上記の

ng-container に追加すると、期待どおりにレンダリングできます。

<app-card>
  <ng-container ngProjectAs=&#39;header&#39;>
    ...
</app-card>
ログイン後にコピー
プログラミング関連の知識について詳しくは、

プログラミング教育をご覧ください。 !

以上がAngular がコンテンツ投影に ng-content を使用する方法についての簡単な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:juejin.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート