當(dāng)通過調(diào)用 React.createClass() 來創(chuàng)建組件的時(shí)候,你應(yīng)該提供一個(gè)包含 render 方法的對(duì)象,并且也可以包含其它的在這里描述的生命周期方法。
ReactComponent render()
render() 方法是必須的。
當(dāng)調(diào)用的時(shí)候,會(huì)檢測(cè) this.props 和 this.state,返回一個(gè)單子級(jí)組件。該子級(jí)組件可以是虛擬的本地 DOM 組件(比如 <div /> 或者 React.DOM.div()),也可以是自定義的復(fù)合組件。
你也可以返回 null 或者 false 來表明不需要渲染任何東西。實(shí)際上,React 渲染一個(gè) <noscript> 標(biāo)簽來處理當(dāng)前的差異檢查邏輯。當(dāng)返回 null 或者 false 的時(shí)候,this.getDOMNode() 將返回 null。
render() 函數(shù)應(yīng)該是純粹的,也就是說該函數(shù)不修改組件 state,每次調(diào)用都返回相同的結(jié)果,不讀寫 DOM 信息,也不和瀏覽器交互(例如通過使用 setTimeout)。如果需要和瀏覽器交互,在 componentDidMount() 中或者其它生命周期方法中做這件事。保持 render() 純粹,可以使服務(wù)器端渲染更加切實(shí)可行,也使組件更容易被理解。
object getInitialState()
在組件掛載之前調(diào)用一次。返回值將會(huì)作為 this.state 的初始值。
object getDefaultProps()
在組件類創(chuàng)建的時(shí)候調(diào)用一次,然后返回值被緩存下來。如果父組件沒有指定 props 中的某個(gè)鍵,則此處返回的對(duì)象中的相應(yīng)屬性將會(huì)合并到 this.props (使用 in 檢測(cè)屬性)。
該方法在任何實(shí)例創(chuàng)建之前調(diào)用,因此不能依賴于 this.props。另外,getDefaultProps() 返回的任何復(fù)雜對(duì)象將會(huì)在實(shí)例間共享,而不是每個(gè)實(shí)例擁有一份拷貝。
object propTypes
propTypes 對(duì)象允許驗(yàn)證傳入到組件的 props。更多關(guān)于 propTypes 的信息,參考可重用的組件。
array mixins
mixin 數(shù)組允許使用混合來在多個(gè)組件之間共享行為。更多關(guān)于混合的信息,參考可重用的組件。
object statics
statics 對(duì)象允許你定義靜態(tài)的方法,這些靜態(tài)的方法可以在組件類上調(diào)用。例如:
var MyComponent = React.createClass({
statics: {
customMethod: function(foo) {
return foo === 'bar';
}
},
render: function() {
}
});
MyComponent.customMethod('bar'); // true
在這個(gè)塊兒里面定義的方法都是靜態(tài)的,意味著你可以在任何組件實(shí)例創(chuàng)建之前調(diào)用它們,這些方法不能獲取組件的 props 和 state。如果你想在靜態(tài)方法中檢查 props 的值,在調(diào)用處把 props 作為參數(shù)傳入到靜態(tài)方法。
string displayName
displayName 字符串用于輸出調(diào)試信息。JSX 自動(dòng)設(shè)置該值;參考JSX 深入。
許多方法在組件生命周期中某個(gè)確定的時(shí)間點(diǎn)執(zhí)行。
componentWillMount()
服務(wù)器端和客戶端都只調(diào)用一次,在初始化渲染執(zhí)行之前立刻調(diào)用。如果在這個(gè)方法內(nèi)調(diào)用 setState,render() 將會(huì)感知到更新后的 state,將會(huì)執(zhí)行僅一次,盡管 state 改變了。
componentDidMount()
在初始化渲染執(zhí)行之后立刻調(diào)用一次,僅客戶端有效(服務(wù)器端不會(huì)調(diào)用)。在生命周期中的這個(gè)時(shí)間點(diǎn),組件擁有一個(gè) DOM 展現(xiàn),你可以通過 this.getDOMNode() 來獲取相應(yīng) DOM 節(jié)點(diǎn)。
如果想和其它 JavaScript 框架集成,使用 setTimeout 或者 setInterval 來設(shè)置定時(shí)器,或者發(fā)送 AJAX 請(qǐng)求,可以在該方法中執(zhí)行這些操作。
注意:
為了兼容 v0.9,DOM 節(jié)點(diǎn)作為最后一個(gè)參數(shù)傳入。你依然可以通過
this.getDOMNode()獲取 DOM 節(jié)點(diǎn)。
componentWillReceiveProps(object nextProps)
在組件接收到新的 props 的時(shí)候調(diào)用。在初始化渲染的時(shí)候,該方法不會(huì)調(diào)用。
用此函數(shù)可以作為 react 在 prop 傳入之后, render() 渲染之前更新 state 的機(jī)會(huì)。老的 props 可以通過 this.props 獲取到。在該函數(shù)中調(diào)用 this.setState() 將不會(huì)引起第二次渲染。
componentWillReceiveProps: function(nextProps) {
this.setState({
likesIncreasing: nextProps.likeCount > this.props.likeCount
});
}
注意:
對(duì)于 state,沒有相似的方法:
componentWillReceiveState。將要傳進(jìn)來的 prop 可能會(huì)引起 state 改變,反之則不然。如果需要在 state 改變的時(shí)候執(zhí)行一些操作,請(qǐng)使用componentWillUpdate。
boolean shouldComponentUpdate(object nextProps, object nextState)
在接收到新的 props 或者 state,將要渲染之前調(diào)用。該方法在初始化渲染的時(shí)候不會(huì)調(diào)用,在使用 forceUpdate 方法的時(shí)候也不會(huì)。
如果確定新的 props 和 state 不會(huì)導(dǎo)致組件更新,則此處應(yīng)該 返回 false。
shouldComponentUpdate: function(nextProps, nextState) {
return nextProps.id !== this.props.id;
}
如果 shouldComponentUpdate 返回 false,則 render() 將不會(huì)執(zhí)行,直到下一次 state 改變。(另外,componentWillUpdate 和 componentDidUpdate 也不會(huì)被調(diào)用。)
默認(rèn)情況下,shouldComponentUpdate 總會(huì)返回 true,在 state 改變的時(shí)候避免細(xì)微的 bug,但是如果總是小心地把 state 當(dāng)做不可變的,在 render() 中只從 props 和 state 讀取值,此時(shí)你可以覆蓋 shouldComponentUpdate 方法,實(shí)現(xiàn)新老 props 和 state 的比對(duì)邏輯。
如果性能是個(gè)瓶頸,尤其是有幾十個(gè)甚至上百個(gè)組件的時(shí)候,使用 shouldComponentUpdate 可以提升應(yīng)用的性能。
componentWillUpdate(object nextProps, object nextState)
在接收到新的 props 或者 state 之前立刻調(diào)用。在初始化渲染的時(shí)候該方法不會(huì)被調(diào)用。
使用該方法做一些更新之前的準(zhǔn)備工作。
注意:
你不能在剛方法中使用
this.setState()。如果需要更新 state 來響應(yīng)某個(gè) prop 的改變,請(qǐng)使用componentWillReceiveProps。
componentDidUpdate(object prevProps, object prevState)
在組件的更新已經(jīng)同步到 DOM 中之后立刻被調(diào)用。該方法不會(huì)在初始化渲染的時(shí)候調(diào)用。
使用該方法可以在組件更新之后操作 DOM 元素。
注意:
為了兼容 v0.9,DOM 節(jié)點(diǎn)會(huì)作為最后一個(gè)參數(shù)傳入。如果使用這個(gè)方法,你仍然可以使用
this.getDOMNode()來訪問 DOM 節(jié)點(diǎn)。
componentWillUnmount()
在組件從 DOM 中移除的時(shí)候立刻被調(diào)用。
在該方法中執(zhí)行任何必要的清理,比如無效的定時(shí)器,或者清除在 componentDidMount 中創(chuàng)建的 DOM 元素。