React native之路(十一)ReactNative組件的生命周期

在Android中Activity有七個生命周期方法,ReactNative組件也不例外,合理調用這些生命周期方法是每個項目合理開發(fā)的關鍵。先來看看RN組件的生命周期方法流程圖:


ReactNative組件生命周期.jpg

開始介紹之前我們先看一下RN中如何在控制臺顯示打印的調試信息。
RN中通過console.log();可以用來打印調試信息,在需要調試的地方加入

console.log('需要顯示的具體信息');

即可。

運行程序后搖一搖手機
會出現(xiàn)以下菜單

device-2017-05-10-132831.png

選擇第二項Debug JS Remotely 。
打開瀏覽器并打開開發(fā)者控制臺,在控制臺窗口下即可查看輸出的信息,如下圖所示:

下面來分析生命周期方法

(1)getDefaultProps()

在組件創(chuàng)建之前,會先調用 getDefaultProps() ,這是全局調用一次,嚴格地來說,這不是組件的生命周期的一部分。在組件被創(chuàng)建并加載候,首先調用 getInitialState() ,來初始化組件的狀態(tài)。并且當你調用這個方法時會提示你

就是說如果需要定義默認屬性得通過

static defaultProps = {
};

方式來定義。

getInitialState也是這樣

所以如果要定義state建議在constructor(props) 中來初始化組件的狀態(tài)。

(2)componentWillMount()

這個函數(shù)調用時機是在組件創(chuàng)建,并初始化了狀態(tài)之后,在第一次繪制 render() 之前。可以在這里做一些業(yè)務初始化操作,也可以設置組件狀態(tài)。這個函數(shù)在整個生命周期中只被調用一次。

(3)componentDidMount()

在組件第一次繪制之后,會調用 componentDidMount(),通知組件已經(jīng)加載完成。這個函數(shù)調用的時候,其虛擬 DOM 已經(jīng)構建完成,你可以在這個函數(shù)開始獲取其中的元素或者子組件了。需要注意的是,RN 框架是先調用子組件的 componentDidMount(),然后調用父組件的函數(shù)。從這個函數(shù)開始,就可以和 JS 其他框架交互了,例如設置計時 setTimeout 或者 setInterval,或者發(fā)起網(wǎng)絡請求。這個函數(shù)也是只被調用一次。這個函數(shù)之后,就進入了穩(wěn)定運行狀態(tài),等待事件觸發(fā)。

(4)componentWillReceiveProps(nextProps)

如果組件收到新的屬性(props),就會調用該方法。參數(shù) nextProps 是即將被設置的屬性,舊的屬性還是可以通過 this.props 來獲取。在這個回調函數(shù)里面,你可以根據(jù)屬性的變化,通過調用 this.setState() 來更新你的組件狀態(tài),這里調用更新狀態(tài)是安全的,并不會觸發(fā)額外的 render() 調用。

(5)shouldComponentUpdate(nextProps,nextState)

當組件接收到新的屬性和狀態(tài)改變的話,都會觸發(fā)調用該方法。參數(shù) nextProps 和上面的 componentWillReceiveProps 函數(shù)一樣,nextState 表示組件即將更新的狀態(tài)值。這個函數(shù)的返回值決定是否需要更新組件,如果 true 表示需要更新,繼續(xù)走后面的更新流程。否者,則不更新,直接進入等待狀態(tài)。
默認情況下,這個函數(shù)永遠返回 true 用來保證數(shù)據(jù)變化的時候 UI 能夠同步更新。在大型項目中,你可以自己重載這個函數(shù),通過檢查變化前后屬性和狀態(tài),來決定 UI 是否需要更新,能有效提高應用性能。

(6)componentWillUpdate(nextProps,nextState)

如果組件狀態(tài)或者屬性改變,并且上面的 shouldComponentUpdate(...) 返回為 true,就會開始準更新組件,并調用該方法。輸入?yún)?shù)與 shouldComponentUpdate 一樣,在這個回調中,可以做一些在更新界面之前要做的事情。需要特別注意的是,在這個函數(shù)里面,你就不能使用 this.setState 來修改狀態(tài)。這個函數(shù)調用之后,就會把 nextProps 和 nextState 分別設置到 this.props 和 this.state 中。緊接著這個函數(shù),就會調用 render() 來更新界面了。

(7)componentDidUpdate(prevProps,prevState)

調用了 render() 更新完成界面之后,會調用該方法來得到通知,因為到這里已經(jīng)完成了屬性和狀態(tài)的更新了,此函數(shù)的輸入?yún)?shù)變成了 prevProps 和 prevState。

(8)componentWillUnmount()

當組件要被從界面上移除的時候,就會調用 該方法。在這個函數(shù)中,可以做一些組件相關的清理工作,例如取消計時器、網(wǎng)絡請求等。

(9)constructor(props)

初始化時調用一次,并且是在componentWillMount()之前調用。

完整調試代碼如下:

import React, { Component } from 'react';
import {
  AppRegistry,
  StyleSheet,
  Text,
  Alert,
  Button,
  View
} from 'react-native';



export default class LifeCycle extends Component {

   constructor(props) {
    console.log('constructor');
    super(props);
    this.state = {num: 1,}
  }

  // getDefaultProps(){
  //   console.log('getDefaultProps');
  // }

  // getInitialState(){
  //   console.log('getInitialState');
  // }

  componentWillMount(){
    console.log('componentWillMount');
    this.onButtonPressed=this._onButtonPressed.bind(this);
  }

  componentDidMount(){
    console.log('componentDidMount');
  }

  componentWillReceiveProps(nextProps) {
    console.log('componentWillReceiveProps');
  }

  shouldComponentUpdate(nextProps,nextState){
    console.log('shouldComponentUpdate');
    return true;
  }

  componentWillUpdate(nextProps,nextState){
    console.log('componentWillUpdate');
  }

  componentDidUpdate(prevProps,prevState){
    console.log('componentDidUpdate');
  }

  componentWillUnmount(){
    console.log('componentWillUnmount');
  }



  _onButtonPressed(){
      this.setState({num:this.state.num+1});
  };

  render() {
    console.log('render');
    return (
      <View style={{margin:32}}>
        <Button style={{width:512,height:48}}title="按鈕" color="#841584"onPress={this.onButtonPressed}/>
      </View>
    );
  }
}

AppRegistry.registerComponent('LifeCycle', () => LifeCycle);
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,763評論 6 539
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,238評論 3 428
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,823評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,604評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,339評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,713評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,712評論 3 445
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,893評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,448評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,201評論 3 357
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,397評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,944評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,631評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,033評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,321評論 1 293
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,128評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,347評論 2 377

推薦閱讀更多精彩內容