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

news2024/10/22 15:18:40

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.coloradmin.cn/o/2220879.html

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

相关文章

Vscode连接WSL2(Ubuntu20.04)

一.安装WSL插件 在扩展里面搜索WSL,选择安装即可 二.连接到wsl 安装完毕后在左下角看到一个按钮&#xff08;一个>和一个<组成&#xff09;&#xff0c;点击在中间选择"连接到wsl",然后Vscode会弹出一个新窗口&#xff0c;左下角显示WSL子系统名称&#xff0…

vue中如何检测数组变化(vue基础,面试,源码级讲解)

大家有什么不明白的地方可以分享在评论区&#xff0c;大家一起探讨哦~~ &#xff08;如果对数据劫持还有所不明白的小伙伴&#xff0c;可以去看看上一篇文章哦&#xff09; 在vue2中&#xff0c;是如何对数组进行劫持的呢&#xff1f; 简单代码实现&#xff1a; 在vue2中&…

学习中,师傅b站泷羽sec——xss挖掘过程

某职业技术学院网站xss挖掘&#xff1a; 资产归纳 例如&#xff1a;先把功能点都看一遍&#xff0c;大部分都是文章 根据信息搜集第一课学习到一般主站的防御力是比较强的&#xff0c;出现漏洞的点不是对新手不友好。 在资产验证过程中还是把主站看了一遍 没有发现有攻击的机会…

G1 GAN生成MNIST手写数字图像

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 G1 GAN生成MNIST手写数字图像 1. 生成对抗网络 (GAN) 简介 生成对抗网络 (GAN) 是一种通过“对抗性”学习生成数据的深度学习模型&#xff0c;通常用于生成…

如何调试浏览器中的内存泄漏?

聚沙成塔每天进步一点点 本文回顾 ⭐ 专栏简介⭐ 如何调试浏览器中的内存泄漏&#xff1f;1. 什么是内存泄漏&#xff1f;2. 调试内存泄漏的工具3. 如何使用 Memory 面板进行内存调试3.1 获取内存快照&#xff08;Heap Snapshot&#xff09;获取内存快照的步骤&#xff1a;快照…

即时通讯增加Redis渠道

情况说明 在本地和服务器分别启动im服务&#xff0c;当本地发送消息时&#xff0c;会发现服务器上并没有收到消息 初版im只支持单机版&#xff0c;不支持分布式的情况。此次针对该情况对项目进行优化,文档中贴出的代码非完整代码&#xff0c;可自行查看参考资料[2] 代码结构调…

C Primer Plus 第9章——第一篇

你该逆袭了 文章目录 一、复习函数1、定义带形式参数的函数2、声明带形式参数函数的原型3、使用 return 从函数中返回值&#xff08;1&#xff09;、返回值不仅可以赋给变量&#xff0c;也可以被用作表达式的一部分。&#xff08;2&#xff09;、返回值不一定是变量的值&#x…

springboot redisTemplate hash 序列化探讨

前提提要&#xff1a;这个是个人小白总结&#xff0c;写完博客后开始厌蠢。 redisTemplate 有两种插入hash的方式 redisTemplate.opsForHash().putAll(key, map);redisTemplate.opsForHash().put(key, field, value);在使用的过程中&#xff0c;难免会疑问为什么 key field v…

Windows下部署autMan

一、安装autMan 下载autMan压缩包 https://github.com/hdbjlizhe/fanli/releases 解压安装包 二、运行&#xff08;注意&#xff0c;无论是交互运行还是静默运行&#xff0c;终端均不可关闭&#xff09; 基本运行 双击autMan.exe运行。 高级运行 在autMan文件夹&#xff0…

Sigrity Power SI Model Extraction模式如何提取电源网络的S参数和阻抗操作指导(一)

Sigrity Power SI Model Extraction模式如何提取电源网络的S参数和阻抗操作指导(一) Sigrity PowerSI是频域电磁场仿真工具,以下图为例介绍如果用它观测电源的网络的S参数以及阻抗的频域曲线. 观测IC端电源网络的自阻抗 1. 用powerSi.exe打开该SPD文件

工业相机详解及选型

工业相机相对于传统的民用相机而言&#xff0c;具有搞图像稳定性,传输能力和高抗干扰能力等&#xff0c;目前市面上的工业相机大多数是基于CCD&#xff08;Charge Coupled Device)或CMOS(Complementary Metal Oxide Semiconductor)芯片的相机。 一&#xff0c;工业相机的分类 …

sentinel原理源码分析系列(六)-统计指标

调用链和统计节点构建完成&#xff0c;进入统计指标插槽&#xff0c;统计指标在最后执行的&#xff0c;等后面的插槽执行完&#xff0c;资源调用完成了&#xff0c;根据资源调用情况累计。指标统计是最重要的插槽&#xff0c;所有的功能都依靠指标数据&#xff0c;指标的正确与…

你知道什么叫数控加工中心吗?

加工中心是一种高度机电一体化的数控机床&#xff0c;具有刀库&#xff0c;自动换刀功能&#xff0c;对工件一次装夹后进行多工序加工的数控机床。通过计算的控制系统和稳定的机械结构&#xff0c;加工中心能够实现高精度的加工&#xff0c;确保工件的尺寸精度和表面质量。通过…

实用好助手

在现代职场中&#xff0c;拥有高效且适用的工具能够显著提升我们的工作效率与质量。除了常见的办公软件&#xff0c;还有许多小众但非常实用的工具可以大幅度优化工作流程。以下是另外五个推荐的工作软件&#xff0c;它们各自具备独特的功能与优势&#xff0c;值得一试。 1 …

【Docker系列】在 Docker 容器中打印和配置环境变量

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

双十一有哪些值得买的东西?2024年最全双十一好物推荐榜单来了!

双十一能够入手的好东西那肯定是非常多的&#xff0c;不过要想买到性价比高、实用性强的好物&#xff0c;就必须得做些功课了。作为一个智能家居和数码领域的博主&#xff0c;自然知道每年双十一买什么是最划算的。如果有朋友正在为双十一不知道买什么而发愁&#xff0c;那就快…

python+大数据+基于热门视频的数据分析研究【内含源码+文档+部署教程】

博主介绍&#xff1a;✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业毕业设计项目实战6年之久&#xff0c;选择我们就是选择放心、选择安心毕业✌ &#x1f345;由于篇幅限制&#xff0c;想要获取完整文章或者源码&#xff0c;或者代做&am…

登录后端笔记(一):注册、登录;基于MD5加密

一、注册 一、参数&#xff1a;lombok pom.xml里引入依赖&#xff1b; 二、响应数据&#xff1a;Result 原视频 两个注解对应有参无参生成构造方法&#xff1b; data类型是泛型T&#xff0c;即data在使用时可对应object可对应string字符串可对应bean对象可对应map等&#x…

微信碰一碰支付系统有哪些好的?教程详解抢先看!

支付宝“碰一碰支付”的风刚刚刮起来&#xff0c;它的老对手微信便紧随其后&#xff0c;推出了自己的碰一碰支付设备&#xff0c;再次印证了这个项目市场前景广阔的同时&#xff0c;也让与碰一碰支付系统相关问题的热度又上了一层楼&#xff0c;尤其是微信碰一碰支付系统有哪些…

炒股VS炒游戏装备,哪个更好做

这个项目&#xff0c;赚个10%都是要被嫌弃的 虽然天天都在抒发自己对股市的看法&#xff0c;但自己自始至终也没有买进任何一支股票。之所以对这个话题感兴趣&#xff0c;着实是因为手上的游戏搬砖项目也是国际性买卖&#xff0c;跟国际形势&#xff0c;国际汇率挂钩&#xff0…