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

下面我会详细讲解 React 组件的常用生命周期函数。

什么是组件的生命周期函数?

React 组件的生命周期函数指的是在组件创建、运行和销毁这一整个过程中,React 所提供的一系列函数。这些函数会在组件特定的时间点被调用,我们可以在这些函数中执行一些自己的代码。

在 React16 之前,React 组件的生命周期函数主要有三类:Mounting(挂载)、Updating(更新)和Unmounting(卸载)。

在 React16 之后,出现了一些全新的生命周期函数,比如 getDerivedStateFromProps、getSnapshotBeforeUpdate 等,以适应更多的场景需求。

下面我们来详细了解一下这些生命周期函数。

Mounting

Mounting 即组件挂载的生命周期,也就是组件被创建并插入 DOM 中的过程。常用的生命周期函数有:

constructor

constructor 函数是 React 组件中唯一一个不需要调用 super(props) 的函数,也是我们组件中最先被调用的函数。一般我们可以在 constructor 中初始化组件的状态(state)或者绑定事件处理方法。

class MyComponent extends React.Component {
  constructor(props) {
    super(props);
    this.state = { count: 0 };
    // 绑定事件处理方法
    this.handleClick = this.handleClick.bind(this);
  }

  handleClick() {
    // 修改 count 的值
    this.setState({ count: this.state.count + 1 });
  }

  render() {
    return <div>{this.state.count}</div>;
  }
}

componentWillMount

在组件第一次初始化时,componentWillMount 被调用。这个函数是在组件挂载 DOM 前被调用,可以在这里执行一些异步请求等操作。然而,在 React16 之后,它被标记为废弃,不推荐使用。

componentDidMount

在组件挂载后,componentDidMount 被调用,此时我们可以执行一些初始化的任务,例如从 API 中获取数据,并将数据存储在组件的 state 中。在这个函数中,我们也可以执行一些 DOM 操作。

示例

下面是一段代码,在该组件插入 DOM 即第一次被渲染时,调用 componentDidMount 完成了一个简单的动画效果:

class MyComponent extends React.Component {
  constructor(props) {
    super(props);
    this.state = { count: 0 };
    this.handleClick = this.handleClick.bind(this);
  }

  handleClick() {
    this.setState({ count: this.state.count + 1 });
  }

  componentDidMount() {
    const element = this.refs['mydiv'];
    const width = element.offsetWidth;
    element.style.width = '0px';
    element.style.opacity = '0';
    setTimeout(() => {
      element.style.width = `${width}px`;
      element.style.opacity = '1';
    }, 3000);
  }

  render() {
    return (
      <div>
        <button onClick={this.handleClick}>点击</button>
        <div ref="mydiv">{this.state.count}</div>
      </div>
    );
  }
}

在 componentDidMount 函数里获取到 div 元素的宽度,然后设置其 opacity 和宽度为 0,再通过 setTimeout 完成动画效果。

Updating

Updating 即组件数据更新的生命周期。组件数据更新有两种情况,一种是 props 的数据更新,一种是 state 的数据更新。

常用的生命周期函数有:

componentWillReceiveProps

当使用组件的时候,会改变组件的 props 值,当新的 props 值传入组件后,就会触发 componentWillReceiveProps 函数,这个时候我们可以进行一些 props 变化后的操作。

class MyComponent extends React.Component {
  componentWillReceiveProps(nextProps) {
    if (nextProps.value !== this.props.value) {
      this.setState({ value: nextProps.value });
    }
  }
  render() {
    return <div>{this.state.value}</div>;
  }
}

在 componentWillReceiveProps 函数中,我们可以判断新的 props 值是否和原来的不同,如果不同,就更新组件的 state 值。

shouldComponentUpdate

当组件的 props 或 state 更新时,shouldComponentUpdate 函数会被调用。我们可以在这里进行一些优化,判断是否需要进行更新操作。这里需要注意的是,shouldComponentUpdate 函数必须返回一个布尔值,用于表示是否进行更新操作,默认返回 true。

class MyComponent extends React.Component {
  shouldComponentUpdate(nextProps, nextState) {
    if (nextState.value !== this.state.value) {
      return true;
    }
    return false;
  }
  render() {
    return <div>{this.state.value}</div>;
  }
}

在这个例子中,如果 nextState 的 value 值不等于 this.state 的 value 值,那么就需要进行更新操作。

componentWillUpdate

当 shouldComponentUpdate 返回 true 时,componentWillUpdate 函数会被调用,此时我们可以在这里进行一些更新前的操作。

class MyComponent extends React.Component {
  componentWillUpdate(nextProps, nextState) {
    console.log('更新前的操作:' + this.state.value + ' -> ' + nextState.value);
  }
  render() {
    return <div>{this.state.value}</div>;
  }
}

在这个例子中,我们在 componentWillUpdate 函数中打印了更新前后的数值。

componentDidUpdate

在更新组件后,componentDidUpdate 函数会被调用,我们可以在这里操作 DOM,比如更新某个元素的内容。

class MyComponent extends React.Component {
  componentDidUpdate(prevProps, prevState) {
    console.log('更新后的操作:' + prevState.value + ' -> ' + this.state.value);
  }
  render() {
    return <div>{this.state.value}</div>;
  }
}

在这个例子中,我们在 componentDidUpdate 函数中打印了更新前后的数值。

示例

下面是一段代码,在该组件的值更新时,会异步向服务器请求数据,并展示请求返回的结果:

class MyComponent extends React.Component {
  constructor(props) {
    super(props);
    this.state = { data: null };
    this.handleInputChange = this.handleInputChange.bind(this);
  }

  shouldComponentUpdate(nextProps, nextState) {
    if (nextProps.value === this.props.value && nextState.data === this.state.data) {
      return false;
    }
    return true;
  }

  componentWillUpdate(nextProps, nextState) {
    this.fetchData(nextProps.value);
  }

  fetchData(value) {
    setTimeout(() => {
      this.setState({ data: `请求结果:${value}` });
    }, 2000);
  }

  handleInputChange(event) {
    this.props.onChange(event.target.value);
  }

  render() {
    return (
      <div>
        <input value={this.props.value} onChange={this.handleInputChange} />
        <div>{this.state.data}</div>
      </div>
    );
  }
}

在该组件中,当传入的 value 值更新时,shouldComponentUpdate 函数会被调用,如果新旧 props/state 没有变化,就返回 false,否则返回 true,接着 componentWillUpdate 函数会被调用,我们在这里异步向服务器请求数据,然后在 fetchData 函数中更新组件的 state 值,最后在 render 函数中展示请求返回的结果。

这是一个简单的异步请求例子,考虑到 react-hook, 可以使用 useEffect 来替代 componentWillUpdate 和 componentDidUpdate。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:React 组件的常用生命周期函数汇总 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • 《halcon数字图像处理》第六章笔记

    《Halcon数字图像处理》第六章笔记 概述 本文将对《Halcon数字图像处理》第六章的内容进行梳理和总结。本章主要介绍了Halcon平台下的形态学操作、区域分割、形状分析等内容。通过本章的学习,能够掌握如何在Halcon中实现图像的细节增强、边缘提取、形状匹配等操作。 形态学操作 形态学操作是数学形态学理论在图像处理中的应用。它主要包括膨胀、腐蚀、开运算…

    其他 2023年3月28日
    00
  • Android制作登录页面并且记住账号密码功能的实现代码

    下面是“Android制作登录页面并且记住账号密码功能的实现代码”完整攻略: 1. 编写登录页面布局 首先需要创建一个登录页面的布局,可以使用EditText和Button等组件实现,同时建议使用LinearLayout或RelativeLayout等布局组件实现页面排版。 示例代码: <LinearLayout xmlns:android=&quot…

    other 2023年6月27日
    00
  • 详解Java的内存模型

    详解Java的内存模型 Java的内存模型定义了Java程序中各种变量的访问规则和内存操作的行为。了解Java的内存模型对于编写高效且正确的多线程程序至关重要。本攻略将详细讲解Java的内存模型,包括内存模型的基本概念、内存间的交互规则以及如何使用volatile和synchronized关键字来保证线程安全。 基本概念 Java的内存模型将内存划分为主内存…

    other 2023年8月2日
    00
  • 一文详解Golang中的基础语法

    一文详解Golang中的基础语法 1. 变量声明和赋值 在Golang中,可以使用var关键字声明变量,并使用=进行赋值。以下是一个示例: var name string name = \"John\" 也可以在声明变量的同时进行赋值,如下所示: var age int = 25 另外,Golang还支持使用:=进行变量声明和赋值的简写方…

    other 2023年9月7日
    00
  • [Micropython]TPYBoard v10x拼插编程实验 点亮心形点阵

    Micropython: TPYBoard v10x拼插编程实验 点亮心形点阵 在这篇文章中,我们将介绍如何使用TPYBoard v10x,这是一款基于MicroPython的微型电子设备,通过它我们可以进行拼插编程实验,让心形点阵发光。 准备工作 首先,我们需要准备一个TPYBoard v10x, 一个心形点阵以及对应的杜邦线。 接下来,我们需要启动TPY…

    其他 2023年3月28日
    00
  • BAT脚本接收输入数字

    BAT脚本接收输入数字的完整攻略 BAT脚本是一种在Windows操作系统下运行的批处理脚本语言。要实现BAT脚本接收输入数字的功能,可以使用set /p命令来接收用户输入,并使用条件语句进行数字验证。下面是详细的攻略: 步骤一:接收用户输入 使用set /p命令可以接收用户输入的数字。语法如下: set /p 变量名=提示信息: 其中,变量名是你想要存储输…

    other 2023年8月15日
    00
  • mysql5.6下载&安装

    以下是关于“MySQL 5.6 下载&安装”的完整攻略,包括下载、安装和两个示例。 下载 打开MySQL官网:https://dev.mysql/downloads/mysql/5.6.html 在“MySQL Community Server”下拉单选择适合您操作系统的版本。 点击“Download”按钮选择适合您操作系统的安装包进行下载。 安装 …

    other 2023年5月7日
    00
  • Android自定义实现开关按钮代码

    Android自定义实现开关按钮代码攻略如下: 1.需求明确 在开发自定义开关按钮之前,我们需要先清楚我们要实现哪些功能。比如:按钮的背景、大小、选中和未选中状态等特性。只有明确了需求,才能更加准确的实现。 2.自定义控件 在 Android 中,实现自定义组件的方法有很多种,比如将多个 View 组成一个复合控件、继承原生控件并加以改造、继承 ViewGr…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部