React生命周期及事件詳解

概述

生命周期拾酝,就是一個對象從開始生成到最后消亡所經(jīng)歷的狀態(tài)组去,理解生命周期爷抓,是合理開發(fā)的關(guān)鍵势决。RN 組件的生命周期整理如下圖:

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

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

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

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

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

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

getDefaultProps

在組件創(chuàng)建之前兵琳,會先調(diào)用getDefaultProps(),這是全局調(diào)用一次骇径,嚴(yán)格地來說躯肌,這不是組件的生命周期的一部分。在組件被創(chuàng)建并加載候破衔,首先調(diào)用getInitialState()清女,來初始化組件的狀態(tài)。

componentWillMount

然后晰筛,準(zhǔn)備加載組件嫡丙,會調(diào)用componentWillMount(),其原型如下:

void componentWillMount()

這個函數(shù)調(diào)用時機(jī)是在組件創(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ù)之后,就進(jìn)入了穩(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

當(dāng)組件接收到新的屬性和狀態(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ù)走后面的更新流程。否者霎箍,則不更新,直接進(jìn)入等待狀態(tài)澡为。

默認(rèn)情況下漂坏,這個函數(shù)永遠(yuǎn)返回true用來保證數(shù)據(jù)變化的時候 UI 能夠同步更新。在大型項目中媒至,你可以自己重載這個函數(shù)顶别,通過檢查變化前后屬性和狀態(tài),來決定 UI 是否需要更新拒啰,能有效提高應(yīng)用性能驯绎。

componentWillUpdate

如果組件狀態(tài)或者屬性改變,并且上面的shouldComponentUpdate(...)返回為true谋旦,就會開始準(zhǔn)更新組件剩失,并調(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

當(dāng)組件要被從界面上移除的時候旁蔼,就會調(diào)用componentWillUnmount(),其函數(shù)原型如下:

void componentWillUnmount()

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

總結(jié)

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

轉(zhuǎn)載至:https://race604.com/react-native-component-lifecycle/?utm_source=tuicool&utm_medium=referral

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市理疙,隨后出現(xiàn)的幾起案子晕城,更是在濱河造成了極大的恐慌,老刑警劉巖窖贤,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件砖顷,死亡現(xiàn)場離奇詭異,居然都是意外死亡赃梧,警方通過查閱死者的電腦和手機(jī)滤蝠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來授嘀,“玉大人物咳,你說我怎么就攤上這事√阒澹” “怎么了览闰?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長巷折。 經(jīng)常有香客問我焕济,道長,這世上最難降的妖魔是什么盔几? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任晴弃,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘上鞠。我一直安慰自己际邻,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布芍阎。 她就那樣靜靜地躺著世曾,像睡著了一般。 火紅的嫁衣襯著肌膚如雪谴咸。 梳的紋絲不亂的頭發(fā)上轮听,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天,我揣著相機(jī)與錄音岭佳,去河邊找鬼血巍。 笑死,一個胖子當(dāng)著我的面吹牛珊随,可吹牛的內(nèi)容都是我干的述寡。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼叶洞,長吁一口氣:“原來是場噩夢啊……” “哼鲫凶!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起衩辟,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤螟炫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后艺晴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體昼钻,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年财饥,在試婚紗的時候發(fā)現(xiàn)自己被綠了换吧。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片折晦。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡钥星,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出满着,到底是詐尸還是另有隱情谦炒,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布风喇,位于F島的核電站宁改,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏魂莫。R本人自食惡果不足惜还蹲,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧谜喊,春花似錦潭兽、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至诵次,卻和暖如春账蓉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背逾一。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工铸本, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人嬉荆。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓归敬,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鄙早。 傳聞我的和親對象是個殘疾皇子汪茧,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,490評論 2 348

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