当前位置: 首页 > news >正文

React中类组件和函数组件的理解和区别

react代码模块分为类组件和函数组件。

语法和定义内部状态管理生命周期性能可读性和维护性上下文集成状态管理库等角度对比React中类组件和函数组件。

1、语法和定义

类组件:

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

特点:

  • 使用 class 关键字定义,并继承自 React.Component
  • 能够使用 state 来管理组件的内部状态。
  • 可以使用生命周期方法,如 componentDidMountcomponentDidUpdate componentWillUnmount 等。
  • 通过 this.props 来访问传递给组件的属性(props)。
import React, { Component } from 'react';class HelloComponent extends Component {constructor(props) {super(props);this.state = {count: 0};}increment = () => {this.setState({ count: this.state.count + 1 });}render() {return (<div><p>Count: {this.state.count}</p><button onClick={this.increment}>Increment</button></div>);}
}export default HelloComponent;

函数组件(Function Component):

函数组件是使用 JavaScript 函数定义的 React 组件。自 React 16.8 以来,函数组件通过引入 Hooks 可以实现状态管理和副作用处理,功能上已经与类组件基本等价。 

特点:

  • 使用 JavaScript 函数定义,通常是更简单和推荐的方式。
  • 在函数组件中,无法直接使用 this,而是通过 Hooks(如> useState useEffect)来管理状态和副作用。
  • 更加简洁,通常用于无状态组件,但在有状态需求时也可以使用 Hooks
import React, { useState } from 'react';function HelloComponent() {const [count, setCount] = useState(0);const increment = () => {setCount(count + 1);};return (<div><p>Count: {count}</p><button onClick={increment}>Increment</button></div>);
}export default HelloComponent;

 

2、内部状态管理

类组件:

使用类组件时,可以通过组件的内部状态(state)来管理组件的数据。

import React from 'react';class Counter extends React.Component {constructor(props) {super(props);this.state = { count: 0 };}render() {return (<div><p>Count: {this.state.count}</p><button onClick={() => this.setState({ count: this.state.count + 1 })}>Increase</button></div>);}
}export default Counter;

函数组件(Function Component):

函数组件可以使用hooks(React 16.8+)来管理内部状态。

useState钩子:

import React, { useState } from 'react';function Counter() {const [count, setCount] = useState(0);return (<div><p>Count: {count}</p><button onClick={() => setCount(count + 1)}>Increase</button></div>);
}export default Counter;

useReducer钩子(适用于复杂的状态逻辑):

import React, { useReducer } from 'react';function Counter() {const [count, dispatch] = useReducer((state, action) => {switch (action.type) {case 'increment':return state + 1;case 'decrement':return state - 1;default:throw new Error();}}, 0);return (<div><p>Count: {count}</p><button onClick={() => dispatch({ type: 'increment' })}>Increase</button><button onClick={() => dispatch({ type: 'decrement' })}>Decrease</button></div>);
}export default Counter;

3、生命周期

类组件:

类组件生命周期(三个阶段:挂载阶段,更新阶段,卸载阶段)

挂载阶段执行顺序 :constructor->componentWillMount->render->componentDidMount

更新阶段执行顺序: shouldComponentUpdate->componentWillUpdate->render->componentDidUpdate

销毁阶段: componentWillUnmount

import React  from "react";
import {Link} from 'react-router-dom'
class Demo extends React.Component{constructor(props){super(props)console.log("constructor")}state = {num:1}UNSAFE_componentWillMount(){console.log("componentWillMount")}componentDidMount(){console.log("componentDidMount")}shouldComponentUpdate(){console.log('shouldComponentUpdate')return true}UNSAFE_omponentWillUpdate(){console.log("componentWillUpdate")}componentDidUpdate(){console.log("componentDidUpdate")}componentWillUnmount(){console.log("componentWillUnmount")}Submit = () =>  {this.setState({num:this.state.num+=1})}render(){console.log('render')return(<><Link to='/app1'>App1</Link>//这里替换成自己的即可<h3>{this.state.num}</h3><button onClick={this.Submit}>改变</button></>)}
}
export default Demo

函数组件(Function Component):

函数组件本质没有生命周期,但是我们通过Hooks来模仿类组件当中的生命周期(也是三个阶段)

import { useState ,useEffect} from "react"
function App1 (){const [username ,setUsername] = useState('')const setChange = event => {setUsername(event.target.value);};// useEffect  =  vue mounted 区别是只要视图更新就变化 感觉类似watch 但是他又是初始化的 时候第一个//  useEffect(()=>{},[])useEffect(()=>{console.log('模拟componentDidMount第一次渲染', username)return () =>{console.log('模拟componentWillUnmount执行销毁后')}},[username])return(<><input value={username} onChange={setChange}></input></>)
}
export default  App1

4、性能

React类组件和函数组件之间的性能对比主要关注以下几个方面:

角度类组件函数组件
渲染性能在渲染时会进行shouldComponentUpdate生命周期检查需要使用React.memo或自定义比较逻辑来避免不必要的重渲染
状态更新可以在shouldComponentUpdate中实现更细粒度的更新检查需要使用React.memo或自定义比较逻辑来避免不必要的重渲染
组件的状态和生命周期复杂性可能会引入更多的对象和函数,这可能会影响GC(垃圾回收)-
内存占用因为其实例和可能的引用,可能会占用更多内存-

5、可读性和维护性

可读性和维护性是评估代码质量的重要指标。

  • 类组件的可读性和维护性可能不如函数组件。类组件中的this指向以及生命周期方法(如componentDidMount)可能会增加理解和维护的难度。

  • 函数组件的可读性和维护性较好,因为它们就像纯函数,更接近于数学函数的定义,更容易理解和维护。

  • 对于简单的组件,使用函数组件是首选,因为它们更简单且易于理解。

  • 对于需要管理状态或生命周期事件的组件,类组件是必须的。

  • 可以使用hooks(React 16.8+)来编写函数组件,它们可以让你在不编写类的情况下使用state和其他React特性。

如:类组件

class MyComponent extends React.Component {constructor(props) {super(props);this.state = { count: 0 };}render() {return (<div><p>You clicked {this.state.count} times</p><button onClick={() => this.setState({ count: this.state.count + 1 })}>Click me</button></div>);}
}

函数组件(Function Component):

function MyComponent() {const [count, setCount] = React.useState(0);return (<div><p>You clicked {count} times</p><button onClick={() => setCount(count + 1)}>Click me</button></div>);
}

在这个例子中,函数组件MyComponent通过React.useState hook管理了状态,使得它的定义更接近于类组件的行为,同时更易于阅读和维护。 

6、上下文

类组件:可以通过this.context访问上下文。需要在类组件上使用static contextType声明期望访问的上下文,或者使用contextTypes属性进行类型检查(使用React 16.6之前的API)。

import React, { Component } from 'react';class MyClassComponent extends Component {static contextType = MyContext; // 使用最新的context APIcomponentDidMount() {const data = this.context; // 访问上下文}render() {return <div>My Class Component</div>;}
}

函数组件(Function Component):可以使用useContext钩子从React获取上下文。

import React, { useContext } from 'react';function MyFunctionComponent() {const contextData = useContext(MyContext); // 使用hooks获取上下文return <div>My Function Component</div>;
}

注意:useContext只能在函数组件或者自定义钩子中使用。类组件不能使用这种方式访问上下文。

7、集成状态管理库

React中,类组件函数组件可以使用状态管理库来管理复杂的状态。常见的状态管理库有Redux、MobX、Context API等。

8、总结类组件、函数组件的优缺点

角度类组件函数组件
优点
  1. 完全控制:可以访问所有React生命周期的钩子。

  2. 状态(state)管理:可以维护和更新组件的状态。

  3. 复杂交互:类组件可以管理更复杂的交互,如动画、表单等。

  4. 性能优化:使用shouldComponentUpdate生命周期方法来优化渲染。

  1. 轻量级:函数组件不涉及创建类实例所带来的开销,并且它们自然阻止了this上的问题。

  2. 简单:代码通常更简洁,更容易编写和维护。

  3. Hooks:React 16.8+引入了Hooks,使函数组件可以使用状态(state)和其他React特性。

缺点
  1. 与函数组件相比,更多的开销,如创建类实例、绑定this等。

  2. 容易产生this指向问题,需要手动绑定this。

  1. 不能访问整个组件生命周期的所有钩子,例如componentDidCatch和componentDidMount。

  2. 对于复杂的交云,可能需要额外的库或自定义钩子。

  3. 不能使用ref属性,因为React无法在每次渲染时返回同一个函数实例。

相关文章:

React中类组件和函数组件的理解和区别

react代码模块分为类组件和函数组件。 从语法和定义、内部状态管理、生命周期、性能、可读性和维护性、上下文、集成状态管理库等角度对比React中类组件和函数组件。 1、语法和定义 类组件&#xff1a; 使用 ES6 的类&#xff08;class&#xff09;语法定义的 React 组件。…...

Day62||prim算法精讲 |kruskal算法精讲

prim算法精讲 53. 寻宝&#xff08;第七期模拟笔试&#xff09; 题目描述 在世界的某个区域&#xff0c;有一些分散的神秘岛屿&#xff0c;每个岛屿上都有一种珍稀的资源或者宝藏。国王打算在这些岛屿上建公路&#xff0c;方便运输。 不同岛屿之间&#xff0c;路途距离不同&…...

upload-labs通关练习

目录 环境搭建 第一关 第二关 第三关 第四关 第五关 第六关 第七关 第八关 第九关 第十关 第十一关 第十二关 第十三关 第十四关 第十五关 第十六关 第十七关 第十八关 第十九关 第二十关 总结 环境搭建 upload-labs是一个使用php语言编写的&#xff0c…...

wordpress搭建主题可配置json

网站首页展示 在线访问链接 http://dahua.bloggo.chat/ 配置json文件 我使用的是argon主题&#xff0c;你需要先安装好主题&#xff0c;然后可以导入我的json文件一键配置。 需要json界面配置文件的&#xff0c;可以在评论区回复&#xff0c;看见评论我会私发给你。~...

RWKV-5/6 论文被 COLM 2024 收录

由 Bo PENG 和 RWKV 开源社区共同完成的 RWKV-5/6架构论文《Eagle and Finch: RWKV with Matrix-Valued States and Dynamic Recurrence》被顶级会议 COLM 2024 收录。 这是继 RWKV-4 架构论文《RWKV: Reinventing RNNs for the Transformer Era》被 EMNLP 2023 收录之后&…...

MinIO分片下载超大文件

一、前言 各位亲爱的们&#xff0c;之前介绍过了上传超大文件到MinIO&#xff1a; MinIO分片上传超大文件&#xff08;纯服务端&#xff09;MinIO分片上传超大文件&#xff08;非纯服务端&#xff09; 这里最后再补充一下从MinIO下载超大文件。 二、从MinIO分片下载大文件 …...

Vue3 -- 新组件【谁学谁真香系列6】

Teleport Teleport是什么?–Teleport是一种能够将我们的组件html结构移动到指定位置的技术。 父组件: <template><div calss="outer"><h2>我是App组件</h2><img src="https://z1.ax1x.com/2023/11/19/piNxLo4.jpg" alt=&qu…...

Openstack3--本地仓库搭建(ftp源搭建失败)

上传镜像 后面的ftp源做不了&#xff0c;请将下面的本地openstack源在控制节点和计算节点都配置 在控制节点上传&#xff0c;安装ftp并配置启动后再在计算节点配置 将openStack-train.iso文件通过MobaXterm远程连接软件上传至控制节点 /opt 目录下 挂载 进入 /opt 目录 创建…...

【初阶数据结构与算法】链表刷题之移除链表元素、反转链表、找中间节点、合并有序链表、链表的回文结构

文章目录 一、移除链表元素思路一思路二 二、合并两个有序链表思路&#xff1a;优化&#xff1a; 三、反转链表思路一思路二 四、链表的中间节点思路一思路二 五、综合应用之链表的回文结构思路一&#xff1a;思路二&#xff1a; 一、移除链表元素 题目链接&#xff1a;https:…...

【PGCCC】Postgresql Toast 原理

前言 上篇博客讲述了 postgresql 如何存储变长数据&#xff0c;它的应用主要是在 toast 。Toast 在存储大型数据时&#xff0c;会将它存储在单独的表中&#xff08;称为 toast 表&#xff09;。因为 postgresql 的 tuple&#xff08;行数据&#xff09;是存在在 Page 中的&…...

vue3使用element-plus,树组件el-tree增加引导线

vue3使用element-plus&#xff0c;树组件el-tree增加引导线 vue3项目element-plus&#xff0c;树组件el-tree增加引导线 element-plus组件库的el-tree样式 因为element的样式不满足当前的的需求&#xff0c;UI图&#xff0c;所以对el-tree进行增加了引导线 修改样式如下&am…...

AlphaFold3中文使用说明

目录 1. 在线网站用例1. 使用json输入预测蛋白结构 2. 本地命令行2.1 运行示例2.2 AF3输入输入格式JSON兼容性JSON最外层&#xff08;Top-level&#xff09;结构序列多序列比对MSA结构模板键 用户提供CCDs 2.3 AF3输出 AlphaFold3&#xff08;AF3&#xff09;可以通过在线网站或…...

使用@react-three/fiber,@mkkellogg/gaussian-splats-3d加载.splat,.ply,.ksplat文件

前言 假设您正在现有项目中集成这些包&#xff0c;而该项目的构建工具为 Webpack 或 Vite。同时&#xff0c;您对 Three.js 和 React 有一定的了解。如果您发现有任何错误或有更好的方法&#xff0c;请随时留言。 安装 npm install three types/three react-three/fiber rea…...

Koa进阶:掌握中间件和参数校验的艺术

目录 一、首先下载依赖 二、在index.js中引入koa-parameter&#xff0c;一般挂载这个中间件时会放在注册请求体的后面 三、使用实例 四、如果跟我们所需求的参数不同&#xff0c;返回结果直接会返回422 koa-parameter一般是用来校验请求传过来的参数是否是自己所需要的的 G…...

开源共建 | 长安链开发常见问题及规避

长安链开源社区鼓励社区成员参与社区共建&#xff0c;参与形式包括不限于代码贡献、文章撰写、社区答疑等。腾讯云区块链王燕飞在参与长安链测试工作过程中&#xff0c;深入细致地总结了长安链实际开发应用中的常见问题及其有效的规避方法&#xff0c;相关内容多次解答社区成员…...

【网络】深入理解 HTTPS:确保数据传输安全的核心协议

目录 引言一、HTTPS的基本概念1.1 什么是 HTTPS&#xff1f;1.2 HTTPS 的工作原理1.3 图解&#xff1a;HTTPS 通信过程1.4 HTTPS 与 HTTP 的区别1.5 为什么 HTTPS 更加重要&#xff1f; 二、SSL/TLS协议的核心2.1 SSL/TLS 协议的作用2.2 SSL/TLS 的工作流程2.2.1 握手阶段2.2.2…...

C/C++中使用MYSQL

首先要保证下载好mysql的库和头文件&#xff0c;头文件在/usr/include/mysql/目录下&#xff0c;库在/usr/lib64/mysql/目录下&#xff1a; 一般情况下&#xff0c;在我们安装mysql的时候&#xff0c;这些都提前配置好了&#xff0c;如果没有就重装一下mysql。如果重装mysql还是…...

【GD32】(一) 开发方式简介及标准库开发入门

文章目录 0 前言1 开发方式选择2 标准库模板的创建3 遇到的问题和解决方法 0 前言 因为项目关系&#xff0c;需要使用GD32。之前对此早有耳闻&#xff0c;知道这个是一个STM32的替代品&#xff0c;据说甚至可以直接烧录STM32的程序&#xff08;一般是同型号&#xff09;&#x…...

轻松上手:使用Docker部署Java服务

文章目录 1. 什么是Docker&#xff1f;2. 为什么使用Docker部署Java服务&#xff1f;3. 如何使用Docker部署Java服务&#xff1f;步骤1&#xff1a;创建Dockerfile步骤2&#xff1a;构建Docker镜像步骤3&#xff1a;运行Docker容器 4. 注意事项5. 结语推荐阅读文章 在当今的云计…...

wormml_vgg19

创建环境 mamba install libopencv hdf5 -c conda-forge conda create -n st python3.6.2手动导入包 mamba install blas1.0mkl -c conda-forge mamba install hdf51.8.20hac2f561_1 -c conda-forge mamba install libopencv3.4.2h20b85fd_0 -c conda-forge mamba install l…...

MongoDB(70)如何使用副本集进行备份?

使用副本集进行备份是一个常见的MongoDB备份策略&#xff0c;因为副本集提供了数据冗余和高可用性。通过从副本集中读取数据&#xff0c;可以在不影响主节点的情况下进行备份。以下是详细的步骤和示例代码&#xff0c;展示如何使用 MongoDB 副本集进行备份。方法一&#xff1a;…...

从单张图片到动态世界:Depth-Anything-3如何重塑3D视觉的通用法则

1. 当单张图片学会"思考"深度 第一次看到Depth-Anything-3&#xff08;DA3&#xff09;处理一张普通照片时&#xff0c;我盯着屏幕足足愣了三分钟。它就像给二维世界突然装上了Z轴——原本平淡无奇的街景照片&#xff0c;在DA3的解构下&#xff0c;近处的咖啡杯轮廓清…...

从 OpenClaw 到 ToClaw:AI 代理网关的产品化之路

定位说明&#xff1a;这是一篇偏“体验与选型思路”的横测笔记&#xff0c;不是参数党跑分&#xff0c;也不是安装教程。内容基于我对产品定位与常见使用路径的理解&#xff0c;公测策略与功能细节可能会随版本变化。 01&#xff5c;OpenClaw 是什么&#xff1f;能做什么&#…...

Tsunami Arduino硬件抽象库:高精度信号发生与频率测量

1. Tsunami信号发生器与频率计硬件抽象库概述Tsunami 是一款面向嵌入式测试与教学场景的多功能信号发生器与频率计硬件平台&#xff0c;其核心价值在于将高精度模拟信号生成、宽频带数字信号捕获与实时频率测量能力集成于紧凑的单板系统中。本库&#xff08;tsunami-arduino&am…...

3大核心功能打造智能游戏体验:League-Toolkit从入门到精通指南

3大核心功能打造智能游戏体验&#xff1a;League-Toolkit从入门到精通指南 【免费下载链接】League-Toolkit 兴趣使然的、简单易用的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit League…...

MCP服务器越权访问漏洞零容忍方案(基于Open Policy Agent的动态策略引擎实战)

第一章&#xff1a;MCP服务器越权访问漏洞零容忍方案总览MCP&#xff08;Microservice Control Plane&#xff09;服务器作为微服务架构中权限调度与策略执行的核心组件&#xff0c;其任意越权访问均可能导致全链路认证绕过、敏感配置泄露甚至横向渗透。本方案坚持“零容忍”原…...

2026年探访阎良:这三家头疗肩颈养生馆的服务为何备受好评?

在快节奏的现代生活中&#xff0c;头颈肩的亚健康问题几乎成了都市人的“标配”。头痛、失眠、肩颈僵硬&#xff0c;这些困扰背后&#xff0c;是人们对专业、有效且放松的养生服务的迫切需求。近期&#xff0c;笔者深入西安市阎良区&#xff0c;实地探访了三家在本地口碑颇佳的…...

基于YOLO的安全帽佩戴检测系统~Python+模型训练+2026原创+YOLO算法

项目简介 基于 YOLO 的智能安全帽佩戴检测平台&#xff0c;面向施工现场图片识别、检测记录管理与安全宣传信息展示等业务场景。系统后端采用 Flask 搭建 RESTful API 服务&#xff0c;结合数据库进行业务数据持久化存储&#xff0c;并通过 JWT 实现用户身份认证与接口访问控制…...

别再硬编码了!用注解+工厂模式,5分钟为你的Java应用扩展一个新PLC协议(ModbusTCP/S7为例)

工业物联网中Java协议扩展的优雅实践&#xff1a;注解驱动与工厂模式深度整合 工业物联网(IIoT)平台的开发者们经常面临一个棘手问题&#xff1a;如何在不重构核心代码的情况下&#xff0c;快速接入各种PLC设备协议&#xff1f;想象一下这样的场景&#xff1a;你的系统已经稳定…...

Qwen3-4B极速体验:流式输出+多轮记忆,打造丝滑文本交互

Qwen3-4B极速体验&#xff1a;流式输出多轮记忆&#xff0c;打造丝滑文本交互 在当今AI技术快速发展的背景下&#xff0c;文本交互模型已经成为日常工作和创作的重要助手。Qwen3-4B-Instruct-2507作为阿里通义千问系列中的纯文本优化版本&#xff0c;通过移除视觉模块冗余&…...