react的生命週期

來源:互聯網
上載者:User

標籤:哪些   init   update   鉤子函數   沒有   tde   更新   nbsp   手動   

    1. 什麼是聲明周期?
      組件本質上就是狀態機器,輸入確定,輸出一定確定。如何理解這一點?react有兩個特點,第一個就是去除了所有的手動dom操作,也就是使用jsx。第二個就是組件把狀態和結果一一對應起來,從而能夠直觀的看出來,程式在不同的狀態是的輸出。屬性是由父組件傳遞給子組件的,狀態是子組件內部維護的一些資料,當狀態發生變化時候,組件也會進行更新,因此我們可以理解成一個state對應一個render的結果,這樣我們就可以知道在不同的state下,組件會render出什麼樣的結果,從而就知道組件在頁面上展示的內容是什麼。狀態機器本質上就是狀態和轉移的結合,我們剛才說過,不同的狀態對應不同的輸出,狀態和狀態之間有時候會發生轉換,當狀態發生轉變的時候,會觸發不同的鉤子函數,從而讓開發人員有機會做出相應,因為狀態轉換是由react來進行維護的。作為開發人員沒有 辦法直接的參與到狀態轉換中,但是react給我們提供了很多鉤子函數,我們可以自己來編寫這些鉤子函數,這樣react在進行狀態轉換的時候,就可以調用我們的狀態函數。

      我們也可以用事件的思路來理解狀態,開發人員不知道什麼時候會發生事件,但是我們可以決定在發生事件的時候,執行什麼動作,也就是事件的監聽器,狀態和事件有一些類似,他們的區別是事件和事件之間沒有直接的關係,每個事件都是獨立發生的,但是狀態和狀態之間是有關係的,組件可以處於不同的狀態中,那麼組件所有的狀態組合起來,就構成了組件的聲明周期。


    2. 組件的生命週期有哪些部分?
      初始化階段:用我們編寫的組件代碼來產生組件的執行個體,組件代碼就是我們寫的class,就像物件導向中的類一樣,class是不會真正的被使用的,我們真正使用的是class初始化出來的執行個體。舉個例子,假設我們有一個HelloWorld組件,那麼我們在頁面的兩個地方使用了HelloWorld,這兩個地方渲染出來的是兩個執行個體,執行個體和執行個體之間是不同的,但是他們都來自同一個組件,也就是他們是使用同一個組件初始化出來的,在初始化階段,組件會進行一些初始的狀態設定,以及渲染,也就是render,在初始化完成之後,執行個體就會真正的顯示在頁面上,以被使用者使用。

      初始化結束以後,就進入了運行中,對於執行個體來說,絕大部分時間都處於運行中,運行中執行個體的狀態可能發生改變,從而觸發一系列的鉤子函數,最終這些改變可能導致組件被重新渲染,注意這裡我們說的是可能導致,有一些改變可能並不會導致組件被重新渲染,只是內部的狀態發生了變動


    3. 最後就是銷毀階段。不使用組件的時候,就會被銷毀


      這三者發生的時間是不固定的,需要根據頁面來進行判斷,這三個階段只是在邏輯上對組件進行了分類,實際上我們在編寫代碼的時候,關注的是鉤子函數以及他們的用法。

    4. 不同的聲明周期可以自訂的函數
      初始化階段:
                     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的生命週期

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.