您好,登錄后才能下訂單哦!
這篇文章給大家介紹如何使用Angular組件實現內容投影,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
容器組件這樣寫
<div> 編號1 <ng-content></ng-content> </div>
業務組件這樣用
<app-page-container> 未指定投影位置的內容會被投影到無select屬性的區域 </app-page-container>
容器組件這樣寫
使用標簽鎖定投影位置
使用class鎖定投影位置
用自定義組件名稱鎖定投影位置
使用自定義屬性鎖定投影位置
<div> 編號2 <ng-content select="h4"></ng-content> <ng-content select=".my-class"></ng-content> <ng-content select="app-my-hello"></ng-content> <ng-content select="[content]"></ng-content> </div>
業務組件這樣用
<app-page-container> <h4>使用標簽鎖定投影位置</h4> <div class="my-class">使用class鎖定投影位置</div> <app-my-hello>使用自定義組件名稱鎖定投影位置</app-my-hello> <div content>使用自定義屬性鎖定投影位置</div> </app-page-container>
演示
使用
ng-container
來包裹子元素,減少不必要的dom層,類似vue中的template
容器組件這樣寫
<div> 編號4 <ng-content select="question"></ng-content> </div>
業務組件這樣寫
<app-page-container> <ng-container ngProjectAs="question"> <p>內容投影酷嗎?</p> <p>內容投影酷嗎?</p> <p>內容投影酷嗎?</p> <p>內容投影酷嗎?</p> </ng-container> </app-page-container>
中文網的描述:
如果你的組件需要_有條件地_渲染內容或多次渲染內容,則應配置該組件以接受一個 ng-template 元素,其中包含要有條件渲染的內容。
在這種情況下,不建議使用 ng-content 元素,因為只要組件的使用者提供了內容,即使該組件從未定義 ng-content 元素或該 ng-content 元素位于 ngIf 語句的內部,該內容也總會被初始化。
使用 ng-template 元素,你可以讓組件根據你想要的任何條件顯式渲染內容,并可以進行多次渲染。在顯式渲染 ng-template 元素之前,Angular 不會初始化該元素的內容。
使用ng-container
定義我們的投影區塊
使用ngTemplateOutlet
指令來渲染ng-template
元素。
通過內置的動態指令*ngIf
來控制是否渲染投影。
<div> 編號3 <ng-content select="[button]"></ng-content> <p *ngIf="expanded"> <ng-container [ngTemplateOutlet]="content.templateRef"> </ng-container> </p> </div>
在業務組件中我們使用ng-template
來包裹我們的實際元素。
my-hello組件只在ngOnInit()做日志輸出來觀察打印情況。
<app-page-container> <div button> <button appToggle>切換</button> </div> <ng-template appContent> <app-my-hello>有條件的內容投影~</app-my-hello> </ng-template> </app-page-container>
現在你會發現頁面并沒有像前面那么順利的正常渲染,因為我們的邏輯還沒有串通,我們繼續。創建一個指令,并在NgModule中注冊,一定要注冊才能用哦~
指令需要注冊哦~
import { Directive, TemplateRef } from '@angular/core'; @Directive({ selector: '[appContent]', }) export class ContentDirective { constructor(public templateRef: TemplateRef<unknown>) {} }
我們再定義一個指令來控制組件中顯示/隱藏的標識
指令需要注冊哦~
@Directive({ selector: '[appToggle]', }) export class ToggleDirective { @HostListener('click') toggle() { this.app.expanded = !this.app.expanded; } constructor(public app: PageContainerComponent) {} }
在我們的容器組件中申明剛才定義的內容指令,頁面目前不報錯咯~
export class PageContainerComponent implements OnInit { expanded: boolean = false; @ContentChild(ContentDirective) content!: ContentDirective; }
通過日志可以看到我們在切換容器組件的expanded
標識時,只有開啟狀態my-hello
組件才會初始化,下面的這個ngIf
雖然在頁面看不到渲染的內容,但組件實實在在被初始化過了。
<div *ngIf="false"> <ng-content *ngIf="false" select="app-my-hello"></ng-content> </div>
使用這兩個裝飾器來對被投影的組件進行操作
使用注解在業務組件中定義被投影的組件
@ContentChild(HelloWorldComp) helloComp: HelloWorldComp; @ContentChildren(HelloWorldComp) helloComps: QueryList<HelloWorldComp>;
在ngAfterContentInit()
鉤子執行后對被投影組件進行操作
使用這兩個裝飾器來對指接子組件進行操作
使用注解在業務組件中定義子組件
@ViewChild(HelloWorldComp) helloComp: HelloWorldComp; @ViewChildren(HelloWorldComp) helloComps QueryList<HelloWorldComp>;
在ngAfterViewInit()
鉤子執行后對直接子組件進行操作
關于如何使用Angular組件實現內容投影就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。