React 函数式组件和类式组件区别

React 中组件主要分为函数式组件和类式组件两种类型。

一、函数式组件

函数式组件 (也称无状态组件,没有内部状态state,16.8版本推出hooks后可使用useState来管理) 就是通过函数编写形式去实现一个React组件,是React中定义组件最简单的方式。

// 定义函数式组件
import React from 'react'function MyComponent() {return <div>我是函数式组件...</div>
}    export default MyComponent

二、类式组件

类式组件就是通过ES6类的编写形式去编写组件,该类必须继承React.Component 如果想要访问父组件传递过来的参数,可通过 this.props方式去访问。

// 类式组件
import React, { Component } from 'react'class MyComponent extends Component {constructor(props) {super(props)}render(){return <div>我是类式组件...</div>}
}export default MyComponent

 说明:类式组件中必须实现render方法,在return中返回React对象。

三、函数式组件和类式组件的区别

类组件和函数组件最大的不同还在于代码思路方面的不同。类组件是面向对象编程思维方式,函数组件是面向过程编程思维方式。React的设计思路更推崇组合,而不是继承。在类组件中大量使用继承会造成组件过重,功能难以拆分。

特性函数式组件类式组件 
语法函数
内部状态 (state)不支持支持
生命周期方法不支持 (需借助 hooks)支持 (componentDidMount, componentDidUpdate 等)
引入外部状态 (props)支持支持
副作用处理 (如 useEffect)支持支持
代码复用可以使用 Hooks 实现可以使用继承、高阶组件等方式实现
状态管理工具支持支持
性能通常更轻量,React 16.8+ 中引入的 Hooks 使其更强大在某些情况下可能更快,但具体取决于实现方式

说明:React Hooks 是对 React 函数式组件的一种扩展,通过一些特殊的函数,让函数式组件拥有类式组件才拥有的能力。 常用的官方 hooks 有 useRef、useState、useEffect等。

函数式组件和类式组件管理状态方式如下: 

// 类式组件 - 使用 setState 管理状态
import React, { Component } from 'react'class MyComponent extends Component {state = {name: '张三丰'}changeName = () => {this.setState({name: '王新焱'})}render() {return (<div>我是{this.state.name}</div><button onClick={this.changeName}>修改姓名</button>)}
}export default MyComponent// 函数式组件 - 使用 hooks 管理状态
import React, { useState, useEffect } from 'react'function MyComponent() {// hookslet [name, setName] = useState('张三丰')// hooks -对象形式let [name2, setName2] = useState({name: '张三丰',age: 180,address: '武当山'})// 修改姓名function changeName() {setName(() => '王新焱')setName2(() => ({name: 'wxy', age: 30, address: '黄冈'}))}// hooksuseEffect(()=> {console.log('函数式组件生命周期...')},[])return (<div><p>我是函数式组件</p><button onClick={changeName}>修改姓名</button><div>我的名字是:{name}</div><div>我的名字是:{name2.name},我的年龄:{name2.age} 我的地址: {name2.address}</div></div>)
}export default MyComponent

四、未来趋势

”类组件“的模式并不能很好的适应未来的趋势,主要是以下几点

①.this的模糊性

②.业务逻辑散落在生命周期中

③.React 的组件代码缺乏标准的拆分方式。 而使用 Hooks 的函数组件可以提供比原先更细粒度的逻辑组织复用,且能更好地适应时间切片与并发模式。

React 16.8 + 版本推出了Hooks 使函数式组件拥有类组件的功能,比如生命周期阶段 

componentDidMount VS useEffect

componentDidUpdate VS useEffect

shouldComponentUpdate VS useMemo 

函数式组件即可使用替代方案来实现类式组件中的生命周期钩子函数。

从未来趋势看,由于官方React Hooks的推出,生命周期概念的淡出,函数组件可以完全取代类组件。其次继承并不是组件最佳的设计模式,官方更推崇”组由于继承“的设计概念,所以类组件在这方面的优势也在淡出,函数组件成了社区未来主推的方案,函数组件本身轻量简单,在hooks的基数上提供了比原先更细粒度的逻辑组织与复用,更能适应React的未来发展。

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

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

相关文章

Linux虚拟机搭建RabbitMQ集群

普通集群模式&#xff0c;意思就是在多台机器上启动多个 RabbitMQ 实例&#xff0c;每台机器启动一个。创建的 queue&#xff0c;只会放在一个 RabbitMQ 实例上&#xff0c;但是每个实例都同步 queue 的元数据&#xff08;元数据可以认为是 queue 的一些配置信息&#xff0c;通…

自定义无边框窗口

效果&#xff1a; 可拖动拉伸 ui&#xff1a;设计如下 样式表&#xff1a;在ui CustomDialog 里设置的 #widget_title{background: #E6F1EB;border-top-left-radius: 20px;border-top-right-radius: 20px;}#widget_client{background-color: rgb(255, 255, 255);border-bottom…

react create-react-app v5配置 px2rem (不暴露 eject方式)

环境信息&#xff1a; create-react-app v5 “react”: “^18.2.0” “postcss-plugin-px2rem”: “^0.8.1” 配置步骤&#xff1a; 不暴露 eject 配置自己的webpack&#xff1a; 1.下载react-app-rewired 和 customize-cra-5 npm install react-app-rewired customize-cra…

十三、Django之添加用户(原始方法实现)

修改urls.py path("user/add/", views.user_add),添加user_add.html {% extends layout.html %} {% block content %}<div class"container"><div class"panel panel-default"><div class"panel-heading"><h3 c…

Jakob Jenkov 个人博客 JCE 部分(译文)

Java Cryptography API 使你能够在 Java 中加密和解密数据&#xff0c;以及管理密钥、签名、验证消息、计算加密哈希等等。Cryptography 属于经常被简称为 crypto&#xff0c;所以你有时候可能会看到 Java crypto 而不是 Java Cryptography&#xff0c;这两个术语是同一个意思。…

OSI七层网络模型

1. OSI模型 网络协议是网络中两台计算机之间传输数据的标准语言。各种计算机系统使用 OSI&#xff08;Open Systems Interconnection&#xff09;模型规定的标准相互通信。OSI 模型有七个抽象层&#xff0c;每个层都有不同的职责和协议。 下图显示了 OSI 模型中每一层的功能。…

【python海洋专题十四】读取多个盐度nc数据画盐度季节变化图

本期内容 读取多个盐度文件&#xff1b;拼接数据在画盐度的季节分布图Part01. 使用数据 IAP 网格盐度数据集 数据详细介绍&#xff1a; 见文件附件&#xff1a; pages/file/dl?fid378649712527544320 全球温盐格点数据.pdf IAP_Global_ocean_gridded_product.pdf 全球温…

Blender中的4种视图着色模式

Blender中有四种主要的视图着色模式&#xff1a;线框、实体、Look Dev和渲染。它们的主要区别如下&#xff1a; - 线框模式只显示物体的边缘&#xff08;线框&#xff09;&#xff0c;可以让您看到场景中的所有物体&#xff0c;也可以调整线框的颜色和背景的颜色。 - 实…

python实现UI自动化配置谷歌浏览器驱动

web端UI自动化执行在哪个浏览器&#xff0c;需要对应哪个浏览器的驱动。以谷歌浏览器为例&#xff0c;进行配置。一、查看谷歌浏览器版本 如下截图&#xff1a;我的谷歌浏览器版本是&#xff1a; 117.0.5938.150 二、下载对应版本谷歌浏览器驱动 首先可以从其他版本驱动地址中…

【AI】深度学习——人工智能、深度学习与神经网络

文章目录 0.1 如何开发一个AI系统0.2 表示学习(特征处理)0.2.1 传统特征学习特征选择过滤式包裹式 L 1 L_1 L1​ 正则化 特征抽取监督的特征学习无监督的特征学习 特征工程作用 0.2.2 语义鸿沟0.2.3 表示方式关联 0.2.4 表示学习对比 0.3 深度学习0.3.1 表示学习与深度学习0.3.…

【数据库系统概论】数据定义之基本表的定义/创建、修改和删除

前言 &#x1f6a9;定义/创建基本表语法示例 修改基本表语法示例 删除基本表语法示例 感谢 &#x1f496; 前言 &#x1f6a9; SQL支持数据库系统的三级模式结构&#xff0c;其模式、外模式和内模式中的基本对象有表、视图和索引&#xff0c;因此&#xff0c;SQL的数据定义功能…

云原生Kubernetes:K8S集群kubectl命令汇总

目录 一、理论 1.概念 2. kubectl 帮助方法 3.kubectl 子命令使用分类 4.使用kubectl 命令的必要环境 5.kubectl 详细命令 一、理论 1.概念 kubectl是一个命令行工具&#xff0c;通过跟 K8S 集群的 API Server 通信&#xff0c;来执行集群的管理工作。 kubectl命令是操…

智慧楼宇3D数据可视化大屏交互展示实现了楼宇能源的高效、智能、精细化管控

智慧园区是指将物联网、大数据、人工智能等技术应用于传统建筑和基础设施&#xff0c;以实现对园区的全面监控、管理和服务的一种建筑形态。通过将园区内设备、设施和系统联网&#xff0c;实现数据的传输、共享和响应&#xff0c;提高园区的管理效率和运营效益&#xff0c;为居…

Maven系列:第1篇:什么是maven?为什么需要它?

maven系列目标&#xff1a;从入门开始开始掌握一个高级开发所需要的maven技能。 这是maven系列第1篇。 为什么我们要学习maven? 学习某些技术&#xff0c;肯定是我们遇到了某些问题&#xff0c;而这些问题目前手头上没有很好的方案去解决&#xff0c;此时刚好有一种技术可以…

增强现实抬头显示AR-HUD

增强现实抬头显示&#xff08;AR-HUD&#xff09;可以将当前车身状态、障碍物提醒等信息3D投影在前挡风玻璃上&#xff0c;并通过自研的AR-Creator算法&#xff0c;融合实际道路场景进行导航&#xff0c;使驾驶员无需低头即可了解车辆实时行驶状况。结合DMS系统&#xff0c;可以…

一个rar压缩包如何分成三个?

一个rar压缩包体积太大了&#xff0c;想要将压缩包分为三个&#xff0c;该如何做到&#xff1f;其实很简单&#xff0c;方法就在我们经常使用的WinRAR当中。 我们先将压缩包内的文件解压出来&#xff0c;然后查看一下&#xff0c;然后打开WinRAR软件&#xff0c;找到文件&…

7个在Github上的flutter开源程序

阅读大量代码是提高开发技能的最佳方法之一。该开源项目是了解最佳实践、编码风格和许多其他主题的最佳场所。 软件开发最受欢迎的领域之一是跨平台移动应用程序开发。Flutter 是您可以使用的最流行的跨平台移动应用程序开发工具之一。今天&#xff0c;我们将了解 7 个开源 Flu…

2023年中国烹饪机器人市场发展概况分析:整体规模较小,市场仍处于培育期[图]

烹饪机器人仍属于家用电器范畴&#xff0c;是烹饪小家电的进一步细分&#xff0c;它是烹饪小家电、人工智能和服务机器在厨房领域的融合。烹饪机器人是一种智能化厨房设备&#xff0c;可以根据预设的程序实现自动翻炒和烹饪&#xff0c;是多功能料理机和炒菜机结合的产物。 烹…

动画圆圈文字标志效果

效果展示 CSS 知识点 实现圆圈文字animation 属性回顾 实现思路 从效果的实现思路很简单&#xff0c;其实就是两个圆圈就可以实现。外层大圆&#xff08;灰色&#xff09;用于圆圈文字的展示&#xff0c;而内圆&#xff08;藏青色&#xff09;主要用于存放 Logo 图片。布局采…

OpenCV4(C++)—— 仿射变换、透射变换和极坐标变换

文章目录 一、仿射变换1. getRotationMatrix2D()2. warpAffine() 二、透射变换三、极坐标变换 一、仿射变换 在OpenCV中没有专门用于图像旋转的函数&#xff0c;而是通过图像的仿射变换实现图像的旋转。实现图像的旋转首先需要确定旋转角度和旋转中心&#xff0c;之后确定旋转…