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

函数组件、Hooks和类组件区别

 1. 函数组件(Function Components)

函数组件是接收props并返回React元素的纯JavaScript函数。它们不能拥有自己的状态(state)或生命周期方法,但在React 16.8中引入Hooks之后,这种情况发生了变化。

特点

  • 声明式地编写。
  • 不需要类,减少了样板代码。
  • 没有this关键字的问题。
  • 在组件渲染时调用,每次组件更新时都会重新调用。

例子

 使用Hooks和函数组件 

import React from 'react'
import { withTranslation } from 'react-i18next'
import { Modal } from 'antd'import SvgIcon from '@/components/SvgIcon'//考试进行中弹框组件
function ExamOnGoingModal(props) {const { t, visible, onOk, onCancel } = propsreturn (<Modaltitle={<><SvgIcon iconClass="icon-jingshidanchuang" color='#007AFF' size="20px" /><span style={{ paddingLeft: '16px' }}>{t('examination.examOnGoing')}</span></>}visible={visible}onOk={onOk}onCancel={onCancel}okText={t('setting.refresh')}cancelText={t('common.close')}><p>{t('examination.examOnGoingTip')}</p></Modal>)
}export default withTranslation()(ExamOnGoingModal)
//使用 withTranslation() 高阶组件包装 ExamOnGoingModal,以便将 t 函数注入到其 props 中

2. Hooks(Hooks API)

Hooks是React 16.8中引入的一个新特性,允许你在不编写类的情况下使用状态(state)和其他React特性。Hooks只能在函数组件内部使用。

特点

  • 让你在不编写类的情况下使用状态和其他React特性。
  • 完全可选的。你仍然可以在项目中混合使用类和函数组件。
  • 允许你复用状态逻辑,而无需更改组件结构。

常用Hooks

  • useState:在函数组件中添加状态。
  • useEffect:在函数组件中执行副作用操作(如数据获取、订阅或手动更改React组件中的DOM)。
  • useContext:让你在函数组件中订阅React的Context。

例子

...
import { useTranslation } from 'react-i18next';  function ExamOnGoingModal({ visible, onOk, onCancel }) {  // 使用useTranslation Hook获取t函数  const { t } = useTranslation();  return (  <Modal  //同函数组件</Modal>  );  
}  export default ExamOnGoingModal;  
//这里不再需要withTranslation()来包装组件,因为我们已经直接在组件内部使用了useTranslation Hook


3. 类组件(Class Components)

类组件是通过继承React.Component来创建的React组件。它们有自己的状态(state)和生命周期方法,并且通常比函数组件更复杂。

特点

  • 可以包含自己的状态(state)和生命周期方法。
  • 适用于更复杂的场景,如需要使用Refs、获取DOM元素、手动调用组件的方法等。
  • 需要this关键字来访问组件的属性和方法。

例子

class ExamOnGoingModal extends React.Component {handleOk = () => {this.props.onOk()}handleCancel = () => {this.props.onCancel()}render() {const { t, visible } = this.propsreturn (<Modal...visible={visible}onOk={this.handleOk}onCancel={this.handleCancel}okText={t('setting.refresh')}cancelText={t('common.close')}><p>{t('examination.examOnGoingTip')}</p></Modal>)}
}
export default withTranslation()(ExamOnGoingModal)


总结

  • 函数组件简单且易于理解,但在引入Hooks之前无法保持状态。
  • Hooks在函数组件中引入状态和其他React特性,同时保持代码的简洁性和复用性。
  • 类组件功能强大,但编写和维护可能更加复杂,尤其是在处理this和生命周期方法时。

相关文章:

函数组件、Hooks和类组件区别

1. 函数组件&#xff08;Function Components&#xff09; 函数组件是接收props并返回React元素的纯JavaScript函数。它们不能拥有自己的状态&#xff08;state&#xff09;或生命周期方法&#xff0c;但在React 16.8中引入Hooks之后&#xff0c;这种情况发生了变化。 特点&a…...

在线点餐新体验:Spring Boot 点餐系统

摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于网上点餐系统当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了网上点餐系统&#xff0c;它彻底改变了过去传统的…...

WPF中Viewbox的介绍和用法

在 WPF&#xff08;Windows Presentation Foundation&#xff09; 中&#xff0c;Viewbox 是一个非常有用的容器控件&#xff0c;主要用于根据其自身大小自动调整子元素的缩放比例&#xff0c;以保持其内容的显示效果。无论窗口如何调整大小&#xff0c;Viewbox 内的内容都会按…...

QMT如何获取股票基本信息?如上市时间、退市时间、代码、名称、是否是ST等。QMT量化软件支持!

获取股票概况 包含股票的上市时间、退市时间、代码、名称、是否是ST等。 #获取合约基础信息数据 该信息每交易日9点更新 #内置Python 提示 旧版本客户端中&#xff0c;函数名为ContextInfo.get_instrumentdetail 调用方法 内置python ContextInfo.get_instrument_detai…...

2024年中国科技核心期刊目录(科普卷)

2024年中国科技核心期刊目录 &#xff08;科普卷&#xff09; 序号 期刊名称 1 爱上机器人 2 百科知识 3 保健医…...

[解决]navicat连接mysql成功,但是使用jdbc连接不上

在连接数据库时&#xff0c;最初使用的 JDBC URL 配置如下&#xff1a; jdbc:mysql://192.168.56.100:3306/mzxLiving_manage?useUnicodetrue&characterEncodingUTF-8&serverTimezoneAsia/Shanghai修改之后的JDBC URL为 jdbc:mysql://192.168.56.100:3306/mzxLiving…...

sar信号RD域的距离向傅里叶变换

下面可知&#xff0c;举例傅里叶变换时&#xff0c;posp 距离时间和频率 t不等于ft/K。而方位时间和频率时这种线性关系...

4 html5 web components原生组件详细教程

web components 前面我们已经介绍过&#xff0c;这一期我们就来讲一讲具体用法和这其中的关键只是点&#xff1a; 1 基本使用 如果我们想实现一个封装的原生组件&#xff0c;那就离不开使用js去封装&#xff0c;这里主要就是基于HTMLElement这个类&#xff0c;去创建创建一个…...

nginx+keepalived健康检查案例详解(解决nginx出现故障却不能快速切换到备份服务器的问题)

文章目录 简介配置过程前置环境请看创建健康检查脚本结果测试 简介 在我们通过nginxkeepalived实现高可用后&#xff0c;会发现nginx出现故障的时候keepalived并不会将虚拟ip切换到备份服务器上其原理就是nginx和keepalived是两个独立的服务&#xff0c;Nginx的故障状态不会触…...

什么是AI大模型?

什么是AI大模型? 人工智能&#xff08;AI&#xff09;大模型近年来在各个领域掀起了一场技术革命&#xff0c;从语言生成到图像识别&#xff0c;再到自动驾驶和医疗诊断&#xff0c;AI大模型的应用场景越来越广泛。这些模型的表现令人惊叹&#xff0c;但它们的工作原理和背后技…...

建造者模式__c#

目录 调用 指挥者 抽象建造者 建造者 定义具体产品 调用 用指挥者指挥建造者建造产品 在指挥者这里组装成产品 namespace _建造者模式 {internal class Program{static void Main(string[] args){Builder buildernew JiangHuaiBuilder();//建造者Director director new…...

学习MRI处理过程中搜到的宝藏网站

今天浏览网页查到了一些宝藏网站&#xff0c;正好记录一下&#xff0c;后面搜到好东东再接着填充&#xff0c;方便查阅~ &#xff08;1&#xff09;牛人网站 这个网站是在搜集seed关键词时发现的&#xff0c;用pdf文档记录&#xff0c;可下载查阅&#xff0c;条理清晰&#xf…...

【C语言】const char*强制类型转换 (type cast)的告警问题

void run_upload(const char *ftp_url) {CircularQueue queue;// 初始化环形队列for (int i = 0; i < QUEUE_SIZE; i++) {queue.items[i].data = malloc(BUFFER_SIZE);if (queue.items[i].data == NULL) {fprintf(stderr, "Failed to allocate memory for queue item %…...

python-比较月亮大小/数组下标/人见人爱a+b

一:比较月亮大小 题目描述 小理是一名出色的狼人。众所周知&#xff0c;狼人只有在满月之夜才会变成狼。 同时&#xff0c;月亮的大小随着时间变化&#xff0c;它的大小变化 3030 天为一循环。 它的变化情况(从第一天开始)为 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,14,13,12,1…...

什么是组态、组态的应用场景介绍

随着计算机技术和工业自动化水平迅速提高&#xff0c;而车间现场种类繁杂的控制设备和过程监控装置使得传统的工业控制软件无法满足用户的各种需求。在“组态”概念出现之前&#xff0c;工程技术人员需要通过编写程序来实现某一任务&#xff0c;不但工作量大、周期长&#xff0…...

Java项目: 基于SpringBoot+mybatis+maven实现的智能推荐卫生健康系统分前后台(含源码+数据库+开题报告+任务书+毕业论文)

一、项目简介 本项目是一套基于SpringBootmybatismaven实现的智能推荐卫生健康系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美…...

本地生活商城开发搭建 同城O2O线上线下推广

同城本地化商城目前如火如荼&#xff0c;不少朋友咨询本地生活同城平台怎么开发&#xff0c;今天商淘云与大家分享同城O2O线上商城的设计和开发。 本地生活商城一般会涉及到区域以及频道类&#xff0c;一般下单需要支持用户定位、商家定位&#xff0c;这样利于用户可以快速找到…...

41. 如何在MyBatis-Plus中实现批量操作?批量插入和更新的最佳实践是什么?

在 MyBatis-Plus 中&#xff0c;实现批量操作&#xff08;如批量插入、批量更新&#xff09;是非常常见的需求。MyBatis-Plus 提供了对批量操作的良好支持&#xff0c;可以通过多种方式实现高效的批量处理。下面详细介绍批量操作的实现方式以及最佳实践。 1. 批量插入 批量插入…...

LlamaIndex 的Node节点后处理器模块介绍

Node 后处理器模块 LlamaIndex 是一个旨在连接大型语言模型&#xff08;LLMs&#xff09;与外部数据的框架&#xff0c;允许开发者构建能够处理和回应复杂查询的应用程序。在这个框架内&#xff0c;NodePostProcessor 扮演着优化数据处理流程的重要角色。为了更好地理解 NodeP…...

Dubbo 如何使用 Zookeeper 作为注册中心:原理、优势与实现详解

Dubbo 是一个高性能的 Java 分布式服务框架&#xff0c;而 Zookeeper 常被用作 Dubbo 的服务注册中心。Zookeeper 提供了分布式一致性和协调服务&#xff0c;Dubbo 通过 Zookeeper 实现服务注册与发现功能&#xff0c;确保在分布式环境下服务实例的动态管理和可靠发现。 下面是…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

SpringCloudGateway 自定义局部过滤器

场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

比较数据迁移后MySQL数据库和OceanBase数据仓库中的表

设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...