一般來說,一個組件類由 extends Component 創(chuàng)建,并且提供一個 render 方法以及其他可選的生命周期函數(shù)、組件相關(guān)的事件或方法來定義
getInitialState (es5)
初始化 this.state 的值,只在組件裝載之前 調(diào)用一次 。
如果是使用 ES6 語法,可以在構(gòu)造函數(shù) construcror 中初始化state的值。例如:
class Home extends React.Component {
constructor(props){
super(props);
//初始化state
this.state = {
show:false
}
}
}
getDefaultProps (es5)
該方法只在組件創(chuàng)建時 調(diào)用一次 并緩存返回的對象(即在 React.createClass 之后就會調(diào)用)。
初始化this.props的值,即在組件裝載后,緩存的結(jié)果會用來保證 父組件還沒傳入屬性的值時,訪問 this.props 的屬性,也是有值的。
因在實(shí)例初始化之前調(diào)用的,故不能使用this獲取到實(shí)例。
如果是使用 ES6 語法,可以直接定義 defaultProps 這個類屬性來初始化props
Home.defaultProps = { initialCount: 0 };
componentWillMount
在首次渲染之前調(diào)用,而且 只調(diào)用一次。
這里可以修改state,也是在 render 方法調(diào)用之前修改 state 的最后一次機(jī)會,不會導(dǎo)致重新渲染(state或者props發(fā)生改變并不會觸發(fā))。
也可以做 異步請求數(shù)據(jù)ajax/fetch(但不建議,因?yàn)镈OM還沒有渲染,個時候的一些DOM操作就會出錯)。
此處如更改state會在render()渲染時才能獲取修改后的state
render
渲染組件
這是 唯一必須 的方法:創(chuàng)建虛擬DOM
- 只能通過 this.props 和 this.state 訪問數(shù)據(jù)(不能修改)
- 可以返回 null,false 或者任何React組件
- 只能出現(xiàn)一個頂級組件,不能返回一組元素
- 不能改變組件的狀態(tài)
- 不能修改DOM的輸出
render方法返回的結(jié)果并不是真正的DOM元素,而是一個虛擬的表現(xiàn),類似于一個DOM tree的結(jié)構(gòu)的對象。react之所以效率高,就是這個原因。
componentDidMount
初始化渲染后只調(diào)用一次,這時可以獲取相應(yīng)的DOM節(jié)點(diǎn)。
這里可以掛載一些其他的插件之類的,也可以執(zhí)行異步請求;一般 建議在componentDidMount中異步請求數(shù)據(jù)
componentWillReceiveProps(nextProps)
初始化渲染不會調(diào)用,組件在接受到新的props時調(diào)用,nextProps是接受到的新的props,可以通過this.props獲取老的props。例如:當(dāng)父組件傳入新的props的時候可以在此做些簡單的處理
componentWillReceiveProps(nextProps){
let params = this.params;
let nextParams = nextProps.params;
if (params.sub !== nextParams.sub){
//簡單的邏輯處理
}
}
shouldComponentWillUpdate
初始化渲染不會調(diào)用,接收到新的props或state時調(diào)用
componentWillUpdate
初始化渲染不會調(diào)用,更新前調(diào)用。組件渲染前執(zhí)行,接受新的props、state或者調(diào)用forceUpdate()
componentDidUpdate
初始化渲染不會調(diào)用,更新后調(diào)用。組件每次渲染都會執(zhí)行,可以獲取相應(yīng)的DOM節(jié)點(diǎn)
componentWillUnmount
組件被卸載的時候調(diào)用。
在componentDidMount 中添加的任務(wù)都需要在該方法中撤銷,如創(chuàng)建的定時器、事件監(jiān)聽器或斷開socket
一般在componentDidMount里面注冊的事件需要在這里刪除
每次使用this.setState 修改state時,會依次調(diào)用:
* shouldComponentUpdate
* componentWillUpdate
* render
* componentDidUpdate
調(diào)用setState(setState并不是一個同步的方法,可以理解為異步)后,立刻獲取的值,仍然是老值,需要在render的時候才能獲取修改后的新值;如果想setState后獲取到更新的值,可以放在回調(diào)里;比如:
this.setState({
show:true
},function(){
console.log(this.state.show) //true
})