初識react之生命周期

組件的生命周期

  • 簡單說:一個組件從開始到最后消亡所經(jīng)歷的各種狀態(tài)揭芍,就是一個組件的生命周期

組件生命周期函數(shù)的定義:從組件被創(chuàng)建,到組件掛載到頁面上運行,再到頁面關(guān)閉組件被卸載,這三個階段總是伴隨著組件各種各樣的事件包蓝,那么這些事件驶社,統(tǒng)稱為組件的生命周期函數(shù)!

組件生命周期函數(shù)總覽

  • 組件的生命周期包含三個階段:創(chuàng)建階段(Mounting)、運行和交互階段(Updating)腕唧、卸載階段(Unmounting)
  • Mounting:

constructor()
componentWillMount()
render()
componentDidMount()

  • Updating

componentWillReceiveProps()
shouldComponentUpdate()
componentWillUpdate()
render()
componentDidUpdate()

  • Unmounting

componentWillUnmount()

組件生命周期 - 創(chuàng)建階段(Mounting)

  • 特點:該階段的函數(shù)只執(zhí)行一次

constructor()

class Greeting extends React.Component {
  constructor(props) {
    // 獲取 props
    super(props)
    // 初始化 state
    this.state = {
      count: props.initCount
    }
  }
}

// 初始化 props
// 語法:通過靜態(tài)屬性 defaultProps 來初始化props
Greeting.defaultProps = {
  initCount: 0
};

componentWillMount()

  • 說明:組件被掛載到頁面之前調(diào)用或辖,其在render()之前被調(diào)用,因此在這方法里同步地設(shè)置狀態(tài)將不會觸發(fā)重渲染
  • 注意:無法獲取頁面中的DOM對象
  • 注意:可以調(diào)用 setState() 方法來改變狀態(tài)值
  • 用途:發(fā)送ajax請求獲取數(shù)據(jù)
componentWillMount() {
  console.warn(document.getElementById('btn')) // null
  this.setState({
    count: this.state.count + 1
  })
}

render()

  • 作用:渲染組件到頁面中枣接,無法獲取頁面中的DOM對象

  • 注意:不要在render方法中調(diào)用 setState() 方法颂暇,否則會遞歸渲染

    • 原因說明:狀態(tài)改變會重新調(diào)用render()render()又重新改變狀態(tài)
render() {
  console.warn(document.getElementById('btn')) // null

  return (
    <div>
      <button id="btn" onClick={this.handleAdd}>打豆豆一次</button>
      {
        this.state.count === 4
        ? null
        : <CounterChild initCount={this.state.count}></CounterChild>
      }
    </div>
  )
}

componentDidMount()

  • 1 組件已經(jīng)掛載到頁面中
  • 2 可以進行DOM操作但惶,比如:獲取到組件內(nèi)部的DOM對象
  • 3 可以發(fā)送請求獲取數(shù)據(jù)
  • 4 可以通過 setState() 修改狀態(tài)的值
  • 注意:在這里修改狀態(tài)會重新渲染
componentDidMount() {
  // 此時耳鸯,就可以獲取到組件內(nèi)部的DOM對象
  console.warn('componentDidMount', document.getElementById('btn'))
}

組件生命周期 - 運行階段(Updating)

  • 特點:該階段的函數(shù)執(zhí)行多次
  • 說明:每當組件的props或者state改變的時候,都會觸發(fā)運行階段的函數(shù)

componentWillReceiveProps()

  • 說明:組件接受到新的props前觸發(fā)這個方法
  • 參數(shù):當前組件props
  • 可以通過 this.props 獲取到上一次的值
  • 使用:若你需要響應(yīng)屬性的改變膀曾,可以通過對比this.propsnextProps并在該方法中使用this.setState()處理狀態(tài)改變
  • 注意:修改state不會觸發(fā)該方法
componentWillReceiveProps(nextProps) {
  console.warn('componentWillReceiveProps', nextProps)
}

shouldComponentUpdate()

  • 作用:根據(jù)這個方法的返回值決定是否重新渲染組件县爬,返回true重新渲染,否則不渲染
  • 優(yōu)勢:通過某個條件渲染組件妓肢,降低組件渲染頻率捌省,提升組件性能
  • 說明:如果返回值為false苫纤,那么碉钠,后續(xù)render()方法不會被調(diào)用
  • 注意:這個方法必須返回布爾值!>砭小喊废!
  • 場景:根據(jù)隨機數(shù)決定是否渲染組件
// - 參數(shù):
//   - 第一個參數(shù):最新屬性對象
//   - 第二個參數(shù):最新狀態(tài)對象
shouldComponentUpdate(nextProps, nextState) {
  console.warn('shouldComponentUpdate', nextProps, nextState)

  return nextState.count % 2 === 0
}

componentWillUpdate()

  • 作用:組件將要更新
  • 參數(shù):最新的屬性和狀態(tài)對象
  • 注意:不能修改狀態(tài) 否則會循環(huán)渲染
componentWillUpdate(nextProps, nextState) {
  console.warn('componentWillUpdate', nextProps, nextState)
}

render() 渲染

  • 作用:重新渲染組件,與Mounting階段的render是同一個函數(shù)
  • 注意:這個函數(shù)能夠執(zhí)行多次栗弟,只要組件的屬性或狀態(tài)改變了污筷,這個方法就會重新執(zhí)行

componentDidUpdate()

  • 作用:組件已經(jīng)被更新
  • 參數(shù):舊的屬性和狀態(tài)對象
componentDidUpdate(prevProps, prevState) {
  console.warn('componentDidUpdate', prevProps, prevState)
}

組件生命周期 - 卸載階段(Unmounting)

  • 組件銷毀階段:組件卸載期間,函數(shù)比較單一乍赫,只有一個函數(shù)瓣蛀,這個函數(shù)也有一個顯著的特點:組件一輩子只能執(zhí)行依次!
  • 使用說明:只要組件不再被渲染到頁面中雷厂,那么這個方法就會被調(diào)用( 渲染到頁面中 -> 不再渲染到頁面中 )

componentWillUnmount()

  • 作用:在卸載組件的時候惋增,執(zhí)行清理工作,比如

    • 1 清除定時器
    • 2 清除componentDidMount創(chuàng)建的DOM對象

本文引自部分* React入門看這篇就夠了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末改鲫,一起剝皮案震驚了整個濱河市诈皿,隨后出現(xiàn)的幾起案子林束,更是在濱河造成了極大的恐慌,老刑警劉巖稽亏,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件壶冒,死亡現(xiàn)場離奇詭異,居然都是意外死亡截歉,警方通過查閱死者的電腦和手機胖腾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瘪松,“玉大人胸嘁,你說我怎么就攤上這事×构洌” “怎么了性宏?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長状飞。 經(jīng)常有香客問我毫胜,道長,這世上最難降的妖魔是什么诬辈? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任酵使,我火速辦了婚禮,結(jié)果婚禮上焙糟,老公的妹妹穿的比我還像新娘口渔。我一直安慰自己,他們只是感情好穿撮,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布缺脉。 她就那樣靜靜地躺著,像睡著了一般悦穿。 火紅的嫁衣襯著肌膚如雪攻礼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天栗柒,我揣著相機與錄音礁扮,去河邊找鬼。 笑死瞬沦,一個胖子當著我的面吹牛太伊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播逛钻,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼僚焦,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了绣的?” 一聲冷哼從身側(cè)響起叠赐,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤欲账,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后芭概,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赛不,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年罢洲,在試婚紗的時候發(fā)現(xiàn)自己被綠了踢故。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡惹苗,死狀恐怖殿较,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情桩蓉,我是刑警寧澤淋纲,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站院究,受9級特大地震影響洽瞬,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜业汰,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一伙窃、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧样漆,春花似錦为障、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至舞竿,卻和暖如春京景,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背骗奖。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留醒串,地道東北人执桌。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像芜赌,于是被迫代替她去往敵國和親仰挣。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

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