angular-片段与插槽

我们在使用vue时一定用到过slot,这个东西很好用,那angular是否也有类似的东东呢?
答案是肯定的,不过在讲这个之前,我们先来搞明白一个特殊标签。

ng-container

ng-container是angular的一个特殊标签,有点类似ng-template,但二者的用法不一样。
最大的不同之处在于,ng-template包裹的内容无法展示出来,而ng-container却可以:

<ul>
    <ng-container *ngFor="let item of listdata">
        <li>
            {{item.id}}---{{item.name}}
        </li>
    </ng-container>
</ul>

编译后发现,ng-container并创建任何节点,只是作为一个逻辑tag来使用。
有时为了代码清晰明了,我们并不希望将*ngFor的逻辑放在实际的模板标签上,这时ng-container就派上了用场。

模板片段ngTemplateOutlet

这个语法糖实现的是模板片段,跟slot有一点像。

具名片段
<ng-template #header>
    Hello, header!
</ng-template>
<ng-template #footer>
    Hello, footer!
</ng-template>

<div [ngTemplateOutlet]="header"></div>
<div [ngTemplateOutlet]="footer"></div>
作用域片段

作用域片段需要声明上下文,以便渲染代码片段的时候绑定相关字段。


<!--ng-container容器下嵌入代码片段,id是tplStu,上下文context是student-->
<ng-container *ngTemplateOutlet="tplStu; context: student">

</ng-container>


<ng-template #tplStu let-name let-ageHTML="age">


    hello {{name}},your age is {{ageHTML}}

</ng-template>

let-name这种写法有点奇怪,其实就是let name="xxx"的意思,如果后面不跟具体的值,就是代表默认值。
let-ageHTML = "age",翻译过来就是let ageHTML = "age"。
name和age两个字段,绑定的上下文context就是student,需要在ts文件声明,最终访问的是student.name和student.age。
ts文件:

student = { $implicit: 'jack' , age: '19'};//$implicit的英文愿意是含蓄的,引申为默认值的意思,本例对应的就是let-name

插槽ng-content

angular真正的插槽是ng-content,一般是用于组件之间的信息传递。

匿名插槽

father.component.html:

<app-child>
    
    <h2>这是一个匿名插槽</h2>
</app-child>

child.component.html:

<div style="background:yellow">
    <ng-content></ng-content>
</div>

匿名插槽很简单,利用ng-content这个特殊tag占个坑即可搞定。

具名插槽

ng-content可以加select关键字,就是具名插槽。
father.component.html:

<app-child>
    <div ngProjectAs="demo1">
        <h1>我是demo1</h1>
    </div>
    <div class="demo2">
        <h2 style="color:yellow;">class为"demo2"</h2>
    </div>
    <div name="demo3">
        <h3>name为"demo3"</h3>
    </div>
    <app-other></app-other>
</app-child>

这个具名插槽十分强大,子组件也能传递。
child.component.html:

<ng-content select="demo1"></ng-content>
<ng-content select=".demo2"></ng-content>
<ng-content select="[name=demo3]"></ng-content>
<!--子组件渲染-->
<ng-content select="app-other"></ng-content>
作用域插槽

要实现作用域插槽,还是得借助ngTemplateOutlet的力量,ng-content无法满足需求。
father.component.html:

<app-child [myslot]="slotTpl"></app-child>

<ng-template #slotTpl let-name let-ageHTML="age">


    hello {{name}},your age is {{ageHTML}}

</ng-template>

然后子组件需要接收信息,用@Input()装饰器可以搞定。
child.component.ts:

  @Input() myslot:any;//严格类型是TemplateRef<any>
  ...
  student = { $implicit: 'jack' , age: '19'};//定义上下文

然后在子组件模板中渲染出来即可。
child.component.html:

<ng-container *ngTemplateOutlet="myslot;context:student">

</ng-container>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容