React 组件的常用生命周期函数汇总

 更新时间:2022年08月15日 14:30:48   作者:巨蟹座不吃鱼​​​​​​​  
这篇文章主要介绍了React 组件的常用生命周期函数汇总,组件的生命周期有助于理解组件的运行方式、完成更复杂的组件功能、分析组件错误原因等

1. 概述

  • 意义:组件的生命周期有助于理解组件的运行方式、完成更复杂的组件功能、分析组件错误原因等。
  • 组件的生命周期:组件从被创建到挂载到页面中运行,再到组件不用时卸载的过程。
  • 生命周期的每个阶段总是伴随着一些方法调用,这些方法就是生命周期的钩子函数。
  • 钩子函数的作用:为开发人员在不同阶段操作组件提供了时机。
  • 只有类组件才有生命周期。

2. 生命周期的三个阶段

  • 每个阶段的执行时机
  • 每个阶段钩子函数的执行顺序
  • 每个阶段钩子函数的作用

2.1. 创建时(挂载阶段)

  • 执行时机:组件创建时(页面加载时)
  • 执行顺序:constructor() -> render() -> componentDidMount()
  • 钩子函数的作用:
钩子函数触发时机作用
constructor创建组件时,最先执行1.初始化state 2.为事件处理程序绑定 this
render每次组件渲染都会触发渲染 UI (注意:不能调用setState())
componentDidMount组件挂载(完成 DOM 渲染)后1.发送网络请求 2.DOM 操作
// 导入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指向问题
    this.handleClick = this.handleClick.bind(this)

    console.warn('生命周期钩子函数:constructor')
  }
  componentDidMount() {
    // 1.发送ajax请求,获取远程数据
    // axios.get('http://api....')

    // 2.进行DOM操作
    const title = document.getElementById('title')
    console.log(title)

    console.warn('生命周期钩子函数:componentDidMount')
  }

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

  render() {
    console.warn('生命周期钩子函数:render')

    // 错误演示(不能调用setState())
    // this.setState({
    //   count: 2
    // })

    return (
      <div>
        <h1 id='title'>统计豆豆被打的次数:{this.state.count}</h1>
        <button id='btn' onClick={this.handleClick}>打豆豆</button>
      </div>
    )
  }
}
ReactDOM.render(<App />, document.getElementById('root'))

2.2. 更新时(更新阶段)

  • 执行时机:setState()、forceUpdate()、组件接收到新的props。
  • 说明:以上任意一种变化,组件就会重新渲染。
  • 执行顺序:render() -> componentDidUpdate()
钩子函数触发时机作用
render每次组件渲染都会触发渲染 UI (与挂载阶段是同一个render)
componentDidUpdate组件更新(完成 DOM 渲染)后1.发送网络请求 2.DOM 操作 注意:如果要 setState() 必须放在一个if条件中
// 导入ract
import React from 'react'
import ReactDOM from 'react-dom'

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

    this.state = {
      count: 0
    }
  }

  // 事件处理程序
  handleClick = () => {
    // 执行时机:setState()
    this.setState({
      count: this.state.count + 1
    })

    // 执行时机:强制更新
    // this.forceUpdate()
  }

  render() {
    return (
      <div>
        {/* 执行时机:组件接收到新的props */}
        <ShowCount count={this.state.count} />
        <button onClick={this.handleClick}>打豆豆</button>
      </div>
    )
  }
}

// 子组件
class ShowCount extends React.Component {
  render() {
    console.warn('组件ShowCount的生命周期钩子函数:render')
    return (<h1 id='title'>统计豆豆被打的次数:{this.props.count}</h1>)
  }

  // 注意:如果要调用 setState() 更新状态,必须要放在一个 if 条件中
  // 因为:如果直接调用 setState(),也会导致递归更新!!!
  componentDidUpdate(prevProps) {
    // componentDidUpdate的作用:获取DOM
    const title = document.getElementById('title')
    console.log(title)

    // 正确做法:比较更新前后的props是否相同,来决定是否重新渲染组件
    console.log('上一次的props:', prevProps, ',当前的props:', this.props)
    if (prevProps.count !== this.props.count) {
      this.setState({})

      // componentDidUpdate的作用:发送ajax请求数据
      // axios.get('http://api....')
    }

    // 错误演示
    // this.setState({})

    console.warn('组件ShowCount的生命周期钩子函数:componentDidUpdate')
  }
}
ReactDOM.render(<App />, document.getElementById('root'))

2.3. 卸载时(卸载阶段)

执行时机:组件从页面中消失

钩子函数触发时机作用
componentWillUnmount组件卸载(从页面中消失)执行清理工作(比如:清理定时器等)
// 导入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('定时器正在执行~')
    }, 500)
  }

  render() {
    return (<h1 id='title'>统计豆豆被打的次数:{this.props.count}</h1>)
  }

  componentWillUnmount() {
    console.warn('组件ShowCount的生命周期钩子函数:componentWillUnmount')

    // 清理定时器
    clearInterval(this.timerId)
  }

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

到此这篇关于React 组件的常用生命周期函数汇总的文章就介绍到这了,更多相关React 组件生命周期函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 深入理解Redis7哨兵模式(保姆级教学)

    深入理解Redis7哨兵模式(保姆级教学)

    Redis的主从复制存在一定的缺陷,为了解决这一问题,Redis官方推荐一种高可用方案哨兵模式,本文主要介绍了深入理解Redis7哨兵模式,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • redis集群实现清理前缀相同的key

    redis集群实现清理前缀相同的key

    这篇文章主要介绍了redis集群实现清理前缀相同的key,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • Redis自增生成id的方法实践

    Redis自增生成id的方法实践

    在使用Redis时,常常需要用到自增ID的功能,主要介绍了Redis自增生成id的方法实践,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09
  • 让Redis在你的系统中发挥更大作用的几点建议

    让Redis在你的系统中发挥更大作用的几点建议

    Redis在很多方面与其他数据库解决方案不同:它使用内存提供主存储支持,而仅使用硬盘做持久性的存储;它的数据模型非常独特,用的是单线程。另一个大区别在于,你可以在开发环境中使用Redis的功能,但却不需要转到Redis
    2014-06-06
  • 安装redis(windows和Ubuntu)详解

    安装redis(windows和Ubuntu)详解

    这篇文章主要介绍了Redis在Ubuntu和Windows下的安装,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • 基于Redis分布式BitMap的应用分析

    基于Redis分布式BitMap的应用分析

    这篇文章主要介绍了基于Redis分布式BitMap的应用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • 基于Redis6.2.6版本部署Redis Cluster集群的问题

    基于Redis6.2.6版本部署Redis Cluster集群的问题

    这篇文章主要介绍了基于Redis6.2.6版本部署Redis Cluster集群,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • redis数据一致性的实现示例

    redis数据一致性的实现示例

    所谓的redis数据一致性即当进行修改或者保存、删除之后,redis中的数据也应该进行相应变化,本文主要介绍了redis数据一致性,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • redis常用命令整理

    redis常用命令整理

    在本篇文章里小编给大家整理的是关于redis常用命令整理相关内容需要的朋友们可以学习下。
    2020-03-03
  • Redis中Lua脚本的使用和设置超时

    Redis中Lua脚本的使用和设置超时

    本文将介绍Redis中Lua脚本的基本用法,以及脚本超时导致的问题和处理方式。文中通过示例代码介绍的非常详细,感兴趣的小伙伴们可以参考一下
    2021-11-11

最新评论