当前位置: 首页 > 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和生命周期方法时。

http://www.lryc.cn/news/445898.html

相关文章:

  • 在线点餐新体验:Spring Boot 点餐系统
  • WPF中Viewbox的介绍和用法
  • QMT如何获取股票基本信息?如上市时间、退市时间、代码、名称、是否是ST等。QMT量化软件支持!
  • 2024年中国科技核心期刊目录(科普卷)
  • [解决]navicat连接mysql成功,但是使用jdbc连接不上
  • sar信号RD域的距离向傅里叶变换
  • 4 html5 web components原生组件详细教程
  • nginx+keepalived健康检查案例详解(解决nginx出现故障却不能快速切换到备份服务器的问题)
  • 什么是AI大模型?
  • 建造者模式__c#
  • 学习MRI处理过程中搜到的宝藏网站
  • 【C语言】const char*强制类型转换 (type cast)的告警问题
  • python-比较月亮大小/数组下标/人见人爱a+b
  • 什么是组态、组态的应用场景介绍
  • Java项目: 基于SpringBoot+mybatis+maven实现的智能推荐卫生健康系统分前后台(含源码+数据库+开题报告+任务书+毕业论文)
  • 本地生活商城开发搭建 同城O2O线上线下推广
  • 41. 如何在MyBatis-Plus中实现批量操作?批量插入和更新的最佳实践是什么?
  • LlamaIndex 的Node节点后处理器模块介绍
  • Dubbo 如何使用 Zookeeper 作为注册中心:原理、优势与实现详解
  • Linux:进程间通信之命名管道
  • UE4_后期处理七—仿红外线成像效果
  • 静态路由和默认路由(实验)
  • TCP: Textual-based Class-aware Prompt tuning for Visual-Language Model
  • 2024年软考网络工程师中级题库
  • CSS的盒子模型(Box Model)
  • 用OpenSSL搭建PKI证书体系
  • scp 命令:在两台主机间远程传输文件
  • 家用迷你洗衣机哪款质量高?五大热销高分单品强势来袭
  • rpm 命令:RedHat底层包管理器
  • Xilinx 使用DDS实现本振混频上下变频