Angular組件——組件生命周期(二)

来源:https://www.cnblogs.com/starof/archive/2018/04/09/8705587.html
-Advertisement-
Play Games

一、view鉤子 view鉤子有2個,ngAfterViewInit和ngAfterViewChecked鉤子。 1、實現ngAfterViewInit和ngAfterViewChecked鉤子時註意事項 以父組件調用子組件方法 中例子為基礎,在父組件中實現ngAfterViewInit和ngAft ...


一、view鉤子

 view鉤子有2個,ngAfterViewInit和ngAfterViewChecked鉤子。

1、實現ngAfterViewInit和ngAfterViewChecked鉤子時註意事項

父組件調用子組件方法 中例子為基礎,在父組件中實現ngAfterViewInit和ngAfterViewChecked鉤子。

這兩個鉤子是在組件的模版所有內容組裝完成後,組件模版已經呈現給用戶看了,之後這兩個鉤子方法會被調用。

@ViewChild('child1')
child1:Child1Component; //父組件中獲得子組件的引用

ngOnInit(){
  this.child1.greeting("Tom");
}

ngAfterViewInit(){
  console.log("父組件的視圖初始化完畢");
}

ngAfterViewChecked(){
  console.log("父組件的視圖變更檢測完畢");
}

在子組件中也實現這兩個鉤子

export class Child1Component implements OnInit,AfterViewInit,AfterViewChecked{

  constructor() { }

  ngOnInit() {
  }

  greeting(name: string) {
    console.log("hello" + name);
  }

  ngAfterViewInit(){
    console.log("子組件的視圖初始化完畢");
  }
  
  ngAfterViewChecked(){
    console.log("子組件的視圖變更檢測完畢");
  }
}
View Code

在父組件的ngOnInit中不直接調用子組件的greeting()方法,而是通過一個定時器每隔5s去調用一次。

ngOnInit(){
  setInterval(()=>{
    this.child1.greeting("Tom");
  },5000);
}

總結:

1、Init先調用,checked後調用

看1中,首先子組件視圖初始化完畢,然後子組件視圖變更檢測完畢。

2、子組件先於父組件被組裝好

看2中,因為父組件中聲明瞭2個子組件,所以看到有2個子組件 初始化的動作。1號子組件初始化完畢,變更檢測完畢,2號子組件初始化完畢,變更檢測完畢後,父組件的初始化完畢才會被調用,然後父組件的變更檢測完畢才會被調用。

3、ngAfterViewInit只會在初始化完畢被調用一次。

4、定時器觸發方法後,兩個子組件的變更檢測會被調用,父組件的變更檢測也會被調用。

視圖沒有發生任何改變,變更檢測也會被調用,實現來ngAfterViewChecked()鉤子的方法都會被調用。

所以ngAfterViewChecked()鉤子一定要寫的精簡以免出現性能問題。

2、在一個變更檢測周期中禁止一個視圖被組裝好之後再去更新視圖

例子:

父組件

有一個message初始化為abc.顯示到模版上。

message:string='abc';

在父組件的ngAfterViewInit中更改message值。

ngAfterViewInit(){
  console.log("父組件的視圖初始化完畢");
  this.message="def";
}

會報錯。ngAfterViewInit()和ngAfterViewChecked()都是在視圖組裝完成後觸發的,所以在這兩個鉤子中更新組件中被綁定的屬性,觸發組件視圖的變化,Angular就會拋出異常。

解決辦法:

把代碼放在另一個時間迴圈裡面。

ngAfterViewInit(){
  console.log("父組件的視圖初始化完畢");
  setTimeout(()=>{
    this.message="def";
  },0);
}

二、content鉤子

包括2個與投影相關的鉤子,ngAfterContentInit()和ngAfterContentChecked()鉤子。

ngAfterContentInit,ngAfterContentChecked和ngAfterViewInit,ngAfterViewChecked類似。

ngAfterViewInit,ngAfteViewChecked是在整個組件的視圖全部組裝完成後調用的。

ngAfterContentInit,ngAfterContentChecked是在被投影進來的內容組裝完成後調用的。

1、Content鉤子的調用順序例子

父組件中實現ngAfterContentInit,ngAfterContentChecked和ngAfterContentInit()

export class AppComponent implements OnInit, AfterViewInit, AfterContentInit,AfterContentChecked{

ngAfterViewInit(){
  console.log("父組件的視圖初始化完畢");
}

ngAfterContentInit(){
  console.log("父組件投影內容初始化完畢");
}
ngAfterContentChecked(){
  console.log("父組件投影內容變更檢測完畢");
}

子組件中也實現這3個介面

export class Child2Component implements OnInit,AfterViewChecked,AfterContentInit,AfterContentChecked{

  constructor() { }

  ngOnInit() {
  }
  ngAfterViewInit(){
    console.log("子組件的視圖初始化完畢");
  }
  
  ngAfterContentInit(){
    console.log("子組件投影內容初始化完畢");
  }
  ngAfterContentChecked(){
    console.log("子組件投影內容變更檢測完畢");
  }
}

組裝視圖時,先組裝投影進來的內容,然後組裝子組件中視圖的內容,再加上父組件本身的內容,然後才是父組件視圖初始化完畢。

2、Content鉤子中可以修改模版內容

view鉤子里不能修改模版內容,因為模版內容組裝完畢後不能再修改裡面內容。但是Content鉤子里可以。

因為Content鉤子調用時整個視圖還沒有組裝完畢,只是投影進來的內容被組裝完畢了。

父組件中在ngAfterContentInit鉤子里修改message信息不會報錯。

export class AppComponent implements OnInit, AfterViewInit, AfterContentInit,AfterContentChecked{
message:string='abc';
ngAfterViewInit(){
  console.log("父組件的視圖初始化完畢");
}

ngAfterContentInit(){
  console.log("父組件投影內容初始化完畢");
  this.message='def';
}
ngAfterContentChecked(){
  console.log("父組件投影內容變更檢測完畢");
}
ngOnInit(){

}
View Code

三、總結

上面四個方法在屬性初始化階段:構造函數是初始化對象,ngOnChanges是初始化輸入屬性,ngOnInit是初始化除了輸入屬性以外其它的所有屬性,ngDoCheck是做一次變更檢查。

這四個方法執行完整個組件所有屬性都被賦予了應該被賦的值。

 

組件開始渲染它的視圖,首先渲染投影進來的內容,投影進來的內容渲染完調用ngAfterContentInit和ngAfterContentChecked鉤子方法。

 

如果有子組件會調子組件創建的過程,子組件創建完或者沒有子組件,整個組件的視圖都初始化完畢了以後,會調ngAfterViewInit和ngAfterViewChecked鉤子方法。

至此,整個組件初始化完畢,組件會呈現給用戶交互。

用戶交互觸發Angular的變更檢測機制,檢測到發生了變更,在當前組件樹上所有活動組件上被實現的帶有check的鉤子方法都會被調用,用來檢查當前組件的變化,如果變化導致某個組件的輸入屬性也改變了,那個組件的ngOnChanges也會被調用。

組件在路由地址變化從而被銷毀的時候會調ngOnDestory()。

在ngOnDestory中銷毀一些引用的資源,比如反訂閱一個流,清除定時器之類的。

 

本文作者starof,因知識本身在變化,作者也在不斷學習成長,文章內容也不定時更新,為避免誤導讀者,方便追根溯源,請諸位轉載註明出處:http://www.cnblogs.com/starof/p/8705587.html  有問題歡迎與我討論,共同進步。 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 原因:mysql服務名錯誤。 正確做法:net start +mysql服務名 ...
  • Spark http://spark.apache.org/ http://spark.apache.org/docs/latest/ http://spark.apache.org/docs/2.2.0/quick-start.html http://spark.apache.org/docs/2 ...
  • 在我們使用MySQL資料庫時,字元亂碼,對我們來說是一個很頭疼的問題。今天筆者就來教大家如何徹底解決更改預設字元集以及字元亂碼問題。 當我們使用壓縮包進行MySQL安裝後,系統會使用預設的字元集,這時就會產生亂碼。 方案: 來到MySQL安裝路徑下,創建一個my.ini文件(如果有my-defaul ...
  • 1.1 SQL概述 1.1.1 SQL語句介紹 結構化查詢語言(Structured Query Language)簡稱SQL,是關係型資料庫管理系統都需要遵循的規範。不同的資料庫生產廠商都支持SQL語句,但都有特有內容。 1.1.2 SQL語句分類 SQL分類: 數據定義語言:簡稱DDL(Data ...
  • 在升級一個SQL Server 2000的資料庫時,遇到了一致性錯誤,其中有幾個錯誤是元數據損壞(metadata corruption),特意研究了一下這個案例,因為以前也零零散散的遇到過一些一致性相關錯誤,但是難得遇到元數據損壞的案例。 如下所示,資料庫從SQL Server 2000還原到SQ... ...
  • 在實現一個問題的時候,同樣的結果我寫了兩個sql。 sql1 sql2 在效率問題上詢問了前輩,得到的建議是使用第二個,因為分組跟子查詢都會影響效率,相比之下分組好一點。 另外產生的一個問題是,如果使用.net並使用c#語言實現sql的話,第一個sql是無法(在我的能力範圍內)使用拉姆達查詢對象的, ...
  • 資料庫的三大特性可謂是:實體屬性和關係。 實體:表; 屬性:表中的數據(欄位); 關係:表與表之間的關係。 資料庫設計三大範式(重點): 第一範式(1NF):數據表中的每一列(每個欄位)必須是不可拆分的最小單元,也就是確保每一列的原子性; 第二範式(2NF):滿足1NF後,要求表中的所有列,都必須依 ...
  • 一、用Log列印日誌 二、Toast用法 三、在活動中使用Menu 首先在res目錄下新建menu文件夾,接著在這個文件夾下新建一個名叫main的菜單文件,在main.xml中添加如下代碼 回到Activity中重寫onCreateOptionsMenu()方法,編寫如下代碼(返回true表示允許創 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...