16. react組件生命周期(react component lifecycle)

三個階段:裝載损姜,更新为牍,銷毀
生命周期(組件內(nèi)在其某些階段自動執(zhí)行的函數(shù))
粉紅色--早期的生命周期中的方法
橙色--即將被淘汰的方法
藍色--新增的方法

image.png

方法簡介:
裝載/初始化:
createClass

調(diào)用 React.createClass,即創(chuàng)建組件類的時候票彪,會觸發(fā)getDefaultProps 方法乔妈,該方法返回一個對象,然后與父組件指定的props對象合并酸员,最后賦值給 this.props 作為該組件的默認屬性,該方法只調(diào)用一次

getDefaultProps

getDefaultProps 方法可以用來設(shè)置組件屬性的默認值,在組件被建立時候就立即調(diào)用讳嘱,所有實例都可以共享這些屬性幔嗦。此時并不可以使用this.state和setState。
注意es6語法中就不這樣用了呢燥,在前面一篇文章中介紹過了區(qū)別崭添。

getInitialState

getInitialState 方法用于定義初始狀態(tài),也不可以使用this.state和setState寓娩。

constructor

react組件的構(gòu)造函數(shù)在掛載之前被調(diào)用叛氨。在實現(xiàn)React.Component構(gòu)造函數(shù)時,需要先在添加其他內(nèi)容前棘伴,調(diào)用super(props)寞埠,用來將父組件傳來的props綁定到這個類中,使用this.props將會得到焊夸。constructor中應(yīng)當(dāng)做些初始化的動作仁连,如:初始化state,將事件處理函數(shù)綁定到類實例上,但也不要使用setState()饭冬。如果沒有必要初始化state或綁定方法使鹅,則不需要構(gòu)造constructor,或者把這個組件換成純函數(shù)寫法昌抠。

getDerivedStateFromProps

getDerivedStateFromProps在組件實例化后患朱,和接受新的props后被調(diào)用。他返回一個對象來更新狀態(tài)炊苫,或者返回null表示新的props不需要任何state的更新裁厅。
如果是由于父組件的props更改,所帶來的重新渲染侨艾,也會觸發(fā)此方法执虹。
(調(diào)用setState()不會觸發(fā)getDerivedStateFromProps()。)

componentWillMount

componentWillMount只在初始化時候被調(diào)用一次唠梨,可以使用setState方法袋励,會立即更新state,然后接著進行render当叭。(操作state插龄,不會觸發(fā)再次渲染,建議用constructor代替),如果在這里ajax的話科展,會導(dǎo)致componentWillMount執(zhí)行多次均牢,因此,不推薦在這里ajax才睹。

render

根據(jù) state 的值瓣履,生成頁面需要的虛擬 DOM 結(jié)構(gòu)。注意在render中千萬不可使用setState方法葵腹,不然馬上會引起無限的報錯了哈哈爆袍。如果其中包含其他的子組件,那么子組件的生命周期才開始進行坞琴。

componentDidMount

在子組件也都加載完畢后執(zhí)行哨查,在RN中就是指組件初始化加載完畢,在react中DOM(真實的dom)渲染完成剧辐,此時就可以操作DOM了寒亥。可以設(shè)置state荧关,會觸發(fā)再次渲染溉奕,組件內(nèi)部可以通過 ReactDOM.findDOMNode(this)來獲取當(dāng)前組件的節(jié)點操作DOM,以及進行ajax數(shù)據(jù)請求

class App extends Component {
    static PropTypes = {
        設(shè)置props類型階段
    }
    static defaultProps = {
        設(shè)置props默認值階段
    }
    constructor(props) {
        super(props)  繼承傳遞的值
        this.state = {  初始化state
            // ...
        }
    }
    componentWillMount() {
        預(yù)安裝階段
    }
    render() {
        將虛擬DOM結(jié)合到真實DOM中
    }
    componentDidMount() {
        可以進行數(shù)據(jù)請求等操作忍啤〖忧冢可以進行setState
    }
}

轉(zhuǎn)自作者:shengqz
鏈接:http://www.reibang.com/p/e026dd809f69

更新/渲染:
componentWillReceiveProps(nextProps)

componentWillReceiveProps方法可以比較this.props和nextProps來看是否發(fā)生了變化,然后可以進行setState等操作。當(dāng)組件接收到新的props時會觸發(fā)該函數(shù)鳄梅,通车可以調(diào)用this.setState方法來比較this.props和nextProps的執(zhí)行狀態(tài),完成對state的修改戴尸。(注意只要父組件此方法觸發(fā)煎饼,那么子組件也會觸發(fā),也就是說父組件更新校赤,子組件也會跟著更新吆玖。)

shouldComponentUpdate(nextProps, nextState)

shouldComponentUpdate 方法在接收了新的props或state后觸發(fā),你可以通過返回true或false來控制后面的生命周期流程是否觸發(fā)马篮。該方法用來攔截新的props或state沾乘,然后判斷是否更新組件

getDerivedStateFromProps

getDerivedStateFromProps在組件實例化后,和接受新的props后被調(diào)用浑测。他返回一個對象來更新狀態(tài)翅阵,或者返回null表示新的props不需要任何state的更新。
如果是由于父組件的props更改迁央,所帶來的重新渲染掷匠,也會觸發(fā)此方法。
(調(diào)用steState()不會觸發(fā)getDerivedStateFromProps()岖圈。)

componentWillUpdate(nextProps, nextState)

componentWillUpdate在props或state改變或shouldComponentUpdate返回true后觸發(fā)讹语。不可在其中使用setState。更新之前調(diào)用

render

根據(jù)diff算法蜂科,生成需要更新的虛擬DOM數(shù)據(jù)

getDerivedStateFromProps(prevProps, prevState)

getDerivedStateFromProps在組件每一次render的時候都會觸發(fā)顽决,也就是說無論是來自父組件的re-render, 還是組件自身的setState, 都會觸發(fā)getDerivedStateFromProps這個生命周期导匣。

componentDidUpdate

會等子組件也都更新完后才觸發(fā)才菠。更新之后調(diào)用,可以進行DOM 操作

class App extends Component {
    componentWillReceiveProps(nextProps) {
        接受更新props階段贡定,可以使用setState
    }
    shouldComponentUpdate(nextProps,nextState) {
        是否更新props和state階段赋访,默認為true,代表渲染(更新)
        可以在這個階段對nextProps和當(dāng)前this.props進行對比缓待,以便確認是否渲染(更新)
    }
    componentWillUpdate(nextProps, nextState) {
       與掛載相似蚓耽,預(yù)安裝
    }
    render() {
        將虛擬DOM結(jié)合到真實DOM中,純函數(shù)返回值只能有一個頂根元素或null命斧。
    }
    componentDidUpdate() {
        實際渲染(更新)階段(將DOM添加到HTML中)
    }
}

轉(zhuǎn)自作者:shengqz
鏈接:http://www.reibang.com/p/e026dd809f69

銷毀/卸載:
componentWillUnmount

通常是移除DOM田晚,取消事件綁定,銷毀定時器等工作

class App extends Component {
    componentWillUnmount() {
       可以卸載在componentDidMount的Ajax請求
    }
}
轉(zhuǎn)自作者:shengqz
鏈接:http://www.reibang.com/p/e026dd809f69

注意:

  1. shouldComponentUpdate是做react性能優(yōu)化最重要的時期

  2. 如果組件的state是在constructor里依賴props進行初始化的国葬,那么這個state在外部的props的更改的時候,不會觸發(fā)render,因為constructor只會在初始化時觸發(fā)汇四,如果說要更新的話接奈,componentWillReceiveProps中再調(diào)用setState改變值

  3. 新版本(16.3)中:static getDerivedStateFromProps(props){}
    static靜態(tài)方法中沒有this,因此通孽,不能this.setState修改state的值序宦,如果需要返回修改,直接return

  4. render中最好只是數(shù)據(jù)和模板的組合背苦,不應(yīng)該修改state
    如果shouldComponentUpdate返回false互捌,componentWillUpdate,render行剂,componentDidUpdate都不會被調(diào)用

  5. 在接下來的17版本中可能會淘汰componentWillMount秕噪,componentWillUpdate,componentWillReceiveProps厚宰。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末腌巾,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子铲觉,更是在濱河造成了極大的恐慌澈蝙,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件撵幽,死亡現(xiàn)場離奇詭異灯荧,居然都是意外死亡,警方通過查閱死者的電腦和手機盐杂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門漏麦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人况褪,你說我怎么就攤上這事撕贞。” “怎么了测垛?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵捏膨,是天一觀的道長。 經(jīng)常有香客問我食侮,道長号涯,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任锯七,我火速辦了婚禮链快,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘眉尸。我一直安慰自己域蜗,他們只是感情好巨双,可當(dāng)我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著霉祸,像睡著了一般筑累。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上丝蹭,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天慢宗,我揣著相機與錄音,去河邊找鬼奔穿。 笑死镜沽,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的贱田。 我是一名探鬼主播缅茉,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼湘换!你這毒婦竟也來了宾舅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤彩倚,失蹤者是張志新(化名)和其女友劉穎筹我,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體帆离,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡蔬蕊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了哥谷。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片岸夯。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖们妥,靈堂內(nèi)的尸體忽然破棺而出猜扮,到底是詐尸還是另有隱情,我是刑警寧澤监婶,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布旅赢,位于F島的核電站,受9級特大地震影響惑惶,放射性物質(zhì)發(fā)生泄漏煮盼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一带污、第九天 我趴在偏房一處隱蔽的房頂上張望僵控。 院中可真熱鬧,春花似錦鱼冀、人聲如沸报破。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽泛烙。三九已至理卑,卻和暖如春翘紊,著一層夾襖步出監(jiān)牢的瞬間蔽氨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工帆疟, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留鹉究,地道東北人。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓踪宠,卻偏偏與公主長得像自赔,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子柳琢,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,955評論 2 355

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

  • 作為一個合格的開發(fā)者绍妨,不要只滿足于編寫了可以運行的代碼。而要了解代碼背后的工作原理柬脸;不要只滿足于自己的程序...
    六個周閱讀 8,448評論 1 33
  • 生命周期流程圖簡單如下: 組件讓你把用戶界面分成獨立的他去,可重復(fù)使用的部分,并且將每個部分分開考慮倒堕。React.Co...
    Simple_Learn閱讀 1,079評論 0 0
  • 在React Native中使用組件來封裝界面模塊時灾测,整個界面就是一個大的組件,開發(fā)過程就是不斷優(yōu)化和拆分界面組件...
    朱_源浩閱讀 8,952評論 6 38
  • 組件的生命周期方法分以下三個階段垦巴。 Mounting當(dāng)創(chuàng)建組件的實例并將其插入到DOM中時媳搪,將調(diào)用這些方法:con...
    _八神光_閱讀 1,093評論 0 0
  • 今天早上起來看見爸爸媽媽發(fā)的祝福,很幸福爸爸總是心里對我有愧疚骤宣,而這種愧疚大約是相互的秦爆,人活一生,要有點盼頭憔披,大家...
    許公子_閱讀 181評論 0 0