React类组件生命周期详解

在React的类组件中,从组件创建到组件被挂载到页面中,这个过程react存在一系列的生命周期函数,最主要的生命周期函数是componentDidMount、componentDidUpdate、componentWillUnmount

生命周期图例如下

1. componentDidMount组件挂载

如果你定义了 componentDidMount 方法,React 将会在组件被添加到屏幕上 (挂载) 后调用它。这里是设置数据获取、订阅监听事件或操作 DOM 节点的常见位置。

  • 参数:componentDidMount 不需要任何参数;
  • 返回值:componentDidMount 不应该返回任何值;
  • 场景:多用于组件中进行网络请求,DOM操作等;
  componentDidMount() {
    console.log("component did mount");
  }

2. componentDidUpdate组件更新

如果你定义了 componentDidUpdate 方法,那么 React 会在你的组件更新了 props 或 state 重新渲染后立即调用它。这个方法不会在首次渲染时调用

  • 参数:
    • prevProps:更新之前的 props。prevProps 将会与 this.props 进行比较来确定发生了什么改变;

    • prevState:更新之前的 state。prevState 将会与 this.state 进行比较来确定发生了什么改变;

    • snapshot: 如果你实现了 getSnapshotBeforeUpdate 方法,那么 snapshot 将包含从该方法返回的值。否则它将是 undefined

  • 返回值:componentDidMount 不应该返回任何值;

  • 注意:如果在组件中定义了shouldComponentUpdate 并且返回值是 false 的话,componentDidUpdate 将不会被调用。如果在componentDidUpdate 中直接调用 setState方法,会造成触发一次发生在浏览器更新屏幕内容之前的额外渲染,在这种情况下,即使 render 会被调用两次,用户也看不到中间状态。这种模式通常会导致性能问题。

  componentDidUpdate(prevProps, prevState, snapshot) {
    console.log("component did update");
  }

3. componentWillUnmount组件卸载

如果你定义了 componentWillUnmount 方法,React 会在你的组件被移除屏幕(卸载)之前调用它。此方法常常用于取消数据获取或移除监听事件。

  • 参数:componentDidMount 不需要任何参数;
  • 返回值:componentDidMount 不应该返回任何值;
  • 注意:componentWillUnmount 内部的逻辑应该完全“对应”到 componentDidMount 内部的逻辑,例如,如果你在 componentDidMount 中设置了一个监听事件,那么 componentWillUnmount 中就应该清除掉这个监听事件,例如定时器任务等。
  componentWillUnmount() {
    console.log("component willUnmount");
  }

4. getSnapshotBeforeUpdate组件快照

getSnapshotBeforeUpdateReact 会在 React 更新 DOM 之前时直接调用它。它使你的组件能够在 DOM 发生更改之前捕获一些信息(例如滚动的位置)。此生命周期方法返回的任何值都将作为参数传递给 componentDidUpdate

  • 参数:
    • prevProps:更新之前的 Props。prevProps 将会与 this.props 进行比较来确定发生了什么改变。

    • prevState:更新之前的 State。prevState 将会与 this.state 进行比较来确定发生了什么改变。

  • 返回值:返回你想要的任何类型的快照值,或者是 null你返回的值将作为第三个参数传递给 componentDidUpdate

  getSnapshotBeforeUpdate(prevProps, prevState) {
    console.log("getSnapshotBeforeUpdate");
    return "123"
  }

运行结果:

用例组件App:

class HelloWorld extends React.Component {
  constructor() {
    super()
    this.state = {
      banners: ['新歌曲','新mv', '新歌单'],
      porductsList: ['商品','热门', '流行'],
      count: 100,
    }
  }
  changeCount(count) {
    this.setState({count: this.state.count + count})
  }
  render() {
    const { banners, porductsList, count} = this.state
    return (
      <div>
        <Header />
        <Main banners={banners} addClick={(count) => this.changeCount(count)} />
        <Footer porductsList={porductsList}/>
        <div>{count}</div>
      </div>
    )
  }


  componentDidMount() {
    console.log("component did mount");
  }

  getSnapshotBeforeUpdate(prevProps, prevState) {
    console.log("getSnapshotBeforeUpdate");
    return "123"
  }

  componentDidUpdate(prevProps, prevState, snapshot) {
    console.log("component did update");
    console.log("prevProps, prevState, snapshot", prevProps, prevState, snapshot); // snapshot 就是 getSnapshotBeforeUpdate 返回的值 123
  }

  componentWillUnmount() {
    console.log("component willUnmount");
  }
}

  • 8
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用\[1\]:当渲染过程,生命周期或子组件的构造函数中抛出错误时,会调用如下方法: static getDerivedStateFromProps()componentDidCatch() 常用生命周期 1.render() 。 引用\[2\]:当组件实例被创建并插入DOM时,其生命周期调用顺序如下: constructor()static getDerivedStateFromProps()render()componentDidMount() 组件更新时 。 引用\[3\]:组件渲染之后调用,只调用一次 2.4、生命周期函数代码示例 import React, { Component } from 'react' export default class OldReactComponent extends Component { constructor(props) { super(props) // getDefaultProps:接收初始props // getInitialState:初始化state } state = { } componentWillMount() { // 组件挂载前触发 } render() { return ( <h2>Old React.Component</h2> ) } componentDidMount() { // 组件挂载后触发 } componentWillReceivePorps(nextProps) { // 接收到新的props时触发 } shouldComponentUpdate(nextProps, nextState) { // 组件Props或者state改变时触发,true:更新,false:不更新 return true } componentWillUpdate(nextProps, nextState) { // 组件更新前触发 } componentDidUpdate() { // 组件更新后触发 } componentWillUnmount() { // 组件卸载时触发 } } 3、新的生命周期 3.1、Mounting(加载阶段:涉及4个钩子函数) 。 问题:react函数组件 生命周期 回答: React函数组件生命周期相对简单,只有两个阶段:Mounting(加载阶段)和Unmounting(卸载阶段)。在Mounting阶段,函数组件会依次执行以下生命周期函数:constructor()、render()和componentDidMount()。constructor()函数用于初始化组件的状态和绑定事件处理函数。render()函数用于渲染组件的UI。componentDidMount()函数在组件被插入DOM后调用,可以进行一些异步操作或订阅事件。在Unmounting阶段,函数组件会执行componentWillUnmount()函数,在组件被卸载前进行一些清理工作,比如取消订阅事件或清除定时器。除了这些生命周期函数,函数组件没有其他生命周期函数可用。 #### 引用[.reference_title] - *1* *2* [React生命周期详解](https://blog.csdn.net/weixin_46872121/article/details/126623679)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [关于React组件生命周期函数的详解](https://blog.csdn.net/p445098355/article/details/104667187)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值