淺談angular4生命周期鉤子
理解
Angular提供了生命周期鉤子,把這些關(guān)鍵生命時(shí)刻暴露出來,賦予我們在它們發(fā)生時(shí)采取行動的能力??梢詫^子函數(shù)理解為在合適的時(shí)候做合適的事情。
鉤子函數(shù)
ng4主要提供了8個(gè)鉤子函數(shù):
1、ngOnchanges
@input屬性(輸入屬性)發(fā)生變化時(shí),會調(diào)用。非此屬性,不會調(diào)用。
當(dāng)輸入屬性為對象時(shí),當(dāng)對象的屬性值發(fā)生變化時(shí),不會調(diào)用,當(dāng)對象的引用變化時(shí)會觸發(fā)。
先于ngOnInit調(diào)用。
2、ngOnInit
只執(zhí)行一次,dom操作可放在其中。(最常用)
3、NgDocheck
每次發(fā)生變更檢測時(shí)會被調(diào)用
ngDoCheck() 是Angular中的變更檢測機(jī)制.它由 zone.js 來實(shí)現(xiàn)的.其行為是只要你的Angular中的某個(gè)組件發(fā)生異步事件.就會檢查整個(gè)組件樹,以保證組件屬性的變化或頁面的變化是同步的.所以 ngDoCheck() 的觸發(fā)相當(dāng)頻繁的.并且是我們無法預(yù)料到的.也許我們在頁面上的一個(gè)無意識操作,就會觸發(fā)幾個(gè)甚至幾十個(gè)的 ngDoCheck() 生命周期鉤子.
4、ngAfterContentInit
在組件內(nèi)容初始化之后調(diào)用
5、ngAfterContentChecked
內(nèi)容投影:父組件寫在子標(biāo)簽之間的內(nèi)容會被渲染到子模板的ng-content中去,類似vue的slot
組件及子組件每次檢查內(nèi)容時(shí)調(diào)用
當(dāng)父子組件都有該鉤子時(shí),父組件先執(zhí)行。
6、ngAfterViewInt
組件相應(yīng)的視圖初始化之后調(diào)用
7、ngAfterViewChecked
組件及子組件每次檢查視圖時(shí)調(diào)用
當(dāng)父子組件都有該鉤子時(shí),子組件先執(zhí)行。
ngAfterViewChecked與ngAfterViewInt中不允許修改綁定的屬性(@input屬性),否則拋出異常
8、ngOnDestory
銷毀,事件解綁。
3.執(zhí)行順序
父組件:
組件模板
<div class="panel-body"> <input type="text" [(ngModel)]="name"> {{name}} <son [name]="name"></son> </div>
組件
@Component({ selector: 'father', templateUrl: './father.component.html', styleUrls: ['./father.component.scss'] }) export class FatherComponent implements OnInit { public name:string; constructor() { } ngOnInit() { console.log("父組件ngOninit"); } ngOnchanges(){ console.log("父組件ngonchanges"); } ngDoCheck (){ console.log("父組件ngDocheck") } ngAfterContentInit(){ console.log("父組件ngAfterContentInit") } ngAfterContentChecked(){ console.log("父組件ngAfterContentChecked") } ngAfterViewInit(){ console.log("父組件ngAfterViewInit") } ngAfterViewChecked(){ console.log("父組件ngAfterViewChecked") } }
子組件
@Component({ selector: 'son', templateUrl: './son.component.html', styleUrls: ['./son.component.scss'] }) export class SonComponent implements OnInit { @Input() name:string; constructor() { } ngOnInit() { console.log("子組件ngOninit"); } ngOnChanges (){ console.log("子組件ngonchanges"); } ngDoCheck (){ console.log("子組件ngDocheck") } ngAfterContentInit(){ console.log("子組件ngAfterContentInit") } ngAfterContentChecked(){ console.log("子組件ngAfterContentChecked") } ngAfterViewInit(){ console.log("子組件ngAfterViewInit") } ngAfterViewChecked(){ console.log("子組件ngAfterViewChecked") } }
看打印結(jié)果:
當(dāng)在父組件的input中輸入內(nèi)容時(shí),會打印如下結(jié)果:
看到有人說只有當(dāng)使用內(nèi)容投影時(shí)才會調(diào)用ngAfterConentChecked,當(dāng)上面的里面的代碼很顯然是沒用ng-content的,不知道該怎么解釋這個(gè)ngAfterConentChecked。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
angularjs2 ng2 密碼隱藏顯示的實(shí)例代碼
本篇文章主要介紹了angularjs2 ng2 密碼隱藏顯示的實(shí)例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08全面解析Angular中$Apply()及$Digest()的區(qū)別
$apply()和$digest()在AngularJS中是兩個(gè)核心概念,但是有時(shí)候它們又讓人困惑。這篇文章主要介紹了Angular中$Apply()及$Digest()區(qū)別詳細(xì)說明的相關(guān)資料,需要的朋友可以參考下2016-08-08Angular重構(gòu)數(shù)組字段的解決方法示例
這篇文章主要為大家介紹了Angular重構(gòu)數(shù)組字段的解決方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09淺析如何利用angular結(jié)合translate為項(xiàng)目實(shí)現(xiàn)國際化
利用angular進(jìn)行國際化轉(zhuǎn)換時(shí)利用【ng-bind-html】來進(jìn)行語言的翻譯是接近幾乎比較完美的方案,不會像利用【{{}}】模式,當(dāng)頁面加載緩慢時(shí)導(dǎo)致頁面太丑。本文對其實(shí)現(xiàn)方法進(jìn)行介紹,有需要的朋友可以看下2016-12-12詳解Angular Reactive Form 表單驗(yàn)證
本文我們將介紹 Reactive Form 表單驗(yàn)證的相關(guān)知識,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-07-07AngularJS實(shí)現(xiàn)Model緩存的方式
這篇文章主要介紹了AngularJS實(shí)現(xiàn)Model緩存的方式,分享了多種AngularJS實(shí)現(xiàn)Model緩存的方法,感興趣的小伙伴們可以參考一下2016-02-02在 Angular6 中使用 HTTP 請求服務(wù)端數(shù)據(jù)的步驟詳解
本文分步驟給大家介紹了在 Angular6 中使用 HTTP 請求服務(wù)端數(shù)據(jù)的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-08-08