標籤:哪些 init update 鉤子函數 沒有 tde 更新 nbsp 手動
- 什麼是聲明周期?
組件本質上就是狀態機器,輸入確定,輸出一定確定。如何理解這一點?react有兩個特點,第一個就是去除了所有的手動dom操作,也就是使用jsx。第二個就是組件把狀態和結果一一對應起來,從而能夠直觀的看出來,程式在不同的狀態是的輸出。屬性是由父組件傳遞給子組件的,狀態是子組件內部維護的一些資料,當狀態發生變化時候,組件也會進行更新,因此我們可以理解成一個state對應一個render的結果,這樣我們就可以知道在不同的state下,組件會render出什麼樣的結果,從而就知道組件在頁面上展示的內容是什麼。狀態機器本質上就是狀態和轉移的結合,我們剛才說過,不同的狀態對應不同的輸出,狀態和狀態之間有時候會發生轉換,當狀態發生轉變的時候,會觸發不同的鉤子函數,從而讓開發人員有機會做出相應,因為狀態轉換是由react來進行維護的。作為開發人員沒有 辦法直接的參與到狀態轉換中,但是react給我們提供了很多鉤子函數,我們可以自己來編寫這些鉤子函數,這樣react在進行狀態轉換的時候,就可以調用我們的狀態函數。
我們也可以用事件的思路來理解狀態,開發人員不知道什麼時候會發生事件,但是我們可以決定在發生事件的時候,執行什麼動作,也就是事件的監聽器,狀態和事件有一些類似,他們的區別是事件和事件之間沒有直接的關係,每個事件都是獨立發生的,但是狀態和狀態之間是有關係的,組件可以處於不同的狀態中,那麼組件所有的狀態組合起來,就構成了組件的聲明周期。
- 組件的生命週期有哪些部分?
初始化階段:用我們編寫的組件代碼來產生組件的執行個體,組件代碼就是我們寫的class,就像物件導向中的類一樣,class是不會真正的被使用的,我們真正使用的是class初始化出來的執行個體。舉個例子,假設我們有一個HelloWorld組件,那麼我們在頁面的兩個地方使用了HelloWorld,這兩個地方渲染出來的是兩個執行個體,執行個體和執行個體之間是不同的,但是他們都來自同一個組件,也就是他們是使用同一個組件初始化出來的,在初始化階段,組件會進行一些初始的狀態設定,以及渲染,也就是render,在初始化完成之後,執行個體就會真正的顯示在頁面上,以被使用者使用。
初始化結束以後,就進入了運行中,對於執行個體來說,絕大部分時間都處於運行中,運行中執行個體的狀態可能發生改變,從而觸發一系列的鉤子函數,最終這些改變可能導致組件被重新渲染,注意這裡我們說的是可能導致,有一些改變可能並不會導致組件被重新渲染,只是內部的狀態發生了變動
- 最後就是銷毀階段。不使用組件的時候,就會被銷毀
這三者發生的時間是不固定的,需要根據頁面來進行判斷,這三個階段只是在邏輯上對組件進行了分類,實際上我們在編寫代碼的時候,關注的是鉤子函數以及他們的用法。
- 不同的聲明周期可以自訂的函數
初始化階段:
getDefaultProps:擷取執行個體的預設屬性,這個只會在組件的第一個被初始化的時候被調用,也就是說從第二個組件開始,只會調用其他的。同一個組件所有的實 例,他們拿到的預設屬性都是一樣的。
getInitialState:擷取執行個體的初始化狀態
componentWillMount:組件即將被裝載,也就是組件即將被渲染到頁面上。注意在這個階段,組件還沒有真正的被渲染
render:組價在render函數中產生虛擬dom節點,也就是jsx,最後由react把虛擬dom節點渲染稱為真正的dom節點,並放到頁面中,讓使用者可以看到, 並且進行互動
componentDidMount:這個函數和第三個函數的區別will變成到了did也就是說他是在組件被裝載之後調用的,這個函數被調用的時候,組件已經被渲染到了 頁面中
運行中:
componentWillReceiveProps:組件將要接收到屬性的時候調用,如果組件的屬性發生變化,比如說父組件改變了組件的屬性,那麼組件就需要進行更新,準確的說是組件可能要進行更新,這個函數是在接收到屬性之前觸發的,屬性在被傳送給組件之前,開發人員有機會去處理這樣的屬性,比如說修改屬性,更新一些內部的狀態等等,這裡屬性還是沒有被傳送個組件,
shouldComponentUpdate:當組件接收到新屬性或者新狀態的時候,就會觸發這個函數,從名字上來看,這個函數是一個疑問句,他說的是組件是否要更新,顯然我們可以告訴他組件不需要更新。既然react會協助我們判斷組件是否要更新,那麼我們為什麼還要去手動進行判斷呢?因為有的時候狀態或者屬性的變化,並不會導致組件發生更新,如果組件不需要更新我們可以直接在這步直接返回false,這樣的話,react就不會直接調用render函數,從而可以提高效能,如果我們不進行這樣的操作,那麼即使render返回的結果一樣,react也需要經過render以及diff演算法來判斷組件是否需要更新,如果我們在這步直接返回false,那麼react就不要在進行這兩步操作,從而可以提高效能,
componentWillUpdate:他會在render觸發之前調用這時候我們是已經處於運行中,需要的是更新操作,而不是裝載操作。
render:和我們初始化的render是一樣的。
componentDidUpdate:會在render結束之後,真正的dom被建立完畢後被調用。
銷毀階段:componentWillUnmount:這個函數會在銷毀真正被執行之前被調用,給開發人員一些真正的機會來進行一些清理的操作。
react的生命週期