React生命周期如下圖所示:
如上圖顿仇,react生命周期主要可以分組件掛載角雷、組件更新及組件卸載三個部分。
一爆雹、組件掛載
組件掛載主要是完成組件狀態(tài)的初始化停蕉,設(shè)計兩個生命周期函數(shù):componentWillMount和componentDidMount。主要包含以下幾個點:
static propTypes={} 和 static defaultProps={}: 分別定義了組件的props類型檢查和默認參數(shù)钙态。static表明這兩個屬性被聲明為靜態(tài)屬性慧起,意味著從類外面也可以訪問他們,比如:類名.propTypes册倒。
constructor(): 用于組件初始化工作蚓挤,如:定義this.state的初始內(nèi)容。constructor()接受兩個參數(shù):props,context驻子,是指父組件傳下來的的props,context灿意。注意:如果想在constructor()內(nèi)部使用props或context,需要將props崇呵、context傳入super()缤剧,在組件其他地方可以直接使用。
componentWillMount: 在組件掛載到DOM前調(diào)用域慷,因此在這里調(diào)用this.setState不會引起組件重新渲染荒辕。
componentDidMount: 在組件掛載到DOM后調(diào)用汗销,在這里調(diào)用this.setState會觸發(fā)組件再次渲染,并且在此時抵窒,dom節(jié)點已經(jīng)生成弛针,故而可以在此獲取真實dom、進行ajax請求等李皇。
注意: componentWillMount 和componentDidMount 只會執(zhí)行一次削茁,即組件第一次初始化時。
二掉房、組件更新
組件更新涉及四個生命周期函數(shù):componentWillReceiveProps付材、shouldComponentUpdate、componentWillUpdate圃阳、componentDidUpdate厌衔。下面按觸發(fā)的先后順序進行介紹。
componentWillReceiveProps(nextProps): 在接收父組件改變后的props時觸發(fā)捍岳「皇伲可以通過比較傳入的nextProps與當前this.props,對組件進行操作锣夹。
shouldComponentUpdate(nextProps, nextState): 唯一一個用于控制是否讓組件重新渲染的生命周期函數(shù)页徐。如果不想讓組件重新渲染,return false即可银萍。
componentWillUpdate (nextProps,nextState): shouldComponentUpdate(nextProps, nextState)返回true之后变勇,就會觸發(fā)組件重新渲染,進入componentWillUpdate 函數(shù)贴唇。
componentDidUpdate(prevProps,prevState): 組件只有在第一次更新完成后才會進入componentDidmount搀绣,之后都是進入componentDidUpdate。prevProps和prevState是更新前的props和state戳气。同componentDidMount 链患,componentDidUpdate()執(zhí)行時,dom也已經(jīng)真正被添加到HTML中瓶您,故也可在此對dom進行操作麻捻。
補充說明:
-
造成組件更新的情況有兩類:一類是props變化,另一類是state變化呀袱。
第一類情況就是當父組件重新渲染的時候贸毕,props重傳導致。此時夜赵,無論props是否發(fā)生變化明棍,子組件都會重新渲染。此處油吭,可通過上述componentWillReceiveProps(nextProps)進行優(yōu)化击蹲。
第二類情況就是組件本身調(diào)用this.setState()引起,無論state是否變化婉宰,都會重新渲染歌豺。但由于是自身引起,故不會觸發(fā)componentWillReceiveProps方法心包。另外类咧,此種情況同樣可通過shouldComponentUpdate(nextStates)優(yōu)化。
只有在componentWillMount蟹腾、componentDidMount痕惋、componentWillReceiveProps與componentDidUpdate四個方法中才能調(diào)用this.setState(),且在componentWillMount中調(diào)用無意義娃殖。
三值戳、組件卸載
組件卸載涉及兩個生命周期函數(shù):componentWillUnmount和componentDidMount。
componentWillUnmount(): 在組件卸載前調(diào)用炉爆,一般執(zhí)行一些清理工作堕虹,如:清除定時器(setTimeout,setInterval)、清除時間監(jiān)聽(removeEventListener)芬首、清除手動創(chuàng)建的dom等赴捞。
componentDidMount(): 組件卸載后執(zhí)行的一些操作。