React Native 中組件的生命周期

概述

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

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

第一階段:是組件第一次繪制階段,如圖中的上面虛線框內(nèi)妒潭,在這里完成了組件的加載和初始化悴能;

第二階段:是組件在運行和交互階段,如圖中左下角虛線框雳灾,這個階段組件可以處理用戶交互漠酿,或者接收事件更新界面;

第三階段:是組件卸載消亡的階段谎亩,如圖中右下角的虛線框中炒嘲,這里做一些組件的清理工作。

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

下面來詳細介紹生命周期中的各回調(diào)函數(shù)匈庭。

getDefaultProps

在組件創(chuàng)建之前夫凸,會先調(diào)用getDefaultProps(),這是全局調(diào)用一次阱持,嚴格地來說夭拌,這不是組件的生命周期的一部分。在組件被創(chuàng)建并加載候衷咽,首先調(diào)用getInitialState()鸽扁,來初始化組件的狀態(tài)。

componentWillMount

然后镶骗,準備加載組件献烦,會調(diào)用componentWillMount(),其原型如下:

void componentWillMount()

這個函數(shù)調(diào)用時機是在組件創(chuàng)建卖词,并初始化了狀態(tài)之后巩那,在第一次繪制render()之前〈蓑冢可以在這里做一些業(yè)務(wù)初始化操作即横,也可以設(shè)置組件狀態(tài)。這個函數(shù)在整個生命周期中只被調(diào)用一次裆赵。

componentDidMount

在組件第一次繪制之后东囚,會調(diào)用componentDidMount(),通知組件已經(jīng)加載完成战授。函數(shù)原型如下:

void componentDidMount()

這個函數(shù)調(diào)用的時候页藻,其虛擬 DOM 已經(jīng)構(gòu)建完成桨嫁,你可以在這個函數(shù)開始獲取其中的元素或者子組件了。需要注意的是份帐,RN 框架是先調(diào)用子組件的componentDidMount()璃吧,然后調(diào)用父組件的函數(shù)。從這個函數(shù)開始废境,就可以和 JS 其他框架交互了畜挨,例如設(shè)置計時setTimeout或者setInterval,或者發(fā)起網(wǎng)絡(luò)請求噩凹。這個函數(shù)也是只被調(diào)用一次巴元。這個函數(shù)之后,就進入了穩(wěn)定運行狀態(tài)驮宴,等待事件觸發(fā)逮刨。

componentWillReceiveProps

如果組件收到新的屬性(props),就會調(diào)用componentWillReceiveProps()堵泽,其原型如下:

void componentWillReceiveProps(

object nextProps

)

輸入?yún)?shù)nextProps是即將被設(shè)置的屬性修己,舊的屬性還是可以通過this.props來獲取。在這個回調(diào)函數(shù)里面落恼,你可以根據(jù)屬性的變化箩退,通過調(diào)用this.setState()來更新你的組件狀態(tài),這里調(diào)用更新狀態(tài)是安全的佳谦,并不會觸發(fā)額外的render()調(diào)用戴涝。如下:

componentWillReceiveProps: function(nextProps) {

this.setState({

likesIncreasing: nextProps.likeCount > this.props.likeCount

});

}

shouldComponentUpdate

當組件接收到新的屬性和狀態(tài)改變的話,都會觸發(fā)調(diào)用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 是否需要更新,能有效提高應(yīng)用性能。

componentWillUpdate

如果組件狀態(tài)或者屬性改變躬存,并且上面的shouldComponentUpdate(...)返回為true张惹,就會開始準更新組件设捐,并調(diào)用componentWillUpdate()仔引,其函數(shù)原型如下:

void componentWillUpdate(

object nextProps, object nextState

)

輸入?yún)?shù)與shouldComponentUpdate一樣窄俏,在這個回調(diào)中柠衅,可以做一些在更新界面之前要做的事情。需要特別注意的是瞒津,在這個函數(shù)里面,你就不能使用this.setState來修改狀態(tài)。這個函數(shù)調(diào)用之后彪腔,就會把nextProps和nextState分別設(shè)置到this.props和this.state中。緊接著這個函數(shù)进栽,就會調(diào)用render()來更新界面了德挣。

componentDidUpdate

調(diào)用了render()更新完成界面之后,會調(diào)用componentDidUpdate()來得到通知快毛,其函數(shù)原型如下:

void componentDidUpdate(

object prevProps, object prevState

)

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

componentWillUnmount

當組件要被從界面上移除的時候唠帝,就會調(diào)用componentWillUnmount()屯掖,其函數(shù)原型如下:

void componentWillUnmount()

在這個函數(shù)中,可以做一些組件相關(guān)的清理工作襟衰,例如取消計時器贴铜、網(wǎng)絡(luò)請求等。

總結(jié)

到這里瀑晒,RN 的組件的完整的生命都介紹完了绍坝,在回頭來看一下前面的圖,就比較清晰了苔悦,把生命周期的回調(diào)函數(shù)總結(jié)成如下表格:

生命周期調(diào)用次數(shù)能否使用 setSate()

getDefaultProps1(全局調(diào)用一次)否

getInitialState1否

componentWillMount1是

render>=1否

componentDidMount1是

componentWillReceiveProps>=0是

shouldComponentUpdate>=0否

componentWillUpdate>=0否

componentDidUpdate>=0否

componentWillUnmount1否

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末轩褐,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子玖详,更是在濱河造成了極大的恐慌把介,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蟋座,死亡現(xiàn)場離奇詭異拗踢,居然都是意外死亡,警方通過查閱死者的電腦和手機蜈七,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進店門秒拔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事砂缩∽餮瑁” “怎么了?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵庵芭,是天一觀的道長妹懒。 經(jīng)常有香客問我,道長双吆,這世上最難降的妖魔是什么眨唬? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮好乐,結(jié)果婚禮上匾竿,老公的妹妹穿的比我還像新娘。我一直安慰自己蔚万,他們只是感情好岭妖,可當我...
    茶點故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著反璃,像睡著了一般昵慌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上淮蜈,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天斋攀,我揣著相機與錄音,去河邊找鬼梧田。 笑死淳蔼,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的柿扣。 我是一名探鬼主播肖方,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼未状!你這毒婦竟也來了俯画?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤司草,失蹤者是張志新(化名)和其女友劉穎艰垂,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體埋虹,經(jīng)...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡猜憎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了搔课。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片胰柑。...
    茶點故事閱讀 39,769評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出柬讨,到底是詐尸還是另有隱情崩瓤,我是刑警寧澤,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布踩官,位于F島的核電站却桶,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蔗牡。R本人自食惡果不足惜颖系,卻給世界環(huán)境...
    茶點故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望辩越。 院中可真熱鬧嘁扼,春花似錦、人聲如沸区匣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽亏钩。三九已至,卻和暖如春欺旧,著一層夾襖步出監(jiān)牢的瞬間姑丑,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工辞友, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留栅哀,地道東北人。 一個月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓称龙,卻偏偏與公主長得像留拾,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子鲫尊,可洞房花燭夜當晚...
    茶點故事閱讀 44,678評論 2 354

推薦閱讀更多精彩內(nèi)容