React Componet类组件详解(老项目)

React类组件是通过创建class继承React.Component来创建的,是React中用于构建用户界面的重要部分。以下是对React类组件的详细解释:

一、定义与基本结构

类组件使用ES6的class语法定义,并继承自React.Component。它们具有更复杂的功能,特别是在React 16.8之前,是唯一能够使用状态和生命周期方法的组件。

一个基本的类组件结构如下:

import React, { Component } from 'react';  class MyComponent extends Component {  constructor(props) {  super(props);  this.state = {  // 初始状态  };  }  // 生命周期方法或其他方法  render() {  return (  // JSX,描述组件的UI  );  }  
}  export default MyComponent;

二、核心属性

类组件有三大核心属性:state、props和refs。

  1. state:组件的状态,是一个对象,可以包含多个key-value组合。通过更新组件的state来更新对应的页面显示(重新渲染组件)。修改state需要使用this.setState方法。
  2. props:组件的属性,是组件对外的接口,由外部通过JSX属性传入。每个组件对象都会有props属性,组件标签的所有属性都保存在props中。props是只读的,组件内部不要修改props数据。
  3. refs:一个对象,持有对渲染在DOM中的某个节点的引用。可以通过为元素添加ref属性来访问DOM节点或React元素。

三、生命周期方法

类组件具有生命周期方法,这些方法在组件的不同阶段被调用,允许开发者在组件创建、更新和销毁等关键时刻执行代码。

主要的生命周期方法包括:

  1. constructor:在组件实例化并准备渲染之前调用。通常用于初始化state或绑定方法。
  2. render:必需的方法,用于返回组件的JSX,描述组件的UI。
  3. componentDidMount:在组件挂载到DOM后立即调用。通常用于执行数据获取、事件监听等操作。
  4. shouldComponentUpdate:在组件接收到新的props或state之前调用,用于判断组件是否需要重新渲染。返回true表示需要重新渲染,返回false表示不需要。
  5. getSnapshotBeforeUpdate:在最近一次渲染输出(提交到DOM节点)之前调用。它使得组件能在更新之前捕捉到一些信息(例如滚动位置)。此生命周期方法的任何返回值将作为componentDidUpdate的第三个参数。
  6. componentDidUpdate:在组件更新后立即调用。可以根据前后的props和state的变化做相应的操作。
  7. componentWillUnmount:在组件卸载之前调用。通常用于清理一些注册的事件监听器或取消订阅的网络请求等。

React 类组件的生命周期是指组件从被创建到销毁所经历的一系列过程。在这个过程中,React 提供了一些特定的方法(也称为“生命周期钩子”),允许开发者在组件生命周期的不同阶段执行代码。以下是 React 类组件生命周期的详细解释,包括各个阶段和示例代码。

1. 挂载阶段(Mounting)

在这个阶段,组件实例被创建并插入到 DOM 中。

  • constructor()
    • 在创建组件实例时调用。
    • 通常用于初始化 state 和绑定方法。
  • static getDerivedStateFromProps(nextProps, prevState)
    • 在 render 方法调用之前调用,用于根据新的 props 更新 state。
    • 这是一个静态方法,不能访问组件实例(即不能使用 this)。
  • render()
    • 必须实现的方法,用于返回组件的 JSX 结构。
  • componentDidMount()
    • 在组件挂载后立即调用。
    • 适合执行网络请求、DOM 操作或订阅外部数据源。
2. 更新阶段(Updating)

在这个阶段,组件的 props 或 state 发生变化,导致组件重新渲染。

  • static getSnapshotBeforeUpdate(prevProps, prevState)
    • 在最近一次渲染输出(提交到 DOM 节点)之前调用。
    • 它返回一个值,将作为 componentDidUpdate 的第三个参数。
  • shouldComponentUpdate(nextProps, nextState)
    • 在组件接收到新的 props 或 state 之前调用。
    • 返回一个布尔值,决定组件是否应该重新渲染。
    • 默认为 true。
  • render()
    • 如前所述,必须实现的方法。
  • getDerivedStateFromProps(nextProps, prevState)
    • 也可以在更新阶段调用,用于根据新的 props 更新 state。
  • componentDidUpdate(prevProps, prevState, snapshot)
    • 在组件更新后立即调用。
    • 适合执行 DOM 操作或基于新旧 props/state 进行操作。
3. 卸载阶段(Unmounting)

在这个阶段,组件从 DOM 中移除。

  • componentWillUnmount()
    • 在组件卸载及销毁之前调用。
    • 适合执行清理工作,如取消网络请求、清除计时器或解除事件监听。
示例代码

以下是一个包含所有生命周期方法的 React 类组件示例:

import React, { Component } from 'react';  class LifecycleDemo extends Component {  constructor(props) {  super(props);  this.state = {  count: 0,  };  this.incrementCount = this.incrementCount.bind(this);  }  static getDerivedStateFromProps(nextProps, prevState) {  // 通常用于同步 props 到 state,但在这个例子中我们不需要它  // 如果需要根据新的 props 更新 state,可以返回一个新的 state 对象  return null;  }  componentDidMount() {  console.log('Component mounted');  // 可以在这里执行网络请求或订阅  }  shouldComponentUpdate(nextProps, nextState) {  // 返回 true 或 false 来决定是否重新渲染组件  // 在这个例子中,我们总是允许更新  return true;  }  getSnapshotBeforeUpdate(prevProps, prevState) {  // 在这里可以捕获一些信息(如滚动位置)  // 这个值将作为 componentDidUpdate 的第三个参数  return null;  }  componentDidUpdate(prevProps, prevState, snapshot) {  console.log('Component updated');  // 可以在这里执行 DOM 操作或基于新旧 props/state 的操作  }  componentWillUnmount() {  console.log('Component will unmount');  // 可以在这里执行清理工作,如取消网络请求  }  incrementCount() {  this.setState(prevState => ({  count: prevState.count + 1,  }));  }  render() {  console.log('Component is rendering');  return (  <div>  <p>Count: {this.state.count}</p>  <button onClick={this.incrementCount}>Increment</button>  </div>  );  }  
}  export default LifecycleDemo;

四、事件处理

在类组件中,可以通过为元素添加事件监听器来处理用户交互。事件处理函数通常是类的方法,可以通过this关键字来访问组件的属性和状态。

例如:

class MyComponent extends Component {  handleClick = () => {  // 处理点击事件  }  render() {  return (  <button onClick={this.handleClick}>Click me</button>  );  }  
}

注意,在类组件中,如果事件处理函数不是箭头函数,那么需要使用.bind(this)来确保this的指向正确。或者使用箭头函数作为类属性来定义事件处理函数,这样可以自动绑定this

五、类组件通信

在React中,类组件之间的通讯是一个核心概念,它允许不同的组件之间交换数据和功能。以下是React类组件之间通讯的几种主要方式:

1. 父组件向子组件通讯(Props)
  • 原理:父组件通过在其子组件的标签上添加自定义属性(即props),将数据传递给子组件。子组件则通过this.props来接收这些数据。
  • 示例
class Parent extends Component {  constructor(props) {  super(props);  this.state = {  message: "Hello from Parent!"  };  }  render() {  return <Child message={this.state.message} />;  }  
}  class Child extends Component {  render() {  return <div>{this.props.message}</div>;  }  
}

在这个例子中,Parent组件通过message属性将其状态传递给Child组件,Child组件则通过this.props.message来接收并显示这个数据。

2. 子组件向父组件通讯(回调函数)
  • 原理:父组件定义一个回调函数,并将其作为prop传递给子组件。子组件在需要时调用这个回调函数,将数据作为参数传递回去。
  • 示例
class Parent extends Component {  handleDataFromChild = (data) => {  console.log("Data from child:", data);  };  render() {  return <Child onData={this.handleDataFromChild} />;  }  
}  class Child extends Component {  sendDataToParent = () => {  this.props.onData("Hello from Child!");  };  render() {  return <button onClick={this.sendDataToParent}>Send Data to Parent</button>;  }  
}

在这个例子中,Parent组件定义了一个handleDataFromChild回调函数,并将其通过onData属性传递给Child组件。Child组件在按钮被点击时调用这个回调函数,将数据传递回Parent组件。

3. 兄弟组件之间的通讯(通过父组件中转)
  • 原理:兄弟组件之间的通讯通常通过它们的父组件来中转。一个兄弟组件将数据传递给父组件,然后父组件再将这个数据传递给另一个兄弟组件。
  • 示例
class Parent extends Component {  constructor(props) {  super(props);  this.state = {  sharedData: ""  };  }  handleDataFromSiblingA = (data) => {  this.setState({ sharedData: data });  };  render() {  return (  <div>  <SiblingA onData={this.handleDataFromSiblingA} />  <SiblingB data={this.state.sharedData} />  </div>  );  }  
}  class SiblingA extends Component {  sendDataToParent = () => {  this.props.onData("Hello from Sibling A!");  };  render() {  return <button onClick={this.sendDataToParent}>Send Data to Sibling B</button>;  }  
}  class SiblingB extends Component {  render() {  return <div>{this.props.data}</div>;  }  
}

六、使用场景与优缺点

类组件适用于需要复杂状态管理和生命周期方法的场景。它们提供了更多的灵活性和控制力,但也需要更多的样板代码(如构造函数、render方法等)。相比之下,函数组件通常更简单、更易于理解和维护,特别是在React 16.8引入Hooks之后,函数组件也可以实现状态管理和副作用处理等功能。

总的来说,React类组件是构建React应用的重要工具之一。它们提供了强大的功能和灵活性,但也需要开发者对React的生命周期和状态管理有深入的理解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/882234.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

流量PID控制(开度前馈量计算+辅助PID)

和流体流速(瞬时流量)相关的计算请参考下面文章链接: 1、PLC通过伯努利方程近似计算水箱流量 PLC通过伯努利方程近似计算水箱流量(FC)-CSDN博客文章浏览阅读1.6k次。本文介绍了如何使用PLC通过伯努利方程近似计算水箱中的液体流量,主要涉及流量计算、模型验证、梯形图编程及…

C++学习路线(二十)

项目 模块划分 推箱子游戏 地图初始化 热键控制 推箱子控制 游戏结束 地图初始化 坐标系&#xff08;650&#xff0c;650&#xff09; 地图表示&#xff1a; 使用二维数组 游戏道具展示&#xff08;墙 箱子 箱子目的地 小人 地板&#xff09; 判断游戏…

java基于SpringBoot+Vue+uniapp微信小程序的自助点餐系统的详细设计和实现(源码+lw+部署文档+讲解等)

项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不是配置文件。Spring Boot 通过自动化配置和约…

【H∞鲁棒控制】状态反馈、输出反馈、混合灵敏度H∞控制器设计

最近在学H∞鲁棒控制&#xff0c;因为后面项目中可能要用到此控制方法&#xff0c;所以提前进行了学习&#xff0c;刚开始接触感觉看不太懂&#xff0c;涉及的数学专业知识较深&#xff0c;而且网上资料也比较零星且局限&#xff0c;摸爬了好几天才搞懂了点&#xff0c;现自己总…

「Java服务」快速接入SkyWalking方法指南

一、背景 背景&#xff1a;Apache SkyWalking 是一个开源的分布式应用性能监控&#xff08;APM&#xff09;系统&#xff0c;主要用于监控微服务、云原生和容器化应用的性能。接入SkyWalking可以排查以智能投放服务为主的服务响应问题 技术架构 SkyWalking 的核心架构包括以…

银河麒麟V10系统+Windows10双系统启动顺序正确修改方法

***正确可行方法***&#xff0c;测试OK且稳定&#xff1b; 银河麒麟桌面操作系统V10是一款适配国产软硬件平台并深入优化和创新的新一代图形化桌面操作系统&#xff0c;同源支持国内外主流处理器架构&#xff0c;并不断使能GPU、桥片、网卡等各种新硬件&#xff0c;提供更优的软…

vue3学习之插槽slot

关于slot web组件内部的占位符&#xff0c;可以使用自己的标记填充这个占位符 &#xff0c;具名插槽就是在slot标签上添加name属性&#xff08;https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/slot&#xff09; vue3官方文档&#xff1a;https://cn.vuejs.org/gui…

深入解析Java 22:专栏介绍

深入解析Java 22&#xff1a;专栏介绍 Java&#xff0c;作为一种广泛使用的编程语言&#xff0c;一直以来都在不断地发展和改进。2024年3月19日&#xff0c;Java 22的GA版本正式发布&#xff0c;带来了众多令人瞩目的新特性和性能优化。本专栏将深入解析Java 22&#xff0c;带…

AD9680(adc直采芯片)使用说明

写这篇文章之前我是没有使用过AD9680的芯片&#xff0c;但是使用过GMS011芯片&#xff08;是国内24S&#xff09;下的公司出来的芯片&#xff0c;寄存器和管脚全对标。 在这里我就大概说一下芯片的说用方法 一、硬件设计 该芯片支持双通道射频直采 支持协议JESD204B 14位 采样…

leetcode二叉树(五)-二叉树层序遍历

题目 102.二叉树的层序遍历 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[[3],[9,20],[15,7…

【网络篇】计算机网络——网络层详述(笔记)

目录 一、网络层 1. 网络传输流程简述 2. 转发和路由选择 3. 控制平面&#xff1a;SDN 方法 二、路由器工作原理 1. 概述 &#xff08;1&#xff09;输入端口 &#xff08;2&#xff09;交换结构 &#xff08;3&#xff09;输出端口 &#xff08;4&#xff09;路由选…

CAS详谈---无锁的锁机制

假设有多个线程想要操作同一个资源对象&#xff0c;我们首先想到的是使用互斥锁&#xff0c;但是互斥锁是悲观的。 悲观&#xff0c;即操作系统会悲观的认为如果不严格同步线程调用&#xff0c;那么一定会产生异常&#xff0c;所以互斥锁会将资源锁定&#xff0c;只供一个线程…

【动手学深度学习】7.5 批量规范化(个人向笔记)

训练深层神经网络是十分困难的&#xff0c;特别是在较短的时间内使它们收敛更加棘手。而本节的批量规范化&#xff08;batch normalization&#xff09; 可以持续加速深层网络的收敛速度结合下节会介绍道德残差块&#xff0c;批量规范化使得研究人员能够训练100层以上的网络 1.…

nbsaas vue3管理后台框架

nbsaas vue3管理后台框架 一、项目概述 Nbsaas Admin Vue 是一个基于 Vue.js 3.0 构建的轻量级后台管理系统&#xff0c;结合了现代前端技术栈的最佳实践&#xff0c;旨在帮助开发者快速构建具有高可扩展性和良好用户体验的后台管理系统。该项目拥有简洁的 UI 设计&#xff0…

Hikyuu教程 | 滚动回测与滚动寻优系统

前面介绍了如何使用 hikyuu 进行策略回测参数优化&#xff0c;同时也提到了这种简单的参数优化本质其实是对历史数据的过拟合&#xff0c;通常并不具备直接使用的意义。那么有什么办法来减缓这种过拟合影响&#xff0c;让参数优化发挥实际的作用呢&#xff1f;答案是——使用滚…

源码编译方式安装htppd软件

一.源码编译安装httpd软件 1.安装阿帕奇的依赖&#xff0c;安装apr软件&#xff0c;阿帕奇正常运行的环境这个环境就是apr。 2.安装apr-util软件&#xff0c;主要提供针对apr环境的管理工具&#xff0c; 3.安装阿帕奇软件即httpd软件。 如上图所示&#xff0c;就是三个软件的…

E38.【C语言】练习:数据结构时间复杂度的计算

目录 1.二分法的时间复杂度 解: 2.求阶乘的时间复杂度 解: 3.递归实现斐波那契数,求时间复杂度 解: 4.时间复杂度的排名 备注:有关时间复杂度的讲解参见80.【C语言】数据结构之时间复杂度 1.二分法的时间复杂度 (代码来自E7.【C语言】练习&#xff1a;在一个有序数组中…

CentOS 7 yum失效的解决办法

文章目录 一、CentOS 7停止维护导致yum失效的解决办法解决方案 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、CentOS 7停止维护导致yum失效的解决办法 020 年&#xff0c;CentOS 项目与红帽联合宣布将全部投资转向 CentOS Stream&#xff0c;这是…

SpringBoot项目热部署-devtools

DevTools 会使用两个类加载器&#xff08;一个用于加载不变的类&#xff0c;一个用于加载可能会变化的类&#xff09;&#xff0c;每次重启只重新加载管理变化的类的加载器&#xff0c;因此会快很多 1.导入依赖 <dependency> <groupId>org.springframework.boot&l…