React生命周期函数深入全面介绍

关于React生命周期函数深入全面介绍的攻略,这里为大家详细介绍一下:

什么是React生命周期函数

React组件有生命周期,即从组件被创建到最终组件销毁过程中的各个阶段。在这些阶段,React提供了一组函数,这些函数分别对应不同阶段中的操作,这就是React生命周期函数。

React生命周期函数总共分为三类:

  1. 挂载阶段(Mounting):组件被创建并插入DOM中的过程;
  2. 更新阶段(Updating):组件被重新渲染的过程;
  3. 卸载阶段(Unmounting):组件被移除出DOM的过程。

React生命周期函数详解

挂载阶段的生命周期函数

constructor

当组件被创建时,constructor这个函数就会被调用。我们可以在这个函数中初始化state和绑定事件。

constructor(props) {
  super(props);
  this.state = { count: 0 };
  this.handleClick = this.handleClick.bind(this);
}

componentWillMount

在组件将要被挂载到页面的时刻执行,该函数只会执行一次,所以通常情况下我们并不需要使用此函数。在16.3.0版本之后被废弃了,但是在16.4.0版本之后又重新启用了,不过官方文档建议不要再使用该函数。

render

在该函数中,我们需要返回一个jsx元素,它是组件的模板。Virtual Dom会根据每次组件render的返回值来计算DOM树的变化。

render() {
  return (
    <div>
      <h1>{this.state.count}</h1>
        <button onClick={this.handleClick}>Click Me</button>
    </div>
  );
}

componentDidMount

组件挂载完成之后,即被插入到DOM中,该函数会被执行一次。在 componentDidMount 中一般完成如下操作:

1.​发送 Ajax 请求。
2.​手动调用其他 Refs 等。

componentDidMount() {
  console.log("componentDidMount");
}

组件更新阶段的生命周期函数

shouldComponentUpdate

该函数返回一个布尔值,用于控制组件是否需要重新渲染。在一些必要的场景下,我们可以用该函数优化组件的渲染效率。

shouldComponentUpdate(nextProps, nextState) {
  if (this.state.count === nextState.count) {
    return false;
  }
  return true;
}

componentWillReceiveProps

该函数在组件接收到 props 的时候被触发。

componentWillReceiveProps(nextProps) {
  console.log("componentWillReceiveProps", nextProps);
  if (nextProps.count === 0) {
    this.setState({
      count: 100
    });
  }
}

componentWillUpdate

在组件被重新渲染之前,该函数被调用。

componentWillUpdate() {
  console.log("componentWillUpdate");
}

render

渲染组件。

render() {
  return (
    <div>
      <h1>{this.state.count}</h1>
      <button onClick={this.handleClick}>Click Me</button>
    </div>
  );
}

componentDidUpdate

在组件被重新渲染之后,该函数被调用。

componentDidUpdate() {
  console.log("componentDidUpdate");
}

卸载阶段的生命周期函数

componentWillUnmount

在组件被卸载及销毁之前直接调用。

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

React生命周期函数示例

示例一:今天你学习了吗

这个示例中,我们会创建一个计数器组件,用它来控制今天你是否学习了。

代码如下:

import React from "react";

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

  componentDidMount() {
    console.log("componentDidMount");
  }

  shouldComponentUpdate(nextProps, nextState) {
    if (this.state.count === nextState.count) {
      return false;
    }
    return true;
  }

  componentWillReceiveProps(nextProps) {
    console.log("componentWillReceiveProps", nextProps);
    if (nextProps.count === 0) {
      this.setState({
        count: 100,
        study: true
      });
    }
  }

  componentWillUpdate() {
    console.log("componentWillUpdate");
  }

  componentDidUpdate() {
    console.log("componentDidUpdate");
  }

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

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

  render() {
    return (
      <div>
        <h1>今天你学习了吗?</h1>
        {this.state.study && <h3>恭喜你学习了一天!</h3>}
        <h3>{this.state.count}</h3>
        <button onClick={this.handleClick}>学习了</button>
      </div>
    );
  }
}

export default Counter;

示例二:天气预报

在这个示例中,我们会创建一个天气组件,用它来展示当天的天气。

代码如下:

import React from "react";

class Weather extends React.Component {
  constructor(props) {
    super(props);
    this.state = { temp: 25, weather: "晴天" };
  }

  componentDidMount() {
    this.timer = setInterval(() => {
      const temp = this.state.temp + Math.random() * 10 - 5;
      const weather = Math.random() > 0.5 ? "晴天" : "阴天";
      this.setState({ temp, weather });
    }, 2000);
  }

  componentWillUnmount() {
    clearInterval(this.timer);
  }

  render() {
    return (
      <div>
        <h2>今天的天气</h2>
        <p>{`温度: ${this.state.temp}度`}</p>
        <p>{`天气状况: ${this.state.weather}`}</p>
      </div>
    );
  }
}

export default Weather;

总结

在React中,生命周期函数是非常重要的概念,掌握生命周期函数可以更好地理解和掌握React的组件开发。

在日常开发中,根据实际需要,可以选择合适的生命周期函数,来优化组件的渲染效率,提升用户体验。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:React生命周期函数深入全面介绍 - Python技术站

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

相关文章

  • 为什么要使用自增ID作为主键

    为什么要使用自增ID作为主键 在数据库设计中,主键是非常重要的概念。主键的作用是标识一个数据行,确保每行的唯一性,并且在表中查找数据时提高效率。在大多数情况下,我们会选择自增ID作为主键。 什么是自增ID 自增ID是指在新插入数据时,数据库自动为记录生成一个唯一的ID值。这个ID值通常是一个长整型值,其值在新插入的每行记录中逐个增加。 自增ID的好处 唯一性…

    其他 2023年3月28日
    00
  • python入门课程第四讲之内置数据类型有哪些

    Python入门课程第四讲之内置数据类型有哪些 概述 在Python中,数据可以分为不同的类型,例如:字典、列表、元组、集合等。这些类型被称为“内置数据类型”。 在本文中,我们将介绍Python中的内置数据类型,包括它们各自的特点和用法。 列表(list) 列表是Python中最常用的数据类型之一。它允许我们在一个变量中存储多个值。列表中的值可以是任意数据类…

    other 2023年6月27日
    00
  • Go结构体的基本使用详解

    标题:Go结构体的基本使用详解 什么是Go结构体 在Go语言中,结构体是一种用户自定义的数据类型,它可以包含多个字段,并且可以是不同类型的。它类似于其他编程语言中的结构体或对象。 结构体可以用于将多个数据项组合在一起以形成更复杂的数据结构。 结构体的定义如下: type StructName struct { Field1 Type1 Field2 Type…

    other 2023年6月27日
    00
  • OpenCV基于ORB算法实现角点检测

    OpenCV基于ORB算法实现角点检测 什么是ORB算法 ORB算法是Oriented FAST and Rotated BRIEF的简称,是一种用于特征点检测和配准的算法。相比于传统的SIFT和SURF算法,ORB算法不仅速度更快,而且具有更好的旋转不变性。 OpenCV中的ORB算法 OpenCV是一个广泛使用的开源计算机视觉库,它提供了许多有用的图像处…

    other 2023年6月27日
    00
  • 如何修改Vue打包后文件的接口地址配置的方法

    修改Vue打包后文件的接口地址配置有以下几个步骤: 打开项目根目录下的vue.config.js文件,如果没有就新建一个。这个文件是用来配置Vue打包的一些参数的,我们需要在里面写入我们的配置内容。 在vue.config.js文件中进行配置,具体配置如下: module.exports = { devServer: { proxy: { // 配置代理 ‘…

    other 2023年6月25日
    00
  • Linux中df命令查询磁盘信息和fdisk命令分区的用法

    Linux中df命令查询磁盘信息 df命令是一款可以查看磁盘空间使用情况的命令,它可以显示文件系统的总体使用情况,包括磁盘空间占用情况、剩余空间等信息。 命令格式: df [参数] [文件或目录] 常用参数: -h:以KB/MB/GB等单位来显示磁盘使用情况,更加直观; -i:查看文件系统的inode信息; -T:查看文件系统类型。 示例1: df -h 输…

    other 2023年6月27日
    00
  • 轻松实现可扩展自定义的Android滚轮时间选择控件

    下面给您详细讲解“轻松实现可扩展自定义的Android滚轮时间选择控件”的完整攻略。 1. 需求明确与分析 在开始实现Android滚轮时间选择控件之前,我们需要先明确需求,并分析需要具备哪些功能。本次需求明确如下: 实现时间选择控件,能够快速选择时分。 时间可自定义,如自定义可选择时间范围、可设置最小、最大可选择时间等。 提供回调函数接口以便于获取用户选择…

    other 2023年6月25日
    00
  • spring中bean id相同引发故障的分析与解决

    一、背景及问题分析 在Spring框架中,我们定义Bean对象时可以通过id属性来指定该Bean的唯一标识,通常一个id唯一对应一个Bean对象。假设在我们代码实现中定义了两个id相同的Bean对象,那么Spring框架使用该id获取Bean对象时将会发生什么? 考虑下面的示例: <bean id="person" class=&q…

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