angular中内容投影即插槽slot知识点整理

使用投影来创建灵活的可复用性组件
投影分为三种:
单插槽内容投影,使用这种投影,组件可以从单一来源接受内容
多插槽内容投影,使用这种投影,组件可以从多个来源接受内容
有条件的内容投影,使用条件内容投影的组件必须在符合条件时才能接受内容
ng-content 元素只是一个占位符,它不会创建真正的dom元素,ng-content 上的自定义属性将会被忽略

单插槽内容投影:

//内容投影组件模板
<p>单插槽内容投影:</p>
<app-one-content-projection>
  <p>单插槽内容投影</p>
</app-one-content-projection>

//使用内容投影组件模板
<h2>单插槽内容投影  组件</h2>
<ng-content></ng-content>

多插槽内容投影

//内容投影组件模板
<h2>Multi-slot content projection</h2>
Default:
<ng-content></ng-content>

Question:
<ng-content select="[question]"></ng-content>

//使用内容投影组件模板
<p>多插槽内容投影</p>
<app-multislot-content>
  <p>没有select选择器</p>
  <p>111</p>
  <p question> 问题? 这里是带select选择器的</p>
</app-multislot-content>

注:如果多插槽内容投影组件中包含 没有select的ng-content元素,则该实例将接受所有不符合select选择器的投影组件
如上述:

<p>没有select选择器</p><p>111</p>

都会投影到

Default:
<ng-content></ng-content>

有条件的内容投影

不推荐使用ng-content元素 使用ng-content元素 因为组件的使用者只要提供了内容,即使从未定义过ng-content或者在ngif下,内容也会初始化
需要新建一个指令以将 标记为组件内容。借助这个 TemplateRef,组件可以使用 ngTemplateOutlet指令或ViewContainerRef.createEmbeddedView()方法来渲染所引用的内容。

@Directive({
  selector: '[appConditionally]'
})
export class  ConditionallyDirective{

  constructor(public templateRef: TemplateRef<unknown>) { }

}

//使用投影组件模板
<p>有条件的内容投影</p>
<app-if-content>
  <ng-template appConditionally>
    <p>有条件的内容投影 内容部分</p>
  </ng-template>
</app-if-content>


//投影组件模板
<div>
  <p>有条件的组件投影:</p>
  <ng-container *ngIf="status">
    <ng-container [ngTemplateOutlet]="content.templateRef"></ng-container>
  </ng-container>
</div>

//投影组件 ts
status = false;
@ContentChild(ConditionallyDirective) content!: ConditionallyDirective;
constructor() {
    interval(1000).subscribe(res => this.status = !this.status)
 }
Angular插槽Slot)概念并不像Vue或Web Components的那样直接存在。不过,在Angular可以通过Content Projection的方式来实现类似插槽的功能,即允许开发者指定一个位置,让父组件可以在其插入子组件或者内容。 在Angular,Content Projection通常是通过使用`<ng-content>`标签来实现的。开发者可以指定一个投影的选择器,从而可以将内容投影到特定的元素上。使用`select`属性可以在`<ng-content>`标签内指定选择器,这样就只有匹配该选择器的元素才会被投影到这个位置。 在Angular 6及以后的版本,可以使用`@ContentChild`和`@ContentChildren`装饰器来获取投影内容,并且可以通过`ngAfterContentInit`生命周期钩子来接收参数。 下面是一个简单的例子来说明如何在Angular使用Content Projection和传参: 1. 创建一个组件,定义一个插槽,使用`<ng-content>`标签并指定一个选择器: ```typescript // my-slot.component.ts import { Component, Input, ContentChildren, AfterContentInit, QueryList } from '@angular/core'; @Component({ selector: 'app-my-slot', template: ` <ng-content select="[appSlot]"></ng-content> `, }) export class MySlotComponent implements AfterContentInit { @ContentChildren('appSlot', { read: Input }) private content: QueryList<any>; ngAfterContentInit() { if (this.content.length > 0) { const projectedContent = this.content.first; // 在这里,你可以通过projectedContent获取传入插槽的参数 } } } ``` 2. 在父组件的模板使用这个带有插槽的组件,并传递参数: ```html <!-- parent.component.html --> <app-my-slot> <div appSlot let-param="value"> <!-- 这里可以使用投影内容,并通过let-语法传递参数 --> {{param}} </div> </app-my-slot> ``` 在这个例子,我们在父组件的模板创建了一个`div`元素,并通过`appSlot`指令告诉Angular它应该被投影到`MySlotComponent`的`<ng-content select="[appSlot]"></ng-content>`指定的位置。我们还使用了`let-param="value"`语法来传递参数给插槽内容
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值