angular中的ng-content

在開發(fā)一個(gè)前端程序時(shí)鸣剪,肯定會(huì)有很多相似的邏輯或布局俏扩,這時(shí)就需要提取公共組件或樣式來盡可的復(fù)用代碼揩悄。在angular中卖哎,提供了ng-content來更方便的編寫組件和布局甫窟。

ng-content

  • 在組件中嵌入內(nèi)容
  • 在組件中嵌入模板代碼
  • select屬性支持css選擇器(”#id”,”.class”等等)

使用
下面以表單中常見的布局為例:


<form-item>
    <form-item-label>
        手機(jī)號(hào)碼
    </form-item-label>
    <form-item-wrap>
        <input  name="phone" [(ngModel)]="phone"  placeholder="請(qǐng)輸入手機(jī)號(hào)"/>
    </form-item-wrap>
</form-item>

我們封裝了三個(gè)組件:form-item form-item-label form-item-wrap
我們期望form-item-label中的內(nèi)容展示頁面文字說明部分三椿,form-item-wrap展示頁面用戶輸入部分。

<form-item>
    <form-item-label>
    <!-- your html code -->
    </form-item-label>
    <form-item-wrap>
    <!-- your html code -->
    </form-item-wrap>
</form-item>

form-item組件代碼:

import { Component, ContentChild } from '@angular/core';
import { FormItemLabelComponent } from './form-item-lable.component';
import { FormItemWrapComponent } from './form-item-wrap.component';
@Component({
  selector: 'form-item',
  templateUrl: './form-item.component.html'
})
export class FormItemComponent {
  @ContentChild(FormItemLabelComponent) itemLabel;
  @ContentChild(FormItemWrapComponent) itemWrap;
}
html:
<div>
    <div class="css實(shí)現(xiàn)">
        <ng-content select="form-item-label" *ngIf="itemLabel"></ng-content>
    </div>
    <div class="css實(shí)現(xiàn)">
      <ng-content select="form-item-wrap" *ngIf="itemWrap"></ng-content>
    </div>
</div>

form-item-label組件代碼:

import { Component } from '@angular/core';
@Component({
  selector: 'form-item-label',
  template: '<ng-content></ng-content>'
})
export class FormItemLabelComponent {
}

form-item-wrap組件代碼:

import { Component } from '@angular/core';
@Component({
  selector: 'form-item-wrap',
  template: '<ng-content></ng-content>'
})
export class FormItemWrapComponent {
}

在組件form-item中通過ng-content的select屬性(使用的是css的element選擇器)投影form-item-label和form-item-wrap組件內(nèi)容嫉戚。

在form-item-label和form-item-wrap中則使用ng-content來嵌入模板代碼蹬挺,如果沒有ng-content則組件中的模板代碼無法展示维贺。(組件內(nèi)css樣式不再展示)

ContentChild

  • ContentChild 用來從通過 Content Projection 方式 (ng-content) 設(shè)置的視圖中獲取匹配的元素

  • 在父組件的 ngAfterContentInit 生命周期鉤子中才能成功獲取通過 ContentChild 查詢的元素

它和viewChild是不同的

  • ViewChild 用來從模板視圖中獲取匹配的元素
  • 在父組件的 ngAfterViewInit 生命周期鉤子中才能成功獲取通過 ViewChild 查詢的元素

與css直接布局對(duì)比優(yōu)勢(shì)

本文中注冊(cè)頁面視效是左右布局,有些ux設(shè)計(jì)可能是上下布局巴帮,可能是點(diǎn)擊操作彈出文字說明布局等等溯泣,這些布局抽象成建模分為兩部分:文字說明部分和用戶操作部分。使用ng-content編寫組件榕茧,實(shí)際上相當(dāng)于頁面領(lǐng)域的建模垃沦,form-item-label是文字描述部分,form-item-wrap是用戶操作部分用押,不論ux ui的設(shè)計(jì)如何肢簿,但是建模是一定的。

組件化的優(yōu)勢(shì)

  1. 犧牲我一個(gè)蜻拨,幸福千萬家
  2. 以表單舉例:設(shè)計(jì)師要求左邊部分帶必選符號(hào)”*“或者”:”池充,如果是各個(gè)業(yè)務(wù)的開發(fā)童鞋來寫,后期設(shè)計(jì)一旦變更缎讼,就會(huì)存在更換不及時(shí)收夸,整個(gè)產(chǎn)品用戶體驗(yàn)不一致的情況,而如果通過form-item組件內(nèi)部搞定這件事情休涤,只需要開發(fā)這個(gè)組件的同事更新組件即可咱圆,保證了整體的一致性
  3. 項(xiàng)目團(tuán)隊(duì)有一個(gè)css高手保證組件樣式即可笛辟,極大的提升開發(fā)效率

總結(jié)

ng-content是組件化的神器,用好ng-content對(duì)一個(gè)項(xiàng)目有極大的便利序苏。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末手幢,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子忱详,更是在濱河造成了極大的恐慌围来,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件匈睁,死亡現(xiàn)場(chǎng)離奇詭異监透,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)航唆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門胀蛮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人糯钙,你說我怎么就攤上這事粪狼。” “怎么了任岸?”我有些...
    開封第一講書人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵再榄,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我享潜,道長(zhǎng)困鸥,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任剑按,我火速辦了婚禮疾就,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘吕座。我一直安慰自己虐译,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開白布吴趴。 她就那樣靜靜地躺著漆诽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪锣枝。 梳的紋絲不亂的頭發(fā)上厢拭,一...
    開封第一講書人閱讀 49,784評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音撇叁,去河邊找鬼供鸠。 笑死,一個(gè)胖子當(dāng)著我的面吹牛陨闹,可吹牛的內(nèi)容都是我干的楞捂。 我是一名探鬼主播薄坏,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼寨闹!你這毒婦竟也來了胶坠?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤繁堡,失蹤者是張志新(化名)和其女友劉穎沈善,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體椭蹄,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡闻牡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了绳矩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片罩润。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖埋酬,靈堂內(nèi)的尸體忽然破棺而出哨啃,到底是詐尸還是另有隱情,我是刑警寧澤写妥,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站审姓,受9級(jí)特大地震影響珍特,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜魔吐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一扎筒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧酬姆,春花似錦嗜桌、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至相满,卻和暖如春层亿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背立美。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工匿又, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人建蹄。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓碌更,卻偏偏與公主長(zhǎng)得像裕偿,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子痛单,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,756評(píng)論 25 707
  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案击费? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 13,737評(píng)論 1 92
  • ——被安利之后種草非常想玩甚至想實(shí)況的游戲系列之一—— 一個(gè)多月前的某一天晚上蔫巩,很湊巧地趕上了嵐少的直播。 然后就...
    佳木繁玥閱讀 1,053評(píng)論 0 4
  • 這一年的8月異常浮躁快压。 “第9號(hào)臺(tái)風(fēng)‘麥莎’在浙江省玉環(huán)縣干江鎮(zhèn)正面登陸圆仔,隨后橫穿浙江。臺(tái)風(fēng)過處蔫劣,狂風(fēng)怒發(fā)坪郭,海潮翻...
    南呂先生閱讀 571評(píng)論 0 51
  • 屬性說明 名稱 物品名稱 價(jià)格 價(jià)格
    玉面笑客閱讀 5,668評(píng)論 1 0