React-Native從入門到深入--組件生命周期

一、前言

React的用戶頁面的構建只要思想是通過構建可復用的組件來實現(xiàn)。那么什么叫組件吨瞎?

所謂的組件就是有限狀態(tài)機,通過狀態(tài)渲染對應的界面了穆咐,和iOS一樣颤诀,React的每個組件也有對應的生命周期,它規(guī)定了組件的狀態(tài)和方法需要在什么階段進行改變和執(zhí)行对湃。

當調用React.createClass()創(chuàng)建一個組件類時,你應該提供一個包含有render方法以及可選的其他生命周期方法的 規(guī)范(Specifications)對象崖叫。

1.1什么是有限狀態(tài)機?

有限狀態(tài)機拍柒,表示有限個狀態(tài)以及在這些狀態(tài)之間的轉移和動作等行為的模型心傀。

狀態(tài)機,能夠記住目前所處的狀態(tài)拆讯,根據(jù)當前的狀態(tài)可以做出相應的決策脂男,并且在進入不同的狀態(tài)時,可以做不同的操作种呐。就像特別簡單的一個例子:一個人的所處的狀態(tài)宰翅,決定了不同的操作,如果一個人進入餓的狀態(tài)陕贮,那么接下來他要進行的操作就是喝水堕油。

React 正是利用這一概念,通過管理狀態(tài)來實現(xiàn)對組件的管理肮之。

例如:某個組件有顯示和隱藏兩個狀態(tài)掉缺,通常會設計兩個方法show()和hide()來實現(xiàn)切換;而 React 只需要設置狀態(tài)setState({ showed: true/false })即可實現(xiàn)戈擒。

二眶明。React生命周期

簡單當首次裝載組件時,按順序執(zhí)行 getDefaultProps筐高、getInitialState搜囱、componentWillMount丑瞧、render 和 componentDidMount;的說組件分為三種狀態(tài):掛載 更新 和卸載蜀肘。

根據(jù)不同的狀態(tài)詳細分為:

??裝載組件绊汹、 卸載組件、重新裝載組件扮宠、再次渲染組件時西乖,組件接受到更新狀態(tài)。





三坛增。為什么會是如此的執(zhí)行順序呢获雕?

自定義組件的生命周期主要主要通過三種狀態(tài)來進行管理:掛載 更新 和卸載。三種狀態(tài)對應三種方法:mountComponent收捣、updateComponent届案、unmountComponent。

3.1掛載

createClass 創(chuàng)建自定義組件的入口方法罢艾,負責管理生命周期中的 getDefaultProps楣颠。getDefaultProps 方法只執(zhí)行一次,這樣所有實例初始化的 props 將會被共享昆婿。

getDefaultProps

該函數(shù)用于初始化一些默認的屬性球碉,通常會將固定的內(nèi)容放在這個函數(shù)中,進行初始化和賦值仓蛆。在組件中睁冬,可以利用this.props獲取在這里初始化它的屬性,由于組件初始化后看疙,再次使用該組件不會調用getDefaultProps函數(shù)豆拨,所以組件自己不可以自己修改props。

mountComponent 負責管理生命周期中的getInitialState能庆、componentWillMount施禾、render 和 componentDidMount


getInitialState

該函數(shù)是用于對組件的一些狀態(tài)進行初始化搁胆;

由于該函數(shù)不同于getDefaultProps弥搞,在以后的過程中,會再次調用渠旁,所以可以將控制控件的狀態(tài)的一些變量放在這里初始化攀例,如控件上顯示的文字,可以通過this.state來獲取值顾腊,通過this.setState來修改state值粤铭, 比如:

this.setState({

activePage: activePage,

currentX: contentOffSetX

});

componentWillMount

相當于OC中的ViewWillAppear方法,在組件將要被加載在視圖上之前調用杂靶,功能相對較少梆惯。

render

render是一個組件中必須有的方法酱鸭,本質上是一個函數(shù),并返回JSX或其他組件來構成DOM垛吗,和Android的XML布局類似凹髓,注意:只能返回一個頂級元素;

此外,在render函數(shù)中怯屉,只可通過this.state和this.props來訪問在之前函數(shù)中初始化的數(shù)據(jù)值?扁誓。

componentDidMount

在調用了render方法后,組件加載成功并被成功渲染出來以后蚀之,所要執(zhí)行的后續(xù)操作,一般會在這個函數(shù)中處理網(wǎng)絡請求等加載數(shù)據(jù)的操作捷泞;

3.2更新


如果前后元素不一致說明需要進行組件更新足删。

updateComponent 負責管理生命周期中的componentWillReceiveProps、shouldComponentUpdate锁右、componentWillUpdate失受、render 和 componentDidUpdate

注意:禁止在shouldComponentUpdatecomponentWillUpdate中調用setState咏瑟,會造成循環(huán)調用拂到,直至耗光瀏覽器內(nèi)存后崩潰。

componentWillReceiveProps

指父元素對組件的props或state進行了修改

shouldComponentUpdate

一般用于優(yōu)化码泞,可以返回false或true來控制是否進行渲染

componentWillUpdate

組件刷新前調用兄旬,類似componentWillMount

componentDidUpdate

更新后的hook

3.3卸載

unmountComponent 負責管理生命周期中的componentWillUnmount

首先將狀態(tài)設置為UNMOUNTING余寥,若存在 componentWillUnmount领铐,則執(zhí)行;如果此時在 componentWillUnmount 中調用setState宋舷,是不會觸發(fā) reRender绪撵。更新狀態(tài)為NULL,完成組件卸載操作祝蝠。

四音诈。常用的知識點

4.1setState 更新機制

setState的原理?

當調用setState時绎狭,會對 state 以及 _pendingState 更新隊列進行合并操作细溅,但其實真正更新 state 的幕后黑手是

replaceState

replaceState 會先判斷當前狀態(tài)是否為MOUNTING坟岔,如果不是即會調用ReactUpdates.enqueueUpdate執(zhí)行更新谒兄。

當狀態(tài)不為MOUNTING或RECEIVING_PROPS時,performUpdateIfNecessary 會獲取 _pendingElement社付、_pendingState承疲、_pendingForceUpdate邻耕,并調用 updateComponent 進行組件更新。

如果在 shouldComponentUpdate 或 componentWillUpdate 中調用setState燕鸽,此時的狀態(tài)已經(jīng)從RECEIVING_PROPS -> NULL兄世,則 performUpdateIfNecessary 就會調用 updateComponent 進行組件更新,但 updateComponent 又會調用 shouldComponentUpdate 和 componentWillUpdate啊研,因此造成循環(huán)調用御滩,使得瀏覽器內(nèi)存占滿后崩潰。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末党远,一起剝皮案震驚了整個濱河市削解,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌沟娱,老刑警劉巖氛驮,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異济似,居然都是意外死亡矫废,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門砰蠢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蓖扑,“玉大人,你說我怎么就攤上這事台舱÷筛埽” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵柿赊,是天一觀的道長俩功。 經(jīng)常有香客問我,道長碰声,這世上最難降的妖魔是什么诡蜓? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮胰挑,結果婚禮上蔓罚,老公的妹妹穿的比我還像新娘。我一直安慰自己瞻颂,他們只是感情好豺谈,可當我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著贡这,像睡著了一般茬末。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天丽惭,我揣著相機與錄音击奶,去河邊找鬼。 笑死责掏,一個胖子當著我的面吹牛柜砾,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播换衬,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼痰驱,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了瞳浦?” 一聲冷哼從身側響起担映,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎叫潦,沒想到半個月后另萤,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡诅挑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了泛源。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拔妥。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖达箍,靈堂內(nèi)的尸體忽然破棺而出没龙,到底是詐尸還是另有隱情,我是刑警寧澤缎玫,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布硬纤,位于F島的核電站,受9級特大地震影響赃磨,放射性物質發(fā)生泄漏筝家。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一邻辉、第九天 我趴在偏房一處隱蔽的房頂上張望溪王。 院中可真熱鬧,春花似錦值骇、人聲如沸莹菱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鞍泉。三九已至吓揪,卻和暖如春丢郊,著一層夾襖步出監(jiān)牢的瞬間扎狱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工坝橡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓嫂易,卻偏偏與公主長得像,于是被迫代替她去往敵國和親掐禁。 傳聞我的和親對象是個殘疾皇子怜械,可洞房花燭夜當晚...
    茶點故事閱讀 44,611評論 2 353

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