react-3

87 阅读2分钟

react 类组件的生命周期

react的函数式组件没有生命周期函数这一说,函数式组件要实现生命周期的功能,需要在副作用函数中实现。下面介绍的是类组件的生命周期函数。

react 生命周期图解

image-20220706193249090.png

初始化阶段

初始化阶段:

​ 先执行 constructor 函数 =》然后是 render 函数 =》然后是 componentDidMount 函数。

  /**
   * 这个函数会在render函数执行之后立即执行,
   * 1. 这时这个函数中可以执行一些关于dom的操作
   * 2. 也可以做一些请求后端数据的工作
   * 3. 也可以做一些定时器之类的活
   */
  componentDidMount() {
    console.log("初始化阶段的最后一个执行函数");
  }

运行阶段

先执行 render 函数=》然后是 componentDidUpdate 函数

  /**
   * 该函数有三个参数
   *  第一个参数是之前的属性
   *  第二个参数是之前的状态
   * 
   * 在这个函数中做一些操作,都需要在判断条件中执行,不然很容易造成死循环
   */
  componentDidUpdate(prevProps, prevState) {
    console.log(prevProps, prevState);
    console.log("更新阶段");
  }

销毁阶段

直接 componentWillUnmount 函数

在这个生命周期函数中做的事:

  1. 清除定时器
  2. 解绑dom事件
  //   这个函数在组件销毁的时候执行
  componentWillUnmount() {
    console.log("组件销毁了");
  }

总的代码演示

父组件代码:

import React, { Component } from "react";

import Demo from "./Demo";
export default class App extends Component {
  state = {
    flag: true,
  };
  render() {
    return (
      <div>
        <h2>App</h2>
        {this.state.flag && <Demo />}

        <button
          onClick={() => {
            let flag = this.state.flag;
            flag = !flag;
            this.setState({ flag });
          }}
        >
          显示/隐藏子组件
        </button>
      </div>
    );
  }
}

子组件代码:

import React, { Component } from "react";

export default class Demo extends Component {
  constructor() {
    super();
    this.state = {
      num: 0,
    };
  }

  render() {
    return (
      <div>
        Demo
        <h2>{this.state.num}</h2>
        <button
          onClick={() => {
            let num = this.state.num;
            num++;
            this.setState({ num });
          }}
        >
          chang
        </button>
      </div>
    );
  }

  /**
   * 这个函数会在render函数执行之后立即执行,这个函数只会执行一次
   * 1. 这时这个函数中可以执行一些关于dom的操作
   * 2. 也可以做一些请求后端数据的工作
   * 3. 也可以做一些定时器之类的活
   */
  componentDidMount() {
    console.log("初始化阶段的最后一个执行函数");
  }

  /**
   * 该函数有三个参数
   *  第一个参数是之前的属性
   *  第二个参数是之前的状态
   * 
   * 在这个函数中做一些操作,都需要在判断条件中执行,不然很容易造成死循环
   */
  componentDidUpdate() {
    console.log("更新阶段");
  }
    
  // 这个函数在组件销毁的时候执行,这个函数只会执行一次
  componentWillUnmount() {
    console.log("组件销毁了");
  }
    
}