ReactNative從零開始筆記2-組件的生命周期

一宪潮、使用環(huán)境

  • Mac 電腦 系統(tǒng)10.14.2
  • Xcode9.4
  • react-native-cli版本 2.0.1
  • react-native: 0.57.3
  • webstorm
二、ReactNative提供了哪些組件

更多組件使用查看ReactNative組件與API

三尽棕、ReactNative組件的生命周期
  • 任何組件都具有生命周期,而掌握生命周期的流程是我們程序搬運工的基本素質(zhì);
  • ReactNative組件生命周期可大致分為三個階段創(chuàng)建、運行滔悉、銷毀
1.創(chuàng)建階段,組件實例化階段

調(diào)用順序如下:

1.1 在實例化組件的時候調(diào)用構(gòu)造函數(shù)constructor

  • 調(diào)用一次
  • 可以初始化數(shù)據(jù)state
  • 注意需要加 super.props(); 初始化父類

//1.初始化調(diào)用 一次
constructor(props) {
    super(props);
    this.state = {
        age: 0,
        name: '生命周期',
    }
    console.warn('調(diào)用constructor');
}

1.2 即將加載組件的時候調(diào)用 componentWillMount

  • 調(diào)用一次
  • render()之前調(diào)用
  • 該函數(shù)適合于需要在本地讀取一些數(shù)據(jù)用于顯示

  //2.即將加載組件調(diào)用 一次
componentWillMount(): void {
    console.warn('調(diào)用componentWillMount');
}

1.3 渲染組件render

  • 多次調(diào)用
  • 對state變量與屬性進行檢查, 重新渲染時候調(diào)用這個方法
  • 如果不想渲染頁面,可以返回null 或者false

//3.渲染組件調(diào)用  多次
render() {
     console.warn('調(diào)用render()');
    return (
        <View>
            <Button title={'刷新頁面'} onPress={()=>{
                this.changeAgeEvent();
            }}></Button>
            <Text>年齡:{this.state.age}</Text>
        </View>
    )
}

1.4 加載組件完成的時候調(diào)用componentDidMount

  • render()之后,調(diào)用一次
  • 一般可以用作發(fā)送網(wǎng)絡(luò)請求

 // 4.組件加載完成調(diào)用 一次
componentDidMount(): void {
    console.warn('調(diào)用componentDidMount');
}

創(chuàng)建階段效果:

image.png
2. 運行階段

2.1 componentWillReceiveProps

  • 當props(屬性)發(fā)生改變或者接受到新的props時回官,該函數(shù)被調(diào)用,并接受一個輸入?yún)?shù)笛坦,類型為Object苔巨,存放新的props,可以通過this.props訪問
  • 作用: 攔截props屬性并操作
  • 在這個函數(shù)中改變state, 不會立即渲染,需等方法執(zhí)行完畢一起渲染

 //5.改變屬性時候調(diào)用props 
componentWillReceiveProps(nextProps: Readonly<P>, nextContext: any): void {
    console.warn('調(diào)用componentWillReceiveProps');
}

2.2 shouldComponentUpdate

  • 需要刷新組件的時候,比如改變props/state時候調(diào)用
  • 控制是否刷新組件,調(diào)用render(), 返回false不調(diào)用
  • 如果不進行渲染侄泽,那么該方法后續(xù)的componentWillUpdate與componentDidUpdate都不會被執(zhí)行
  • 系統(tǒng)默認是true

  // 6.需要刷新組件的時候調(diào)用,比如改變props/state 控制是否刷新組件
shouldComponentUpdate(nextProps: Readonly<P>, nextState: Readonly<S>, nextContext: any): boolean {
    console.warn('shouldComponentUpdate');
    return true;
 }

2.3 componentWillUpdate

  • 組件即將更新時候調(diào)用
  • shouldComponentUpdate返回true 才會調(diào)用
  • 盡量不要調(diào)用this.setState()與改變props,易造成死循環(huán)

  // 7.組件即將刷新
componentWillUpdate(nextProps: Readonly<P>, nextState: Readonly<S>, nextContext: any): void {
    console.warn('調(diào)用componentWillUpdate');
}

2.4 componentDidUpdate

  • 在重新渲染render之后調(diào)用
  • shouldComponentUpdate返回true 才會調(diào)用
  • 盡量不要調(diào)用this.setState()與改變props,易造成死循環(huán)

  // 8. 組件刷新之后
componentDidUpdate(prevProps: Readonly<P>, prevState: Readonly<S>, snapshot: SS): void {
    console.warn('調(diào)用componentDidUpdate');
}

運行階段調(diào)用效果


image.png
3. 銷毀/卸載組件階段

componentWillUnmount

  • 組件即將銷毀的時候調(diào)用
  • 作用: 移除觀察者,清楚數(shù)據(jù)等

  //9. 組件即將銷毀的時候調(diào)用, 清楚數(shù)據(jù)
componentWillUnmount(): void {
    console.warn('調(diào)用componentWillUnmount');
}
4.其他方法

componentDidCatch

  • render函數(shù)渲染出錯,調(diào)用該函數(shù)
  • 作用: 收集錯誤信息

//10. render出錯調(diào)用該函數(shù) 
componentDidCatch(error: Error, errorInfo: React.ErrorInfo): void {
    console.warn('調(diào)用componentDidCatch')
}
5.生命周期完整流程
image.png

完整生命周期代碼

  class LifeCycleComponent extends Component {
 //1.初始化調(diào)用 一次
constructor(props) {
    super(props);
    this.state = {
        age: 0,
        name: '生命周期',
    }
    console.warn('調(diào)用constructor');
}
//2.即將加載組件調(diào)用 一次
componentWillMount(): void {
    console.warn('調(diào)用componentWillMount');
}

//3.渲染組件調(diào)用  多次
render() {
     console.warn('調(diào)用render()');
    return (
        <View>
            <Button title={'刷新頁面'} onPress={()=>{
                this.changeAgeEvent();
            }}></Button>
            <Text>年齡:{this.state.age}</Text>
        </View>
    )
}

// 4.組件加載完成調(diào)用 一次
componentDidMount(): void {
    console.warn('調(diào)用componentDidMount');
}

// 方法 改變state age
changeAgeEvent(){
    //按鈕點擊一次  改變狀態(tài)中age的值,進行一次render()
    this.setState((prevState, callback)=>{
        return{age: prevState.age +1}
    });
}

//5.改變屬性時候調(diào)用props 沒有順序
componentWillReceiveProps(nextProps: Readonly<P>, nextContext: any): void {
    console.warn('調(diào)用componentWillReceiveProps');
}

// 6.需要刷新組件的時候調(diào)用,比如改變props/state 控制是否刷新組件
shouldComponentUpdate(nextProps: Readonly<P>, nextState: Readonly<S>, nextContext: any): boolean {
    console.warn('調(diào)用shouldComponentUpdate');
    return true;
}

// 7.組件即將刷新
componentWillUpdate(nextProps: Readonly<P>, nextState: Readonly<S>, nextContext: any): void {
    console.warn('調(diào)用componentWillUpdate');
}

// 8. 組件刷新之后
componentDidUpdate(prevProps: Readonly<P>, prevState: Readonly<S>, snapshot: SS): void {
    console.warn('調(diào)用componentDidUpdate');
}

//9. 組件即將銷毀的時候調(diào)用, 清楚數(shù)據(jù)
componentWillUnmount(): void {
    console.warn('調(diào)用componentWillUnmount');
}
//10. render出錯調(diào)用該函數(shù)
componentDidCatch(error: Error, errorInfo: React.ErrorInfo): void {
    console.warn('調(diào)用componentDidCatch')
}

}
其他資料
ReactNative從零開始筆記1-初始化項目
ReactNative從零開始筆記2-組件的生命周期
ReactNative從零開始筆記3-state(狀態(tài))與props(屬性)
ReactNative從零開始筆記4-PropTypes使用
ReactNative從零開始筆記5-組件傳值(父子組件/兄弟組件)
ReactNative從零開始筆記6-導(dǎo)航頁面?zhèn)髦担ㄕ齻骱湍鎮(zhèn)鳎?/a>

  • 序言:七十年代末肖方,一起剝皮案震驚了整個濱河市未状,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌娩践,老刑警劉巖烹骨,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異吨岭,居然都是意外死亡峦树,警方通過查閱死者的電腦和手機辣辫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門魁巩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人葬馋,你說我怎么就攤上這事肾扰〕胨唬” “怎么了集晚?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蒋院。 經(jīng)常有香客問我条摸,道長悦污,這世上最難降的妖魔是什么钉蒲? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮踏枣,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘茵瀑。我一直安慰自己,他們只是感情好马昨,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著屹篓,像睡著了一般匙奴。 火紅的嫁衣襯著肌膚如雪堆巧。 梳的紋絲不亂的頭發(fā)上泼菌,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天,我揣著相機與錄音荒揣,去河邊找鬼笋颤。 笑死乳附,一個胖子當著我的面吹牛伴澄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播非凌,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼敞嗡,長吁一口氣:“原來是場噩夢啊……” “哼颁糟!你這毒婦竟也來了喉悴?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤婚脱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后障贸,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡篮洁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年袁波,在試婚紗的時候發(fā)現(xiàn)自己被綠了瓦阐。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片篷牌。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出叫倍,到底是詐尸還是另有隱情,我是刑警寧澤吆倦,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站晌梨,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏仔蝌。R本人自食惡果不足惜荒吏,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望绰更。 院中可真熱鬧,春花似錦儡湾、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽妒穴。三九已至宋税,卻和暖如春讼油,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背矮台。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留辰晕,地道東北人确虱。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像校辩,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子宜咒,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容