三個階段:裝載损姜,更新为牍,銷毀
生命周期(組件內(nèi)在其某些階段自動執(zhí)行的函數(shù))
粉紅色--早期的生命周期中的方法
橙色--即將被淘汰的方法
藍色--新增的方法
方法簡介:
裝載/初始化:
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
注意:
shouldComponentUpdate是做react性能優(yōu)化最重要的時期
如果組件的state是在constructor里依賴props進行初始化的国葬,那么這個state在外部的props的更改的時候,不會觸發(fā)render,因為constructor只會在初始化時觸發(fā)汇四,如果說要更新的話接奈,componentWillReceiveProps中再調(diào)用setState改變值
新版本(16.3)中:static getDerivedStateFromProps(props){}
static靜態(tài)方法中沒有this,因此通孽,不能this.setState修改state的值序宦,如果需要返回修改,直接returnrender中最好只是數(shù)據(jù)和模板的組合背苦,不應(yīng)該修改state
如果shouldComponentUpdate返回false互捌,componentWillUpdate,render行剂,componentDidUpdate都不會被調(diào)用在接下來的17版本中可能會淘汰componentWillMount秕噪,componentWillUpdate,componentWillReceiveProps厚宰。