ReactNative系列之react-native生命周期

ReactNative.jpg

一系吩、概述

開發(fā)RN,必不可少的就是它的基礎(chǔ)框架react-native串慰。對(duì)于框架的學(xué)習(xí)绞灼,官網(wǎng)上有很多很詳細(xì)的介紹,這里就不多講了敷矫,ReactNative英文官網(wǎng)ReactNative中文官網(wǎng)贞盯。像propsstate等重要屬性都有講解沪饺,只是講的比較簡(jiǎn)單,不太好理解闷愤。如果感覺不好理解整葡,推薦去React官網(wǎng)看看。因?yàn)镽N就是基于reactjs來編寫的讥脐,下沉的去學(xué)習(xí)reactjs是使自己的操作更規(guī)范的一個(gè)不錯(cuò)方法遭居。

特別推薦一篇React 哲學(xué),它主要講從UI設(shè)計(jì)到狀態(tài)處理旬渠,最后到數(shù)據(jù)流的一個(gè)過程俱萍。有一定基礎(chǔ)的RN開發(fā)一定要看看,特別重要告丢。

看完之后枪蘑,就被這句話圈粉了。岖免。岳颇。

二、生命周期圖譜

圖片來自網(wǎng)絡(luò)

如圖颅湘,可以把RN組件生命周期大致分為三個(gè)階段:

  1. 第一階段:是組件第一次繪制階段话侧,如圖中的上面虛線框內(nèi),在這里完成了組件的加載和初始化闯参;
  2. 第二階段:是組件在運(yùn)行和交互階段瞻鹏,如圖中左下角虛線框,這個(gè)階段組件可以處理用戶交互鹿寨,或者接收事件更新界面新博;
  3. 第三階段:是組件卸載消亡的階段,如圖中右下角的虛線框中释移,這里做一些組件的清理工作叭披。

三、生命周期函數(shù)

3.1getDefaultProps

在組件創(chuàng)建之前,會(huì)先調(diào)用getDefaultProps()涩蜘,這是全局調(diào)用一次嚼贡,嚴(yán)格地來說,這不是組件的生命周期的一部分同诫。在組件被創(chuàng)建并加載后粤策,首先調(diào)用getInitialState(),來初始化組件的狀態(tài)误窖。

3.2getInitialState

該函數(shù)用于對(duì)組件一些狀態(tài)進(jìn)行初始化叮盘,不同于getDefaultProps,在以后的過程中,會(huì)再次調(diào)用霹俺,所以可以將控制控件狀態(tài)的一些變量放在這里初始化柔吼,比如控件上顯示的文字,可以通過this.state來獲取值丙唧,通過this.setState來修改state值愈魏。注意:一旦調(diào)用了this.setState方法,組件一定會(huì)調(diào)用render方法想际,對(duì)組件進(jìn)行再次渲染培漏,不過,React框架會(huì)根據(jù)DOM的狀態(tài)自動(dòng)判斷是否需要真正渲染胡本。

3.3componentWillMount

準(zhǔn)備加載組件牌柄,會(huì)調(diào)用componentWillMount(),這個(gè)函數(shù)調(diào)用時(shí)機(jī)是在組件創(chuàng)建侧甫,并初始化了狀態(tài)之后珊佣,在第一次繪制render()之前∨冢可以在這里做一些業(yè)務(wù)初始化操作彩扔,也可以設(shè)置組件狀態(tài)。這個(gè)函數(shù)在整個(gè)生命周期中只被調(diào)用一次僻爽。

void componentWillMount()

3.4render

render函數(shù)會(huì)插入jsx生成的dom結(jié)構(gòu)虫碉,react會(huì)生成一份虛擬dom樹,在每一次組件更新時(shí)胸梆,在此react會(huì)通過其diff算法比較更新前后的新舊DOM樹敦捧,比較以后,找到最小的有差異的DOM節(jié)點(diǎn)碰镜,并重新渲染兢卵。

3.5componentDidMount

在組件第一次繪制之后,會(huì)調(diào)用componentDidMount()绪颖,通知組件已經(jīng)加載完成秽荤。這個(gè)函數(shù)調(diào)用的時(shí)候,其虛擬 DOM 已經(jīng)構(gòu)建完成,你可以在這個(gè)函數(shù)開始獲取其中的元素或者子組件了窃款。需要注意的是课兄,RN 框架是先調(diào)用子組件的componentDidMount(),然后調(diào)用父組件的函數(shù)晨继。從這個(gè)函數(shù)開始烟阐,就可以和 JS 其他框架交互了,例如設(shè)置計(jì)時(shí)setTimeout或者setInterval紊扬,或者發(fā)起網(wǎng)絡(luò)請(qǐng)求蜒茄。這個(gè)函數(shù)也是只被調(diào)用一次。這個(gè)函數(shù)之后餐屎,就進(jìn)入了穩(wěn)定運(yùn)行狀態(tài)檀葛,等待事件觸發(fā)。

void componentDidMount()

3.6componentWillReceiveProps

如果組件收到新的屬性(props)腹缩,就會(huì)調(diào)用componentWillReceiveProps()驻谆,輸入?yún)?shù)nextProps是即將被設(shè)置的屬性,舊的屬性還是可以通過this.props來獲取庆聘。在這個(gè)回調(diào)函數(shù)里面,你可以根據(jù)屬性的變化勺卢,通過調(diào)用this.setState()來更新你的組件狀態(tài)伙判,這里調(diào)用更新狀態(tài)是安全的,并不會(huì)觸發(fā)額外的render()調(diào)用黑忱。

void componentWillReceiveProps(object nextProps)

3.7shouldComponentUpdate

當(dāng)組件接收到新的屬性和狀態(tài)改變的話宴抚,都會(huì)觸發(fā)調(diào)用shouldComponentUpdate(...),輸入?yún)?shù)nextProps和上面的componentWillReceiveProps函數(shù)一樣甫煞,nextState表示組件即將更新的狀態(tài)值菇曲。這個(gè)函數(shù)的返回值決定是否需要更新組件,如果true表示需要更新抚吠,繼續(xù)走后面的更新流程常潮。否者,則不更新楷力,直接進(jìn)入等待狀態(tài)喊式。默認(rèn)情況下,這個(gè)函數(shù)永遠(yuǎn)返回true用來保證數(shù)據(jù)變化的時(shí)候 UI 能夠同步更新萧朝。在大型項(xiàng)目中岔留,你可以自己重載這個(gè)函數(shù),通過檢查變化前后屬性和狀態(tài)检柬,來決定 UI 是否需要更新献联,能有效提高應(yīng)用性能。

boolean shouldComponentUpdate(object nextProps, object nextState)

3.8componentWillUpdate

如果組件狀態(tài)或者屬性改變,并且上面的shouldComponentUpdate(...)返回為true里逆,就會(huì)開始準(zhǔn)更新組件进胯,并調(diào)用componentWillUpdate(),輸入?yún)?shù)與shouldComponentUpdate一樣运悲,在這個(gè)回調(diào)中龄减,可以做一些在更新界面之前要做的事情。需要特別注意的是班眯,在這個(gè)函數(shù)里面希停,你就不能使用this.setState來修改狀態(tài)。這個(gè)函數(shù)調(diào)用之后署隘,就會(huì)把nextPropsnextState分別設(shè)置到this.propsthis.state中宠能。緊接著這個(gè)函數(shù),就會(huì)調(diào)用render()來更新界面了磁餐。

void componentWillUpdate(object nextProps, object nextState)

3.9componentDidUpdate

調(diào)用了render()更新完成界面之后违崇,會(huì)調(diào)用componentDidUpdate()來得到通知,因?yàn)榈竭@里已經(jīng)完成了屬性和狀態(tài)的更新了诊霹,此函數(shù)的輸入?yún)?shù)變成了prevPropsprevState羞延。

void componentDidUpdate(object prevProps, object prevState)

3.10componentWillUnmount

當(dāng)組件要被從界面上移除的時(shí)候,就會(huì)調(diào)用componentWillUnmount()脾还,在這個(gè)函數(shù)中伴箩,可以做一些組件相關(guān)的清理工作,例如取消計(jì)時(shí)器鄙漏、網(wǎng)絡(luò)請(qǐng)求等嗤谚。

void componentWillUnmount()

3.11constructor

構(gòu)造函數(shù)在生命周期圖譜中沒有體現(xiàn),但是它是組件構(gòu)造時(shí)候必須調(diào)用的函數(shù)怔蚌。constructor參數(shù)接受兩個(gè)參數(shù)props,context巩步,可以獲取到父組件傳下來的props,context,如果你想在constructor構(gòu)造函數(shù)內(nèi)部(注意是內(nèi)部哦,在組件其他地方是可以直接接收的)使用propscontext,則需要傳入桦踊,并傳入super對(duì)象椅野。當(dāng)然如果你只需要在構(gòu)造函數(shù)內(nèi)使用props或者context,那么只傳入一個(gè)參數(shù)即可籍胯,如果都不可以鳄橘,就都不傳。注意:只要組件存在constructor,就必要要寫super,否則this指向會(huì)錯(cuò)誤芒炼。

四瘫怜、調(diào)用

image.png

歡迎大佬糾錯(cuò)指導(dǎo),歡迎同行交流學(xué)習(xí)本刽。

GitHub:https://github.com/Code4GL
簡(jiǎn)書:http://www.reibang.com/u/7f5541a6b6d2
知乎:https://www.zhihu.com/people/code4gl/activities
公眾號(hào):code_everything
QQ:771841496
郵箱:guanli1991@163.com

掃碼關(guān)注公眾號(hào)code_everything
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鲸湃,一起剝皮案震驚了整個(gè)濱河市赠涮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌暗挑,老刑警劉巖笋除,帶你破解...
    沈念sama閱讀 212,542評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異炸裆,居然都是意外死亡垃它,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門烹看,熙熙樓的掌柜王于貴愁眉苦臉地迎上來国拇,“玉大人,你說我怎么就攤上這事惯殊〗戳撸” “怎么了?”我有些...
    開封第一講書人閱讀 158,021評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵土思,是天一觀的道長(zhǎng)务热。 經(jīng)常有香客問我,道長(zhǎng)己儒,這世上最難降的妖魔是什么崎岂? 我笑而不...
    開封第一講書人閱讀 56,682評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮闪湾,結(jié)果婚禮上冲甘,老公的妹妹穿的比我還像新娘。我一直安慰自己响谓,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評(píng)論 6 386
  • 文/花漫 我一把揭開白布省艳。 她就那樣靜靜地躺著娘纷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪跋炕。 梳的紋絲不亂的頭發(fā)上赖晶,一...
    開封第一講書人閱讀 49,985評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音辐烂,去河邊找鬼遏插。 笑死,一個(gè)胖子當(dāng)著我的面吹牛纠修,可吹牛的內(nèi)容都是我干的胳嘲。 我是一名探鬼主播,決...
    沈念sama閱讀 39,107評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼扣草,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼了牛!你這毒婦竟也來了颜屠?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,845評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤鹰祸,失蹤者是張志新(化名)和其女友劉穎甫窟,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蛙婴,經(jīng)...
    沈念sama閱讀 44,299評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡粗井,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了街图。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片浇衬。...
    茶點(diǎn)故事閱讀 38,747評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖台夺,靈堂內(nèi)的尸體忽然破棺而出径玖,到底是詐尸還是另有隱情,我是刑警寧澤颤介,帶...
    沈念sama閱讀 34,441評(píng)論 4 333
  • 正文 年R本政府宣布梳星,位于F島的核電站,受9級(jí)特大地震影響滚朵,放射性物質(zhì)發(fā)生泄漏冤灾。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評(píng)論 3 317
  • 文/蒙蒙 一辕近、第九天 我趴在偏房一處隱蔽的房頂上張望韵吨。 院中可真熱鬧,春花似錦移宅、人聲如沸归粉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽糠悼。三九已至,卻和暖如春浅乔,著一層夾襖步出監(jiān)牢的瞬間倔喂,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評(píng)論 1 267
  • 我被黑心中介騙來泰國(guó)打工靖苇, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留席噩,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,545評(píng)論 2 362
  • 正文 我出身青樓贤壁,卻偏偏與公主長(zhǎng)得像悼枢,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子脾拆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評(píng)論 2 350

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

  • 40萧芙、React 什么是React给梅?React 是一個(gè)用于構(gòu)建用戶界面的框架(采用的是MVC模式):集中處理VIE...
    萌妹撒閱讀 1,005評(píng)論 0 1
  • 作為一個(gè)合格的開發(fā)者,不要只滿足于編寫了可以運(yùn)行的代碼双揪。而要了解代碼背后的工作原理动羽;不要只滿足于自己的程序...
    六個(gè)周閱讀 8,428評(píng)論 1 33
  • 原教程內(nèi)容詳見精益 React 學(xué)習(xí)指南,這只是我在學(xué)習(xí)過程中的一些閱讀筆記渔期,個(gè)人覺得該教程講解深入淺出运吓,比目前大...
    leonaxiong閱讀 2,813評(píng)論 1 18
  • HTML模版 之后出現(xiàn)的React代碼嵌套入模版中。 1. Hello world 這段代碼將一個(gè)一級(jí)標(biāo)題插入到指...
    ryanho84閱讀 6,225評(píng)論 0 9
  • 在React Native中使用組件來封裝界面模塊時(shí)疯趟,整個(gè)界面就是一個(gè)大的組件拘哨,開發(fā)過程就是不斷優(yōu)化和拆分界面組件...
    ITxiansheng閱讀 937評(píng)論 1 2