淺談對Angular中的生命周期鉤子的理解
本文介紹了Angular中的生命周期鉤子的理解,分享給大家,希望對大家有所幫助
“只有客戶發(fā)展了,才有我們的生存與發(fā)展!”這是成都創(chuàng)新互聯(lián)公司的服務(wù)宗旨!把網(wǎng)站當(dāng)作互聯(lián)網(wǎng)產(chǎn)品,產(chǎn)品思維更注重全局思維、需求分析和迭代思維,在網(wǎng)站建設(shè)中就是為了建設(shè)一個不僅審美在線,而且實用性極高的網(wǎng)站。創(chuàng)新互聯(lián)對成都網(wǎng)站制作、網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)站開發(fā)、網(wǎng)頁設(shè)計、網(wǎng)站優(yōu)化、網(wǎng)絡(luò)推廣、探索永無止境。
什么是生命周期鉤子
簡單點來說生命周期鉤子就是Angular中一個組件從被創(chuàng)建當(dāng)銷毀期間的一些有意義的關(guān)鍵時刻.這些關(guān)鍵時刻在Angular中被Angular核心模塊 @angular/core 暴露出來,賦予了我們在它們發(fā)生時采取行動的能力.
有哪些生命周期鉤子
Angular中從一個組件的創(chuàng)建到銷毀一個有八個生命周期鉤子它們,按照先后順序.它們分別是:
- ngOnChanges()
- ngOnInit()
- ngDoCheck()
- ngAfterContentInit()
- ngAfterContentChecked()
- ngAfterViewInit()
- ngAfterViewChecked()
- ngOnDestroy()
其中: ngOnInit() 、 ngAfterContentInit() 、 ngAfterViewInit() 和 ngOnDestroy() 在一個組件的生命周期中只會被調(diào)用一次,其它的都有可能會被多次調(diào)用.下面,就讓我們來詳細(xì)解列一下這些生命周期鉤子.
ngOnChanges()
- 當(dāng)Angular(重新)設(shè)置數(shù)據(jù)綁定輸入屬性時響應(yīng)。 該方法接受當(dāng)前和上一屬性值的SimpleChanges對象
- 當(dāng)被綁定的輸入屬性的值發(fā)生變化時調(diào)用,首次調(diào)用一定會發(fā)生在ngOnInit()之前。
ngOnChanges() 生命周期的調(diào)用與一個組件中的輸入屬性有關(guān).
當(dāng)在一個組件中使用 @Input() 定義了一個輸入屬性時.只要這個輸入屬性的值發(fā)生了改變.就會觸發(fā) ngOnChanges() 生命周期鉤子.這個生命周期鉤子被調(diào)用時會傳入一個 SimpleChanges 對象,這個對象中包含了輸入屬性當(dāng)前值和上一值.
@Input() public name: string; ngOnChanges(changes: SimpleChanges): void { console.log(changes); // name:SimpleChange {previousValue: "a", currentValue: "ab", firstChange: false} }
上面是我定義了一個輸入屬性 name 并將從 a 它改為 ab 之后的打印結(jié)果,可能你還注意到了打印的結(jié)果中還有一個 firstChange 屬性.它是一個Booleans,表明你是否是第一次改變.
同時,還有一點需要注意:你的輸入屬性定義為你引用類型和基本類型的時候其表現(xiàn)結(jié)果是不同的.當(dāng)你的輸入屬性是基本類型時.你的每一次改變都會觸發(fā) ngOnChanges() 生命周期鉤子,而當(dāng)你的輸入屬性是引用類型時,你改變你引用類型 當(dāng)中 的屬性時,并不會觸發(fā) ngOnChanges() 生命周期鉤子.只有當(dāng)你將你引用類型數(shù)據(jù)的指針指向另一塊內(nèi)存地址的時候才會觸發(fā) ngOnChanges() 生命周期鉤子.
ngOnInit()
- 在Angular第一次顯示數(shù)據(jù)綁定和設(shè)置指令/組件的輸入屬性之后,初始化指令/組件。
- 在第一輪ngOnChanges()完成之后調(diào)用,只調(diào)用一次。
ngOnInit() 是一個組件的生命周期中一定存在的一個鉤子.它在一個組件被初始化的時候被調(diào)用.在這個期間,你可以執(zhí)行一些相應(yīng)的數(shù)據(jù)綁定操作.
ngDoCheck()
- 檢測,并在發(fā)生Angular無法或不愿意自己檢測的變化時作出反應(yīng)。
- 在每個Angular變更檢測周期中調(diào)用,ngOnChanges()和ngOnInit()之后。
ngDoCheck() 是Angular中的變更檢測機(jī)制.它由 zone.js 來實現(xiàn)的.其行為是只要你的Angular中的某個組件發(fā)生異步事件.就會檢查整個組件樹,以保證組件屬性的變化或頁面的變化是同步的.所以 ngDoCheck() 的觸發(fā)相當(dāng)頻繁的.并且是我們無法預(yù)料到的.也許我們在頁面上的一個無意識操作,就會觸發(fā)幾個甚至幾十個的 ngDoCheck() 生命周期鉤子.
所以我們在使用 ngDoCheck() 生命周期鉤子的時候一定要加上判斷.以避免無用的觸發(fā)干擾我們.
ngAfterContentInit()
- 當(dāng)把內(nèi)容投影進(jìn)組件之后調(diào)用。
- 第一次ngDoCheck()之后調(diào)用,只調(diào)用一次。
- 只適用于組件。
當(dāng)父組件向子組件投影內(nèi)容的時.在子組件內(nèi)會初始化父組件的投影內(nèi)容,此時會調(diào)用 ngAfterContentInit() 生命周期鉤子.在整個組件生命周期中 ngAfterContentInit() 生命周期鉤子只會調(diào)用一次.如下所示:
// 父組件我是父組件向子組件的投影內(nèi)容 // 子組件 ChildComponent
//接受父組件的投影內(nèi)容
ngAfterContentChecked()
- 每次完成被投影組件內(nèi)容的變更檢測之后調(diào)用。
- ngAfterContentInit()和每次ngDoCheck()之后調(diào)用
- 只適合組件。
當(dāng)父組件向子組件的投影內(nèi)容發(fā)生改變時會調(diào)用 ngAfterContentChecked() 生命周期鉤子.它與 ngDoCheck() 類似.當(dāng)投影內(nèi)容發(fā)生改變時,就會執(zhí)行變更檢查機(jī)制.同時調(diào)用 ngAfterContentChecked() 生命周期鉤子.此外.還有一點:當(dāng)父組件和子組件都有投影內(nèi)容時,會先執(zhí)行父組件的生命周期鉤子.它與下面要說的 ngAfterViewInit() 和 ngAfterViewChecked() 相反.
ngAfterViewInit()
- 初始化完組件視圖及其子視圖之后調(diào)用。
- 第一次ngAfterContentChecked()之后調(diào)用,只調(diào)用一次。
- 只適合組件。
當(dāng)其組件本身和所有的子組件渲染完成,已經(jīng)呈現(xiàn)在頁面上時,調(diào)用 ngAfterViewInit() 生命周期鉤子.在整個組件生命周期中 ngAfterViewInit() 生命周期鉤子只會調(diào)用一次.
ngAfterViewChecked()
- 每次做完組件視圖和子視圖的變更檢測之后調(diào)用。
- ngAfterViewInit()和每次ngAfterContentChecked()之后調(diào)用。
- 只適合組件。
當(dāng)組件及其子組件的視圖發(fā)生改變時,執(zhí)行完變更檢查機(jī)制后調(diào)用.當(dāng)父組件和子組件都發(fā)生視圖變化時,會先執(zhí)行子組件的生命周期鉤子.
注意:這里所說的視圖發(fā)生改變不一定是真正頁面上的變化.只是Angular種所認(rèn)為的視圖變化.因為Angular本身并不能察覺到頁面上顯示的視圖.所以在Angular認(rèn)為,只要你在后臺定義的屬性發(fā)生了改變,就是視圖有了變化.從而就會調(diào)用 ngAfterViewChecked() 生命周期鉤子.
ngOnDestroy
- 當(dāng)Angular每次銷毀指令/組件之前調(diào)用并清掃。 在這兒反訂閱可觀察對象和分離事件處理器,以防內(nèi)存泄漏。
- 在Angular銷毀指令/組件之前調(diào)用。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。
當(dāng)前名稱:淺談對Angular中的生命周期鉤子的理解
轉(zhuǎn)載來于:http://www.xueling.net.cn/article/ghgids.html