溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

React組件的常用生命周期函數(shù)怎么使用

發(fā)布時(shí)間:2022-08-15 16:13:33 來(lái)源:億速云 閱讀:209 作者:iii 欄目:開(kāi)發(fā)技術(shù)

這篇文章主要介紹了React組件的常用生命周期函數(shù)怎么使用的相關(guān)知識(shí),內(nèi)容詳細(xì)易懂,操作簡(jiǎn)單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇React組件的常用生命周期函數(shù)怎么使用文章都會(huì)有所收獲,下面我們一起來(lái)看看吧。

1. 概述

  • 意義:組件的生命周期有助于理解組件的運(yùn)行方式、完成更復(fù)雜的組件功能、分析組件錯(cuò)誤原因等。

  • 組件的生命周期:組件從被創(chuàng)建到掛載到頁(yè)面中運(yùn)行,再到組件不用時(shí)卸載的過(guò)程。

  • 生命周期的每個(gè)階段總是伴隨著一些方法調(diào)用,這些方法就是生命周期的鉤子函數(shù)。

  • 鉤子函數(shù)的作用:為開(kāi)發(fā)人員在不同階段操作組件提供了時(shí)機(jī)。

  • 只有類組件才有生命周期。

2. 生命周期的三個(gè)階段

  • 每個(gè)階段的執(zhí)行時(shí)機(jī)

  • 每個(gè)階段鉤子函數(shù)的執(zhí)行順序

  • 每個(gè)階段鉤子函數(shù)的作用

2.1. 創(chuàng)建時(shí)(掛載階段)

  • 執(zhí)行時(shí)機(jī):組件創(chuàng)建時(shí)(頁(yè)面加載時(shí))

  • 執(zhí)行順序:constructor() -> render() -> componentDidMount()

  • 鉤子函數(shù)的作用:

鉤子函數(shù)觸發(fā)時(shí)機(jī)作用
constructor創(chuàng)建組件時(shí),最先執(zhí)行1.初始化state 2.為事件處理程序綁定 this
render每次組件渲染都會(huì)觸發(fā)渲染 UI (注意:不能調(diào)用setState())
componentDidMount組件掛載(完成 DOM 渲染)后1.發(fā)送網(wǎng)絡(luò)請(qǐng)求 2.DOM 操作
// 導(dǎo)入ract
import React from 'react'
import ReactDOM from 'react-dom'

class App extends React.Component {
  constructor(props) {
    super(props)

    // 1.初始化state
    this.state = {
      count: 0
    }

    // 2.解決事件處理程序this指向問(wèn)題
    this.handleClick = this.handleClick.bind(this)

    console.warn('生命周期鉤子函數(shù):constructor')
  }
  componentDidMount() {
    // 1.發(fā)送ajax請(qǐng)求,獲取遠(yuǎn)程數(shù)據(jù)
    // axios.get('http://api....')

    // 2.進(jìn)行DOM操作
    const title = document.getElementById('title')
    console.log(title)

    console.warn('生命周期鉤子函數(shù):componentDidMount')
  }

  // 事件處理程序
  handleClick() {
    this.setState({
      count: 1
    })
  }

  render() {
    console.warn('生命周期鉤子函數(shù):render')

    // 錯(cuò)誤演示(不能調(diào)用setState())
    // this.setState({
    //   count: 2
    // })

    return (
      <div>
        <h2 id='title'>統(tǒng)計(jì)豆豆被打的次數(shù):{this.state.count}</h2>
        <button id='btn' onClick={this.handleClick}>打豆豆</button>
      </div>
    )
  }
}
ReactDOM.render(<App />, document.getElementById('root'))

2.2. 更新時(shí)(更新階段)

  • 執(zhí)行時(shí)機(jī):setState()、forceUpdate()、組件接收到新的props。

  • 說(shuō)明:以上任意一種變化,組件就會(huì)重新渲染。

  • 執(zhí)行順序:render() -> componentDidUpdate()

鉤子函數(shù)觸發(fā)時(shí)機(jī)作用
render每次組件渲染都會(huì)觸發(fā)渲染 UI (與掛載階段是同一個(gè)render)
componentDidUpdate組件更新(完成 DOM 渲染)后1.發(fā)送網(wǎng)絡(luò)請(qǐng)求 2.DOM 操作 注意:如果要 setState() 必須放在一個(gè)if條件中
// 導(dǎo)入ract
import React from 'react'
import ReactDOM from 'react-dom'

// 父組件
class App extends React.Component {
  constructor(props) {
    super(props)

    this.state = {
      count: 0
    }
  }

  // 事件處理程序
  handleClick = () => {
    // 執(zhí)行時(shí)機(jī):setState()
    this.setState({
      count: this.state.count + 1
    })

    // 執(zhí)行時(shí)機(jī):強(qiáng)制更新
    // this.forceUpdate()
  }

  render() {
    return (
      <div>
        {/* 執(zhí)行時(shí)機(jī):組件接收到新的props */}
        <ShowCount count={this.state.count} />
        <button onClick={this.handleClick}>打豆豆</button>
      </div>
    )
  }
}

// 子組件
class ShowCount extends React.Component {
  render() {
    console.warn('組件ShowCount的生命周期鉤子函數(shù):render')
    return (<h2 id='title'>統(tǒng)計(jì)豆豆被打的次數(shù):{this.props.count}</h2>)
  }

  // 注意:如果要調(diào)用 setState() 更新?tīng)顟B(tài),必須要放在一個(gè) if 條件中
  // 因?yàn)椋喝绻苯诱{(diào)用 setState(),也會(huì)導(dǎo)致遞歸更新!?。?
  componentDidUpdate(prevProps) {
    // componentDidUpdate的作用:獲取DOM
    const title = document.getElementById('title')
    console.log(title)

    // 正確做法:比較更新前后的props是否相同,來(lái)決定是否重新渲染組件
    console.log('上一次的props:', prevProps, ',當(dāng)前的props:', this.props)
    if (prevProps.count !== this.props.count) {
      this.setState({})

      // componentDidUpdate的作用:發(fā)送ajax請(qǐng)求數(shù)據(jù)
      // axios.get('http://api....')
    }

    // 錯(cuò)誤演示
    // this.setState({})

    console.warn('組件ShowCount的生命周期鉤子函數(shù):componentDidUpdate')
  }
}
ReactDOM.render(<App />, document.getElementById('root'))

2.3. 卸載時(shí)(卸載階段)

執(zhí)行時(shí)機(jī):組件從頁(yè)面中消失

鉤子函數(shù)觸發(fā)時(shí)機(jī)作用
componentWillUnmount組件卸載(從頁(yè)面中消失)執(zhí)行清理工作(比如:清理定時(shí)器等)
// 導(dǎo)入ract
import React from 'react'
import ReactDOM from 'react-dom'

// 父組件
class App extends React.Component {
  constructor(props) {
    super(props)

    this.state = {
      count: 0
    }
  }

  // 事件處理程序
  handleClick = () => {
    this.setState({
      count: this.state.count + 1
    })
  }

  render() {
    return (
      <div>
        {
          this.state.count > 5 ? <p>豆豆被打死了</p> : <ShowCount count={this.state.count} />
        }
        <button onClick={this.handleClick}>打豆豆</button>
      </div>
    )
  }
}

// 子組件
class ShowCount extends React.Component {
  componentDidMount() {
    this.timerId = setInterval(() => {
      console.log('定時(shí)器正在執(zhí)行~')
    }, 500)
  }

  render() {
    return (<h2 id='title'>統(tǒng)計(jì)豆豆被打的次數(shù):{this.props.count}</h2>)
  }

  componentWillUnmount() {
    console.warn('組件ShowCount的生命周期鉤子函數(shù):componentWillUnmount')

    // 清理定時(shí)器
    clearInterval(this.timerId)
  }

}
ReactDOM.render(<App />, document.getElementById('root'))

關(guān)于“React組件的常用生命周期函數(shù)怎么使用”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對(duì)“React組件的常用生命周期函數(shù)怎么使用”知識(shí)都有一定的了解,大家如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI