React生命周期方法

在組件的整個生命周期中,隨著該組件的props或者state發生改變,它的DOM表現也將有相應的改變,一個組件就是一個狀態機,對于特定的輸入,它總會返回一致的輸出。
React為每個組件提供了生命周期鉤子函數去響應不同的時刻——創建時、存在期及銷毀時
實例化:
一個實例出吃被穿件時所調用的生命周期方法與其他哥哥后續實例被創建所調用的方法略有不同。當你首次使用一個組建類時,會看到下面這些方法依次被調用:
getDefaultProps
getInitialState
componentWillMount
render
ComponentDidMOunt

對于該組件類所有后續應用,你將會看到下面的方法依次被調用。注意:gerDefaultProps方法不在列表中。
getInitialState
componentWillMount
render
componentDidMount

存在期:
隨著應用狀態的改變,以及組件逐漸受到影響,你將會看到下面的方法一次被調用:
componentwillReceiveProps
shouldComponentUpdate
componentWillUpdate
render
componentDidUpdate

銷毀&清理期:
最后,當該組件被使用完成后,componentWillUnmount方法會被調用,目的是給這個實例提供清理自身的機會。

以下是詳細說明:

實例化:
當每個新的組件被創建首次渲染時,有一系列的方法可以用來為其做準備工作,這些方法中的每一個斗毆明確的職責,如下所示:
getDefaultProps
對于組件來說,這個方法只會調用一次,對于那些沒有父輩組件指定的props屬性的新建實例來說,這個方法返回的對象可用與為實例設置默認的props值。

getInitalState:
對于組件的每個實例來說,這個方法調用次數有且僅有一次,這里你將有機會初始化每個實例的state,與getDefaultProps方法不同的是,每次實例創建時該方法都會被調用一次,這個方法中,可以訪問到this.props.

componentWillMount:
該方法在完成首次渲染之前被調用,這也是在render方法調用前可以修改組件state的最后一次機會。

render:
在這里你創建一個虛擬DOM,用來表示組件的輸出,對于一個組件來說,render是唯一一個必需的方法,并且有特定的規則。render方法選要滿足下面幾點:
只能通過this.props和this.state訪問數據。
可以返回null,false或者任何React組件。
只能出現一個頂級組件(不能返回一組元素)、
必須純凈,有位置不能改變組件狀態或者修改DOM輸出。

componentDidMount:
在render方法成功調用并且真實的DOM已經被渲染之后,可以在componentDidMount內部通過this.getDOMNode(方法訪問到它。
這就是你可以訪問原始DOM的生命周期的鉤子函數,當你需要測量DOM元素的高度或者使用計時器操作它或者運行jQuery插件時,可以將這些操作掛載到這個方法上:
舉例來說,假設需要在一個通過React渲染出的表單元素上使用jQueryUI的Autocomplete插件,則可以這樣使用它:
//需要自動補全的字符串列表

var datasource =[...];
var MyComponent=React.crateClass({
render:function(){
rerurn <input .../>
},
componentDidMount:function(){
$(this.gerDOMNode()).autocomplete({
source:datasource
});
}
 
});```
 
ps:當React運行在服務器端時候,componentdidmount方法不會被調用。
 
存在期:
此時組件已經渲染好并且用戶可以與它進行交互,通常一次鼠標點擊、手指點按或者鍵盤事件觸發一個時間處理器,隨著用戶改變了組件或則和整個應用的state,便會有新的state流入組件樹,并且我們將會獲得操控它的機會。
 
componentWillReceiveProps:
任何時刻組件的props都可以通過父輩組件來更改,出現這種情況時,componentWillReceiveProps方法會被調用,你將獲得更改props方法及跟他關心state的機會。例如:
```componentWillReceiveProps:function(nextProps){
if(nextProps.checked !==undefined){
this.setState({
checked:nextProps.checked
});
}
 
}```
 
shouleComponentUpdate:
調用shoulecomponentUpadte方法在組件渲染時進行精確優化。如果某個組件或者它的任何子組件不需要渲染成新的props或則和state,則該方法返回false,返回false則是說明React要跳到render方法,一屆位于render前后的鉤子函數:componentWillUpadate和componentDidUpdate。
該方法非必需的,并且大部分情況沒有必要使用它。
 
componentWillUpdate:
和componentwillMount:方法類似,組建會在收到新的props或者state進行渲染之前調用該方法。
注意:你不可以在該方法中更新huo或者props。而應該借助componentWillreceiveProps方法在運行時更新state。
 
componentDidUpdate:
和componentDidMount方法類似,該方法給我們更新已經渲染好的DOM機會。
 
 
銷毀&清理期
當React使用完一個組件,這個組件必須從DOM中卸載隨后被銷毀。此時僅有的一個狗子函數會做出響應,完成所有的清理和銷毀工作。
componentWillUnmount:
最后,隨著組件從他的層級結構中移除,這個組件的生命也就走id熬了盡頭,該方法會在組件被移除之前調用,讓你有機會做一些清理工作。在componentDidMount方法中添加的所有任務都需要在該方法中撤銷,比如穿件的定時器或者添加的事件監聽器。
 
反模式:把計算后的值賦值給state:
getInitalState方法中,嘗試通過this.props來創建state的做法是一種反模式。React專注于維護數據的單一來源。它的設計使得傳遞數據的來源更加顯而易見,這激素和iReact的一個優勢。
比如在組件中吧日期轉化成字符串形式,或者渲染之前字符串轉換為大寫。這些都不是state,只能夠在渲染時進行計算。
當組件的state值和它基于的prop不同步,因而無法了解到render函數內部結構時,可以認定為一種反模式。
//反模式:經過計算后值不應該賦給state
```getDefaultProps:function(){
return{
date:newDate()
};
},
getInitalState:function(){
return{
day:this.props.date.getDay()
}
},
render:function(){
return <div>Day:{this.state.day}</day>
}```
 
正確的模式應該是渲染時計算這些值,保證了計算后的值永遠不會派生出它的props值不同步。
 
```//渲染時計算值是正確的
gerDefaultProps:function(){
return{
date:new Date()
};
}
render:function(){
var day = this.props.date.getDay();
return <div>Day:{day}</div>;
}```
 
然而,如果你的目的并不是同步,而只是簡單的初始化state,那么在getInitialState方法中使用props是沒問題的,只是一定要明確你的意圖,比如prop添加initial前綴。
```getDefaultProps:function(){
return{
initialValue:'some-dafault-value'
};
},
getInitialState:function(){
return{
value:this.props.initialValue
};
},
render:function(){
return <div>{this.props.value}</div>
}```
 
總結:
react生命周期提供了進行設計的鉤子函數,會伴隨著組件整個生命周期。和狀態機類似,每個組件都被設計成了能夠在整個生命周期中輸出穩定、語義化的標簽。
組件不會獨立存,隨著父組件將props推送給他們的子組件,以及那些子組件渲染它們自身的子組件你必須謹慎的考慮數據是如何流經整個應用的。。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,698評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,202評論 3 426
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,742評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,580評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,297評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,688評論 1 327
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,693評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,875評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,438評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,183評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,384評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,931評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,612評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,022評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,297評論 1 292
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,093評論 3 397
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,330評論 2 377

推薦閱讀更多精彩內容