最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

React生命周期函數(shù)深入全面介紹

 更新時間:2022年09月29日 14:20:02   作者:月光曬了很涼快  
生命周期函數(shù)指在某一時刻組件會自動調(diào)用并執(zhí)行的函數(shù)。React每個類組件都包含生命周期方法,以便于在運行過程中特定的階段執(zhí)行這些方法

1. 注意

函數(shù)組件無生命周期,生命周期只有類組件才擁有。

2. 圖解

完整的生命周期主要為三個部分,分別為掛載時、更新時和卸載時,如下圖所示:

3. 生命周期函數(shù)

3.1 constructor構(gòu)造函數(shù)

描述:

React 組件的構(gòu)造函數(shù)在掛載之前被調(diào)用。在實現(xiàn) React.Component 構(gòu)造函數(shù)時,需要先在添加其它內(nèi)容前,調(diào)用 super(props),用來將父組件傳來的 props 綁定到繼承類中。

構(gòu)造函數(shù)它只執(zhí)行1次,可以進(jìn)行數(shù)據(jù)初始化操作,因為它是所有的生命周期中第1個被執(zhí)行的方法,但是不太建議在此方法中進(jìn)行網(wǎng)絡(luò)請求。

父組件的構(gòu)造方法先執(zhí)行,子組件的構(gòu)造方法后執(zhí)行。

語法:

constructor(props) {
    // 如果你在定義組件中有定義構(gòu)造函數(shù),則一定要調(diào)用super方法來調(diào)用父類的構(gòu)造函數(shù)
    super(props)
    // todo …
}

3.2 static getDerivedStateFromProps(nextProps, prevState)方法

描述:

此方法在構(gòu)造函數(shù)方法之后,Render 方法之前被調(diào)用,并且在初始掛載及后續(xù)更新時都會被調(diào)用。它應(yīng)返回一個對象來更新 state,如果返回 null 則不更新任何內(nèi)容。

此方法適用于罕見的用例,即當(dāng)前組件的 state 的值在任何時候都取決于 props 傳入。

語法:

state = {
    num: 0
};
render() {
    return <div>當(dāng)前的num是{this.state.num}</div>;
}
// 從props中獲取數(shù)據(jù),綁定到當(dāng)前的這個組件中的state
// nextProps 父組件傳遞過來的整個props對象,即當(dāng)前最新的props數(shù)據(jù)
// prevState 當(dāng)前組件中的狀態(tài)對象state,即當(dāng)前最新的state數(shù)據(jù),但暫時不包含返回值中要對state修改的值
static getDerivedStateFromProps(nextProps, prevState) { 
     // 不需要更新當(dāng)前state
     return null 
}

注意:

  • 此方法會執(zhí)行 n 次
  • 此方法它是一個靜態(tài)方法,靜態(tài)方法中不能使用 this
  • 使用此方法一定要先定義好 state,否則報錯
  • 此方法必須要有返回值,{}|null,如果返回為對象,則會對 state 中數(shù)據(jù)進(jìn)行操作,返回的對象屬性如果在 state 中沒有則添加,有則修改;如果返回為 null,則不會對 state 進(jìn)行任何操作

getDerivedStateFromProps 在父子組件中執(zhí)行的先后順序,及 nextProps, prevState 的使用:

import React, { Component } from 'react'
class Child extends Component {
  constructor(props) {
    super(props)
    this.state = { num: 100 }
    console.log('child --- constructor')
  }
  // 快捷輸入 gdsfp
  static getDerivedStateFromProps(nextProps, nextState) {
    console.log('child --- getDerivedStateFromProps')
    // nextState: 當(dāng)前最新的state數(shù)據(jù),暫時不包含你返回值中要對state修改的值
    console.log(nextProps, nextState)
    return { name: '張三' }
  }
  render() {
    return (
      <div>
        <h3>Child組件</h3>
      </div>
    )
  }
}
class App extends Component {
  constructor(props) {
    super(props)
    this.state = { age: 1 }
    // 父組件先執(zhí)行后子組件執(zhí)行此方法  app -> child
    console.log('App --- constructor')
  }
  static getDerivedStateFromProps(nextProps, nextState) {
    console.log('App --- getDerivedStateFromProps')
    return null
  }
  render() {
    return (
      <div>
        <Child name='李四' />
      </div>
    )
  }
}
export default App

注意:由于這個方法會執(zhí)行 n 次,所以不建議在這個方法中發(fā)送網(wǎng)絡(luò)請求,容易造成死循環(huán)。如果想要在這個方法中發(fā)送網(wǎng)絡(luò)請求,則一定要確保不要觸發(fā)這個方法再次執(zhí)行(即父組件不發(fā)送新的 props 或修改 props ,不修改 state ,不強(qiáng)制更新視圖)

小案例:

描述:

子組件將 state 中的數(shù)據(jù)修改為 nextProps 中的值,并且點擊增加按鈕能夠觸發(fā)后續(xù)對值的修改。

實現(xiàn):

import React, { Component } from 'react'
class Child extends Component {
  constructor(props) {
    super(props)
    this.state = { name: '張三' }
  }
  // 快捷輸入 gdsfp
  static getDerivedStateFromProps(nextProps, nextState) {
    console.log('child --- getDerivedStateFromProps')
    // 如果你想用此方法,把props中的屬性數(shù)據(jù),追加到state中,后續(xù)能修改,則這樣的操作,你要確保只執(zhí)行1次
    // 這種方式只能接收到父組件第一次值過來的值(10),點擊按鈕子組件age并不會增加
    // 這是因為每次點擊增加按鈕都會觸發(fā)當(dāng)前函數(shù),將state中的age修改為nextProps
    // return nextProps // 這種方式不會觸發(fā)點擊按鈕增加age值
    if (nextState.flag != 1) {
      return { ...nextProps, flag: 1 }
    }
    return null
  }
  render() {
    let { age } = this.state
    return (
      <div>
        <h3>Child組件 -- {age}</h3>
        <button
          onClick={() => {
            this.setState(state => ({ age: state.age + 1 }))
          }}
        >
          ++age++
        </button>
      </div>
    )
  }
}
class App extends Component {
  constructor(props) {
    super(props)
    this.state = { age: 1 }
  }
  render() {
    return (
      <div>
        <Child age={10} />
      </div>
    )
  }
}
export default App

3.3 掛載時和更新時的生命周期函數(shù)執(zhí)行順序

掛載時生命周期函數(shù)介紹:

  • constructor(props)

React組件的構(gòu)造函數(shù)在掛載之前被調(diào)用。在實現(xiàn)React.Component構(gòu)造函數(shù)時,需要先在添加其它內(nèi)容前,調(diào)用super(props),用來將父組件傳來的props綁定到繼承類中。只調(diào)用一次。

  • static getDerivedStateFromProps(nextProps, prevState)

此方法是react16.3之后新增,會在調(diào)用 render 方法之前調(diào)用,并且在初始掛載及后續(xù)更新時都會被調(diào)用。它應(yīng)返回一個對象來更新 state,如果返回 null 則不更新任何內(nèi)容。

此方法適用于罕見的用例,即當(dāng)前組件的 state 的值在任何時候都取決于 props傳入。

  • render()

render()方法是必需的,它主要負(fù)責(zé)組件的渲染,會被重復(fù)調(diào)用若干次

  • componentDidMount

它會在組件掛載后(插入 DOM 樹中)立即調(diào)用。依賴于 DOM 節(jié)點的初始化應(yīng)該放在這里。如需通過網(wǎng)絡(luò)請求獲取數(shù)據(jù),此處是實例化請求的好地方。

  • shouldComponentUpdate(nextProps, nextState)

此函數(shù)將放在下文單獨講解。

  • getSnapshotBeforeUpdate(prevProps, prevState)

在最近一次渲染輸出(提交到 DOM 節(jié)點)之前調(diào)用。它使得組件能在發(fā)生更改之前從 DOM 中捕獲一些信息,此生命周期的任何返回值將作為參數(shù)傳遞給 componentDidUpdate()

  • componentDidUpdate(prevProps, prevState, snapshot)

會在數(shù)據(jù)更新后被立即調(diào)用。首次渲染不會執(zhí)行此方法。

import React, { Component } from 'react'
class Child extends Component {
  constructor(props) {
    super(props)
    this.state = { name: '張三' }
    console.log('child --- constructor')
  }
  // 快捷輸入 gdsfp
  static getDerivedStateFromProps(nextProps, nextState) {
    console.log('child --- getDerivedStateFromProps')
    if (nextState.flag != 1) {
      return { ...nextProps, flag: 1 }
    }
    return null
  }
  // 它只執(zhí)行1次
  // 虛擬dom掛載到真實的頁面點中完成,在此進(jìn)行dom操作
  // 在此可以進(jìn)行網(wǎng)絡(luò)請求
  componentDidMount() {
    console.log('child -- componentDidMount')
  }
  // ------------- 更新時
  // prevProps 修改之前的props數(shù)據(jù)
  // prevState 修改之前的state數(shù)據(jù)
  // 此方法要有一個返回值,且如果有此方法,則必須要有componentDidUpdate
  // 此方法的返回值,會在componentDidUpdate參數(shù)3中接受
  getSnapshotBeforeUpdate(prevProps, prevState) {
    console.log('child --- getSnapshotBeforeUpdate')
    return 100
  }
  // 數(shù)據(jù)更新完畢后執(zhí)行
  componentDidUpdate(prevProps, prevState, snapshot) {
    console.log('child --- componentDidUpdate', snapshot)
  }
  render() {
    console.log('child -- render')
    let { age } = this.state
    return (
      <div>
        <h3>Child組件 -- {age}</h3>
        <button
          onClick={() => {
            this.setState(state => ({ age: state.age + 1 }))
          }}
        >
          ++ Child -- age ++
        </button>
      </div>
    )
  }
}
class App extends Component {
  constructor(props) {
    super(props)
    this.state = { age: 1 }
    console.log('App --- constructor')
  }
  static getDerivedStateFromProps(nextProps, nextState) {
    console.log('App --- getDerivedStateFromProps')
    return null
  }
  componentDidMount() {
    console.log('App -- componentDidMount')
  }
  getSnapshotBeforeUpdate(prevProps, prevState) {
    console.log('App --- getSnapshotBeforeUpdate')
    return 200
  }
  // 數(shù)據(jù)更新完畢后執(zhí)行
  componentDidUpdate(prevProps, prevState, snapshot) {
    console.log('App --- componentDidUpdate', snapshot)
  }
  render() {
    let { age } = this.state
    console.log('App -- render')
    return (
      <div>
        <h3>App組件 -- {age}</h3>
        <Child age={age} />
        <button
          onClick={() => {
            this.setState(state => ({ age: state.age + 1 }))
          }}
        >
          ++ App -- age ++
        </button>
      </div>
    )
  }
}
export default App

掛載時:

更新時:

3.4 componentWillUnmount函數(shù)的使用

描述:

componentWillUnmount() 會在組件卸載及銷毀之前直接調(diào)用。在此方法中執(zhí)行必要的清理操作。

使用:

import React, { Component } from 'react'
class Child extends Component {
  constructor(props) {
    super(props)
    this.state = { name: '張三' }
  }
  // 快捷輸入 gdsfp
  static getDerivedStateFromProps(nextProps, nextState) {
    if (nextState.flag != 1) {
      return { ...nextProps, flag: 1 }
    }
    return null
  }
  // 銷毀組件時執(zhí)行
  componentWillUnmount() {
    console.log('child --- componentWillUnmount')
  }
  render() {
    let { age } = this.state
    return (
      <div>
        <h3>Child組件 -- {age}</h3>
        <button
          onClick={() => {
            this.setState(state => ({ age: state.age + 1 }))
          }}
        >
          ++ Child -- age ++
        </button>
      </div>
    )
  }
}
class App extends Component {
  constructor(props) {
    super(props)
    this.state = { age: 1 }
  }
  getSnapshotBeforeUpdate(prevProps, prevState) {
    console.log('App --- getSnapshotBeforeUpdate')
    return 200
  }
  // 數(shù)據(jù)更新完畢后執(zhí)行
  componentDidUpdate(prevProps, prevState, snapshot) {
    console.log('App --- componentDidUpdate', snapshot)
  }
  render() {
    let { age } = this.state
    return (
      <div>
        <h3>App組件 -- {age}</h3>
        {/* age大于1時銷毀子組件 */}
        {age > 1 ? null : <Child age={age} />}
        <button
          onClick={() => {
            this.setState(state => ({ age: state.age + 1 }))
          }}
        >
          ++ App -- age ++
        </button>
      </div>
    )
  }
}
export default App

3.5 shouldComponentUpdate優(yōu)化渲染方案

描述:

React 的更新機(jī)制導(dǎo)致,即使子組件未發(fā)生更新,只要父組件中的 state 改變,當(dāng)前父組件及其所有子組件都會重新渲染,這樣做雖然很高效,但會造成不少性能損耗,那么該如何避免呢?

當(dāng) props 或 state 發(fā)生變化時,shouldComponentUpdate() 會在渲染執(zhí)行之前被調(diào)用。返回值默認(rèn)為 true 則組件繼續(xù)渲染,為 false 則當(dāng)前組件不會渲染。首次渲染或使用 forceUpdate() 時不會調(diào)用該方法。此方法僅作為性能優(yōu)化的方式而存在。你也可以考慮使用內(nèi)置的 PureComponent 組件,而不是手動編寫 shouldComponentUpdate()。

PureComponent 會對 props 和 state 進(jìn)行淺層比較,并減少了跳過必要更新的可能性。 PureComponent 它可以對于組件無效渲染起到一定的優(yōu)化,但是它只能針對于props中值為基本類型。

所以我們還可以使用生命周期中提供的優(yōu)化方案,使用 shouldComponentUpdate 減少無效渲染次數(shù)。

語法:

shouldComponentUpdate(nextProps, nextState) {
    // 判斷是否需要被渲染,如果需要則返回true,否則返回false 
    if (nextProps.b === this.props.b) {
        return false;
    } else {
        return true;
    }
}
// 簡化方法:只需要將類組件的繼承關(guān)系改成繼承`PureComponent`即可,這樣一來,框架會自動判斷值是否有變化進(jìn)一步?jīng)Q定組件是否需要被渲染。
import React, { PureComponent } from "react";
class Cmp extends PureComponent {
    render() {
        console.log("Cmp被渲染了");
        return <div>父親傳遞過來的值b為:{this.props.b}</div>;
    }
}
export default Cmp

使用:

import React, { Component, PureComponent } from 'react'
// PureComponent 它可以對于組件無效渲染起到一定的優(yōu)化,但是它只能針對于props中值為基本類型
// 可以使用生命周期中提供的優(yōu)化方案,提升無效渲染次數(shù)
// class Child extends PureComponent {
class Child extends Component {
  // 此方法,用于組件重復(fù)渲染的優(yōu)化方法,它不是必須要用的
  // 此方法必須要有一個boolean返回值
  // 此方法只有在更新時才會觸發(fā)
  // true 則繼續(xù)向下渲染  render
  // false 表示當(dāng)前不會繼續(xù)渲染,從而減少無用渲染,提升性能
  // nextProps 最新的props數(shù)據(jù)   this.props 之前的props數(shù)據(jù)
  // nextState 最新的state數(shù)據(jù)   this.state 之前的state數(shù)據(jù)
  shouldComponentUpdate(nextProps, nextState) {
    // 針對于要比較的字段進(jìn)行判斷
    if (this.props.num.data === nextProps.num.data) {
      return false
    }
    return true
  }
  render() {
    console.log('child -- render')
    return (
      <div>
        <h3>{this.props.num.data}</h3>
      </div>
    )
  }
}
class App extends Component {
  state = {
    num: { data: 1 },
    name: '張三'
  }
  render() {
    console.log('app -- render')
    return (
      <div>
        <h3>{this.state.num.data}</h3>
        <Child num={this.state.num} />
		{/* 這時子組件會更新 */}
        {/* <button onClick={() => this.setState({ num: { data: Date.now() } })}>++num++</button> */}
        <button onClick={() => this.setState({ num: { data: 1 } })}>++num++</button>
      </div>
    )
  }
}
export default App

擴(kuò)展:使用lodash庫減小無效渲染

import React, { Component, PureComponent } from 'react'
import _ from 'lodash'
class Child extends Component {
  // 此方法,用于組件重復(fù)渲染的優(yōu)化方法,它不是必須要用的
  // 此方法必須要有一個boolean返回值
  // 此方法只有在更新時才會觸發(fā)
  // true 則繼續(xù)向下渲染  render
  // false 表示當(dāng)前不會繼續(xù)渲染,從而減少無用渲染,提升性能
  shouldComponentUpdate(nextProps, nextState) {
    // 深層比對,它比對的是對象中屬性的值,如果全局的值一樣則為true,否則為false
    return !_.isEqual(this.props, nextProps)
  }
  render() {
    console.log('child -- render')
    return (
      <div>
        <h3>{this.props.num.data}</h3>
      </div>
    )
  }
}
class App extends Component {
  state = {
    num: { data: 1 },
    name: '張三'
  }
  render() {
    console.log('app -- render')
    return (
      <div>
        <h3>{this.state.num.data}</h3>
        <Child num={this.state.num} />
        {/* 這時子組件會更新 */}
        {/* <button onClick={() => this.setState({ num: { data: Date.now() } })}>++num++</button> */}
        <button onClick={() => this.setState({ num: { data: 1 } })}>++num++</button>
      </div>
    )
  }
}
export default App

到此這篇關(guān)于React生命周期函數(shù)深入全面介紹的文章就介紹到這了,更多相關(guān)React生命周期函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • React處理復(fù)雜圖片樣式的方法詳解

    React處理復(fù)雜圖片樣式的方法詳解

    這篇文章主要為大家詳細(xì)介紹了React處理復(fù)雜圖片樣式的方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-04-04
  • React版本18.xx降低為17.xx的方法實現(xiàn)

    React版本18.xx降低為17.xx的方法實現(xiàn)

    由于現(xiàn)在react默認(rèn)創(chuàng)建是18.xx版本,但是我們現(xiàn)在大多使用的還是17.xx或者更低的版本,于是要對react版本進(jìn)行降級,本文主要介紹了React版本18.xx降低為17.xx的方法實現(xiàn),感興趣的可以了解一下
    2023-11-11
  • react路由配置方式詳解

    react路由配置方式詳解

    本篇文章主要介紹了react路由配置方式詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • React中Redux核心原理深入分析

    React中Redux核心原理深入分析

    這篇文章主要介紹了如何在React中Redux原理,目前redux在react中使用是最多的,所以我們需要將之前編寫的redux代碼,融入到react當(dāng)中去,本文給大家詳細(xì)講解,需要的朋友可以參考下
    2022-11-11
  • React中Portals與錯誤邊界處理實現(xiàn)

    React中Portals與錯誤邊界處理實現(xiàn)

    本文主要介紹了React中Portals與錯誤邊界處理實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-07-07
  • react.js組件實現(xiàn)拖拽復(fù)制和可排序的示例代碼

    react.js組件實現(xiàn)拖拽復(fù)制和可排序的示例代碼

    這篇文章主要介紹了react.js組件實現(xiàn)拖拽復(fù)制和可排序的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-08-08
  • 在Create React App中使用CSS Modules的方法示例

    在Create React App中使用CSS Modules的方法示例

    本文介紹了如何在 Create React App 腳手架中使用 CSS Modules 的兩種方式。有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。
    2019-01-01
  • React Native從類組件到函數(shù)組件詳解

    React Native從類組件到函數(shù)組件詳解

    這篇文章主要介紹了React Native從類組件到函數(shù)組件方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • 官方推薦react-navigation的具體使用詳解

    官方推薦react-navigation的具體使用詳解

    本篇文章主要介紹了官方推薦react-navigation的具體使用詳解,react-navigation是致力于解決導(dǎo)航卡頓,數(shù)據(jù)傳遞,Tabbar和navigator布局,支持redux。非常具有實用價值,需要的朋友可以參考下
    2018-05-05
  • ReactiveCocoa代碼實踐之-UI組件的RAC信號操作

    ReactiveCocoa代碼實踐之-UI組件的RAC信號操作

    這篇文章主要介紹了ReactiveCocoa代碼實踐之-UI組件的RAC信號操作 的相關(guān)資料,需要的朋友可以參考下
    2016-04-04

最新評論

弥渡县| 达州市| 永新县| 新乡市| 新乐市| 云梦县| 崇义县| 乐清市| 夏津县| 徐州市| 左云县| 山阴县| 伊宁市| 鄂伦春自治旗| 周口市| 怀宁县| 兴城市| 怀安县| 新干县| 安国市| 上蔡县| 且末县| 布尔津县| 鹤岗市| 塔城市| 苗栗县| 长丰县| 浙江省| 黑山县| 石棉县| 富川| 鄢陵县| 滦平县| 双桥区| 南投市| 赣州市| 西平县| 临潭县| 双桥区| 新民市| 浦东新区|