React Native組件生命週期

來源:互聯網
上載者:User

標籤:.text   set   app   分析   word   view   log   網路   int   

概述

所謂生命週期,就是一個對象從開始產生到最後消亡所經曆的狀態,理解空間的生命週期,是開發中必須掌握的一個知識點。就像 Android 開發中組件 一樣,React Native的組件也有生命週期(Lifecycle)。
React Native組件的生命週期大致上可以劃分為執行個體化階段、存在階段和銷毀階段。我們只有在理解組件生命週期的基礎上,才能開發出高效能的app。
React Native中組件的生命週期大致可以用以表示:

  • 第一階段:是組件第一次繪製階段,中的上面虛線框內,在這裡完成了組件的載入和初始化;
  • 第二階段:是組件在運行和互動階段,中左下角虛線框,這個階段組件可以處理使用者互動,或者接收事件更新介面;
  • 第三階段:是組件卸載消亡的階段,中右下角的虛線框中,這裡做一些組件的清理工作。
生命週期分析執行個體化階段分析

getDefaultProps
該函數用於初始化一些預設的屬性,通常會將固定的內容放在這個函數 中進行初始化和賦值;
在組件建立之前,會先調用 getDefaultProps()初始化一些屬性,由於組件初始化後,再次使用該組件不會調用getDefaultProps(),所以組件自己不可以自己修改props。
getInitialState
該函數是用於對組件的一些狀態進行初始化;
該函數不同於getDefaultProps,在以後的過程中,可以再次調用。
比如:

this.setState({    activePage: activePage,     currentX: contentOffSetX  });

註:一旦調用了this.setState方法,組件一定會調用render方法,對組件進行再次的渲染,不過,如果React架構會自動根據DOM的狀態來判斷是否需要真正的渲染。
componentWillMount
這個函數調用時機是在組件建立,並初始化了狀態之後,在第一次繪製 render() 之前。這個函數在整個生命週期中只被調用一次。
render是一個組件中必須有的方法,本質上是一個函數,並返回JSX或其他組件來構成DOM,和Android的XML布局類似。作用是通知系統準備載入組件。
componentDidMount
該方法是在調用了render方法後,通知群組件已經載入完成。一般會在這個函數中處理網路請求等載入資料的操作;

存在期階段分析

componentWillReceiveProps
如果組件收到新的屬性(props),就會調用 componentWillReceiveProps()對組件的props或state進行了修改。
舊的屬性還是可以通過 this.props 來擷取,通過調用 this.setState() 來更新你的組件狀態,這裡調用更新狀態是安全的,並不會觸發額外的 render() 調用。
shouldComponentUpdate
當組件接收到新的屬性和狀態改變的話,都會觸發調用 shouldComponentUpdate(…),通過返回false或true來控制是否進行介面的渲染。如果 true 表示需要更新,繼續走後面的更新流程。否者,則不更新,直接進入等待狀態。

componentWillUpdate
如果組件狀態或者屬性改變,並且上面的 shouldComponentUpdate() 返回為 true,就會開始准更新群組件,並調用 componentWillUpdate(),組件重新整理前調用,有點類似於componentWillMount()。
componentDidUpdate
調用了 render() 更新完成介面之後,會調用 componentDidUpdate() 來得到通知,其函數原型如下:

void componentDidUpdate(    object prevProps, object prevState)
銷毀期階段分析

componentWillUnmount
當組件要被從介面上移除的時候,就會調用 componentWillUnmount(),該函數可以做一些組件相關的清理工作,例如取消計時器、網路請求等。

總結
生命週期 調用次數 能否使用 setSate()
getDefaultProps 全域調用1次
getInitialState 1
componentWillMount 1
render >=1
componentDidMount 1
componentWillReceiveProps >=0
shouldComponentUpdate >=0
componentWillUpdate >=0
componentDidUpdate >=0
componentWillUnmount 1
補充什麼是DOM Diff演算法

Web介面由DOM樹來構成,當其中某一部分發生變化時,其實就是對應的某個DOM節點發生了變化。在React中,構建UI介面的思路是由目前狀態決定介面。前後兩個狀態就對應兩套介面,然後由React來比較兩個介面的區別,’這就需要對DOM樹進行Diff演算法分析。
即給定任意兩棵樹,找到最少的轉換步驟。但是標準的的Diff演算法複雜度需要O(n^3),這顯然無法滿足效能要求。要達到每次介面都可以整體重新整理介面的目的,勢必需要對演算法進行最佳化。這看上去非常有難度,然而Facebook工程師卻做到了,他們結合Web介面的特點做出了兩個簡單的假設,使得Diff演算法複雜度直接降低到O(n)兩個相同組件產生類似的DOM結構,不同的組件產生不同的DOM結構;對於同一層次的一組子節點,它們可以通過唯一的id進行區分。

React Native組件生命週期

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.