React Native 中組件的生命周期

概述

就像 Android 開發(fā)中的 View 一樣,React Native(RN) 中的組件也有生命周期(Lifecycle)。所謂生命周期辑甜,就是一個對象從開始生成到最后消亡所經(jīng)歷的狀態(tài),理解生命周期练俐,是合理開發(fā)的關鍵袖迎。RN 組件的生命周期整理如下圖:

3-3-component-lifecycle.jpg

如圖冕臭,可以把組件生命周期大致分為三個階段:

  • 第一階段:是組件第一次繪制階段,如圖中的上面虛線框內燕锥,在這里完成了組件的加載和初始化辜贵;
  • 第二階段:是組件在運行和交互階段,如圖中左下角虛線框归形,這個階段組件可以處理用戶交互托慨,或者接收事件更新界面;
  • 第三階段:是組件卸載消亡的階段暇榴,如圖中右下角的虛線框中厚棵,這里做一些組件的清理工作。

生命周期回調函數(shù)

下面來詳細介紹生命周期中的各回調函數(shù)蔼紧。

getDefaultProps

在組件創(chuàng)建之前婆硬,會先調用 getDefaultProps()
,這是全局調用一次奸例,嚴格地來說彬犯,這不是組件的生命周期的一部分。在組件被創(chuàng)建并加載候查吊,首先調用 getInitialState()
谐区,來初始化組件的狀態(tài)。

componentWillMount

然后逻卖,準備加載組件宋列,會調用 * componentWillMount()*
,其原型如下:

void componentWillMount()

這個函數(shù)調用時機是在組件創(chuàng)建评也,并初始化了狀態(tài)之后炼杖,在第一次繪制 render()
之前〕鸩危可以在這里做一些業(yè)務初始化操作嘹叫,也可以設置組件狀態(tài)。這個函數(shù)在整個生命周期中只被調用一次诈乒。

componentDidMount

在組件第一次繪制之后罩扇,會調用 * componentDidMount() *
,通知組件已經(jīng)加載完成。函數(shù)原型如下:

void componentDidMount()

這個函數(shù)調用的時候喂饥,其虛擬 DOM 已經(jīng)構建完成消约,你可以在這個函數(shù)開始獲取其中的元素或者子組件了。需要注意的是员帮,RN 框架是先調用子組件的 * componentDidMount()*或粮,然后調用父組件的函數(shù)。從這個函數(shù)開始捞高,就可以和 JS 其他框架交互了氯材,例如設置計時 setTimeout 或者 setInterval,或者發(fā)起網(wǎng)絡請求硝岗。這個函數(shù)也是只被調用一次氢哮。這個函數(shù)之后,就進入了穩(wěn)定運行狀態(tài)型檀,等待事件觸發(fā)冗尤。

componentWillReceiveProps

如果組件收到新的屬性(props),就會調用 componentWillReceiveProps()
胀溺,其原型如下:

void componentWillReceiveProps( object nextProps)

輸入?yún)?shù) nextProps
是即將被設置的屬性裂七,舊的屬性還是可以通過 this.props
來獲取。在這個回調函數(shù)里面仓坞,你可以根據(jù)屬性的變化背零,通過調用 this.setState()
來更新你的組件狀態(tài),這里調用更新狀態(tài)是安全的扯躺,并不會觸發(fā)額外的 render()
調用捉兴。如下:

componentWillReceiveProps: function(nextProps) {
   this.setState({ 
        likesIncreasing: nextProps.likeCount > this.props.likeCount 
    });
}

shouldComponentUpdate

當組件接收到新的屬性和狀態(tài)改變的話,都會觸發(fā)調用 shouldComponentUpdate(...)
录语,函數(shù)原型如下:

boolean shouldComponentUpdate( object nextProps, object nextState)

輸入?yún)?shù) nextProps和上面的 componentWillReceiveProps函數(shù)一樣倍啥,nextState表示組件即將更新的狀態(tài)值。這個函數(shù)的返回值決定是否需要更新組件澎埠,如果* true* 表示需要更新虽缕,繼續(xù)走后面的更新流程。否則蒲稳,則不更新氮趋,直接進入等待狀態(tài)。
默認情況下江耀,這個函數(shù)永遠返回 true
用來保證數(shù)據(jù)變化的時候 UI 能夠同步更新剩胁。在大型項目中,你可以自己重載這個函數(shù)祥国,通過檢查變化前后屬性和狀態(tài)昵观,來決定 UI 是否需要更新晾腔,能有效提高應用性能。

componentWillUpdate

如果組件狀態(tài)或者屬性改變啊犬,并且上面的 shouldComponentUpdate(...)返回為 true灼擂,就會開始準更新組件,并調用 componentWillUpdate()觉至,其函數(shù)原型如下:

void componentWillUpdate( object nextProps, object nextState)

輸入?yún)?shù)與 * shouldComponentUpdate*
一樣剔应,在這個回調中,可以做一些在更新界面之前要做的事情语御。需要特別注意的是峻贮,在這個函數(shù)里面,你就不能使用 this.setState 來修改狀態(tài)沃暗。這個函數(shù)調用之后月洛,就會把 nextPropsnextState 分別設置到 this.propsthis.state 中何恶。緊接著這個函數(shù)孽锥,就會調用 render() 來更新界面了。

componentDidUpdate

調用了 render()
更新完成界面之后细层,會調用 componentDidUpdate()
來得到通知惜辑,其函數(shù)原型如下:

void componentDidUpdate( object prevProps, object prevState)

因為到這里已經(jīng)完成了屬性和狀態(tài)的更新了,此函數(shù)的輸入?yún)?shù)變成了 prevProps
和 prevState
疫赎。

componentWillUnmount

當組件要被從界面上移除的時候盛撑,就會調用 * componentWillUnmount()*
,其函數(shù)原型如下:

void componentWillUnmount()

在這個函數(shù)中捧搞,可以做一些組件相關的清理工作抵卫,例如取消計時器、網(wǎng)絡請求等胎撇。
總結
到這里介粘,RN 的組件的完整的生命都介紹完了,在回頭來看一下前面的圖晚树,就比較清晰了

生命周期 調用次數(shù) 能否使用 setSate()
getDefaultProps 1(全局調用一次)
getInitialState 1
componentWillMount 1
render >=1
componentDidMount 1
componentWillReceiveProps >=0
shouldComponentUpdate >=0
componentWillUpdate >=0
componentDidUpdate >=0
componentWillUnmount 1

轉自http://www.race604.com/react-native-component-lifecycle/

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末姻采,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子爵憎,更是在濱河造成了極大的恐慌慨亲,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,946評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宝鼓,死亡現(xiàn)場離奇詭異刑棵,居然都是意外死亡,警方通過查閱死者的電腦和手機愚铡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,336評論 3 399
  • 文/潘曉璐 我一進店門蛉签,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事正蛙《焦” “怎么了?”我有些...
    開封第一講書人閱讀 169,716評論 0 364
  • 文/不壞的土叔 我叫張陵乒验,是天一觀的道長愚隧。 經(jīng)常有香客問我,道長锻全,這世上最難降的妖魔是什么狂塘? 我笑而不...
    開封第一講書人閱讀 60,222評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮鳄厌,結果婚禮上荞胡,老公的妹妹穿的比我還像新娘。我一直安慰自己了嚎,他們只是感情好泪漂,可當我...
    茶點故事閱讀 69,223評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著歪泳,像睡著了一般萝勤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上呐伞,一...
    開封第一講書人閱讀 52,807評論 1 314
  • 那天敌卓,我揣著相機與錄音,去河邊找鬼伶氢。 笑死趟径,一個胖子當著我的面吹牛,可吹牛的內容都是我干的癣防。 我是一名探鬼主播蜗巧,決...
    沈念sama閱讀 41,235評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼劣砍!你這毒婦竟也來了惧蛹?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 40,189評論 0 277
  • 序言:老撾萬榮一對情侶失蹤刑枝,失蹤者是張志新(化名)和其女友劉穎香嗓,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體装畅,經(jīng)...
    沈念sama閱讀 46,712評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡靠娱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,775評論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了掠兄。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片像云。...
    茶點故事閱讀 40,926評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡锌雀,死狀恐怖,靈堂內的尸體忽然破棺而出迅诬,到底是詐尸還是另有隱情腋逆,我是刑警寧澤,帶...
    沈念sama閱讀 36,580評論 5 351
  • 正文 年R本政府宣布侈贷,位于F島的核電站惩歉,受9級特大地震影響,放射性物質發(fā)生泄漏俏蛮。R本人自食惡果不足惜撑蚌,卻給世界環(huán)境...
    茶點故事閱讀 42,259評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望搏屑。 院中可真熱鬧争涌,春花似錦、人聲如沸辣恋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,750評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽抑党。三九已至包警,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間底靠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,867評論 1 274
  • 我被黑心中介騙來泰國打工特铝, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留暑中,地道東北人。 一個月前我還...
    沈念sama閱讀 49,368評論 3 379
  • 正文 我出身青樓鲫剿,卻偏偏與公主長得像鳄逾,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子灵莲,可洞房花燭夜當晚...
    茶點故事閱讀 45,930評論 2 361

推薦閱讀更多精彩內容