为什么说函数组件要比类组件好呢,函数组件和类组件的区别你都清楚吗

news2024/11/20 14:30:09

一、类组件

类组件,顾名思义,也就是通过使用ES6类的编写形式去编写组件,该类必须继承React.Component

如果想要访问父组件传递过来的参数,可通过this.props的方式去访问

在组件中必须实现render方法,在return中返回React对象,如下:

class Welcome extends React.Component {constructor(props) {super(props)}render() {return <h1>Hello, {this.props.name}</h1>}
} 

二、函数组件

函数组件,顾名思义,就是通过函数编写的形式去实现一个React组件,是React中定义组件最简单的方式

function Welcome(props) {return <h1>Hello, {props.name}</h1>;
} 

函数第一个参数为props用于接收父组件传递过来的参数

三、区别

针对两种React组件,其区别主要分成以下几大方向:

  • 编写形式
  • 状态管理
  • 生命周期
  • 调用方式
  • 获取渲染的值

编写形式

两者最明显的区别在于编写形式的不同,同一种功能的实现可以分别对应类组件和函数组件的编写形式

函数组件:

function Welcome(props) {return <h1>Hello, {props.name}</h1>;
} 

类组件:

class Welcome extends React.Component {constructor(props) {super(props)}render() {return <h1>Hello, {this.props.name}</h1>}
} 

状态管理

hooks出来之前,函数组件就是无状态组件,不能保管组件的状态,不像类组件中调用setState

如果想要管理state状态,可以使用useState,如下:

const FunctionalComponent = () => {const [count, setCount] = React.useState(0);return (<div><p>count: {count}</p ><button onClick={() => setCount(count + 1)}>Click</button></div>);
}; 

在使用hooks情况下,一般如果函数组件调用state,则需要创建一个类组件或者state提升到你的父组件中,然后通过props对象传递到子组件

生命周期

在函数组件中,并不存在生命周期,这是因为这些生命周期钩子都来自于继承的React.Component

所以,如果用到生命周期,就只能使用类组件

但是函数组件使用useEffect也能够完成替代生命周期的作用,这里给出一个简单的例子:

const FunctionalComponent = () => {useEffect(() => {console.log("Hello");}, []);return <h1>Hello, World</h1>;
}; 

上述简单的例子对应类组件中的componentDidMount生命周期

如果在useEffect回调函数中return一个函数,则return函数会在组件卸载的时候执行,正如componentWillUnmount

const FunctionalComponent = () => {
 React.useEffect(() => { return () => { console.log("Bye"); };
 }, []);
 return <h1>Bye, World</h1>;
}; 

调用方式

如果是一个函数组件,调用则是执行函数即可:

// 你的代码 
function SayHi() { return <p>Hello, React</p > 
} 
// React内部 
const result = SayHi(props) // » <p>Hello, React</p > 

如果是一个类组件,则需要将组件进行实例化,然后调用实例对象的render方法:

// 你的代码 
class SayHi extends React.Component { render() { return <p>Hello, React</p > } 
} 
// React内部 
const instance = new SayHi(props) // » SayHi {} 
const result = instance.render() // » <p>Hello, React</p > 

获取渲染的值

首先给出一个示例

函数组件对应如下:

function ProfilePage(props) {const showMessage = () => {alert('Followed ' + props.user);}const handleClick = () => {setTimeout(showMessage, 3000);}return (<button onClick={handleClick}>Follow</button>)
} 

类组件对应如下:

class ProfilePage extends React.Component {showMessage() {alert('Followed ' + this.props.user);}handleClick() {setTimeout(this.showMessage.bind(this), 3000);}render() {return <button onClick={this.handleClick.bind(this)}>Follow</button>}
} 

两者看起来实现功能是一致的,但是在类组件中,输出this.props.userPropsReact中是不可变的所以它永远不会改变,但是 this 总是可变的,以便您可以在 render 和生命周期函数中读取新版本

因此,如果我们的组件在请求运行时更新。this.props 将会改变。showMessage方法从“最新”的 props 中读取 user

而函数组件,本身就不存在thisprops并不发生改变,因此同样是点击,alert的内容仍旧是之前的内容

最后

为大家准备了一个前端资料包。包含54本,2.57G的前端相关电子书,《前端面试宝典(附答案和解析)》,难点、重点知识视频教程(全套)。



有需要的小伙伴,可以点击下方卡片领取,无偿分享

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

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

相关文章

详解c++---类和对象(四)

这里写目录标题const成员再谈构造函数为什么会有初始化列表第一个问题第二个问题第三个问题初始化列表的使用方式即注意事项explicit关键字static成员static修饰类中的变量一些性质static修饰成员函数友元友元函数友元类内部类匿名对象拷贝对象时的一些编译器优化const成员 在…

【知识图谱】(task2)知识图谱表示

note 知识图谱的符号表示方法&#xff1a; 属性图是工业界最常见的图谱建模方法&#xff0c;属性图数据库充分利用图结构特点做了性能优化&#xff0c;实用度高&#xff0c;但不支持符号推理。RDF是W3C推动的语义数据交换标准与规范&#xff0c;有更严格的语义逻辑基础&#x…

dev_III笔记补充

1.在客户端显示form 思路&#xff1a; 想要在客户端显示form必须先把form放在 menu item中&#xff0c;然后通过url地址的方式打开form 步骤&#xff1a; 1.建立form 2.建立Menu Item &#xff08;特别注意&#xff1a;是display类型&#xff0c; 不是action类型 不是action类型…

【分布式技术专题】「架构设计方案」盘点和总结秒杀服务的功能设计及注意事项技术体系

秒杀应该考虑哪些问题 超卖问题 分析秒杀的业务场景&#xff0c;最重要的有一点就是超卖问题&#xff0c;假如备货只有100个&#xff0c;但是最终超卖了200&#xff0c;一般来讲秒杀系统的价格都比较低&#xff0c;如果超卖将严重影响公司的财产利益&#xff0c;因此首当其冲…

python爱心源代码集锦

python爱心源代码集锦 本文目录&#xff1a; 一、代码效果预览索引图 二、爱心源代码集锦 &#xff08;1&#xff09;、爱心图形1&#xff08;弧线型&#xff09;&#xff08;显示的文字写在代码里&#xff09; &#xff08;2&#xff09;、爱心图形2&#xff08;直线型&am…

MySQL 如何优化慢查询?

一、前言 在日常开发中&#xff0c;我们往往会给表加各种索引&#xff0c;来提高 MySQL 的检索效率。 但我们有时会遇到明明给字段加了索引&#xff0c;并没有走索引的Case。 进而导致 MySQL 产生慢查询。 严重场景下&#xff0c;甚至出现主从延迟、数据库拖垮的极端事故。 本…

微服务框架 SpringCloud微服务架构 28 数据同步 28.4 发送mq 消息

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构28 数据同步28.4 发送mq 消息28.4.1 直接开干28 数据同步 28.4 发送mq 消…

《Linux运维实战:使用Percona Backup for MongoDB逻辑备份与恢复Mongodb数据》

一、备份与恢复方案 Percona Backup for MongoDB 是一个开源、分布式和低影响的解决方案&#xff0c;用于MongoDB分片集群和副本集的一致备份。从版本1.7.0开始&#xff0c;Percona Backup for MongoDB支持物理和逻辑备份和恢复&#xff0c;仅支持对逻辑备份进行时间点恢复。 …

UIAutomator测试框架介绍

uiautomator简介 UiAutomator是Google提供的用来做安卓自动化测试的一个Java库&#xff0c;基于Accessibility服务。功能很强&#xff0c;可以对第三方App进行测试&#xff0c;获取屏幕上任意一个APP的任意一个控件属性&#xff0c;并对其进行任意操作&#xff0c;但有两个缺点…

软件测试面试笔试习题参考,你都会了吗?

目录 一、 简答题和应用题&#xff1a; 二、 填空题&#xff1a; 三、 判断题&#xff1a; 四、 选择题&#xff1a; 总结 重点&#xff1a;配套学习资料和视频教学 一、 简答题和应用题&#xff1a; 1. 什么是软件测试&#xff1f; 2. 比较软件测试过程和软件开发过程&a…

基于JavaScript中AES和MD5加密,以及简单二维码的生成

一、加密技术 1、对称加密&#xff1a;单密钥加密。一个密钥可以用来加密也可以用来解密 —- AES 2、非对称加密&#xff1a;有两把密码&#xff0c;公钥(用于加密)&#xff0c;私钥(用于解密) 3、摘要算法&#xff1a;把任意长度的输入&#xff0c;根据算法生成一串固定长度…

有环链表入口问题

有环链表入口问题 当快慢指针相遇时&#xff0c;我们可以判断到链表中有环&#xff0c;这时重新设定一个新指针指向链表的起点&#xff0c;且步长与慢指针一样为1&#xff0c;则慢指针与“新”指针相遇的地方就是环的入口。 图片来源:黑马程序员 证明: 设a为起点位置&#xff…

百变郁锦香,开创新典范,深化全球战略布局成就国际高端酒店品质之选

随着消费需求的不断升级&#xff0c;酒店消费场景也进行着多元化的发展&#xff0c;城市高端度假品牌正积极溯源消费需求&#xff0c;寻得品牌文化延伸的可靠路径。同时&#xff0c;各大酒店品牌也加快在市场布局的脚步&#xff0c;希望通过布局城市核心区域获得可持续发展的更…

Python绘制正二十面体

文章目录正二十面体的顶点绘制棱绘制面正二十面体的顶点 正20面体的12个顶点刚好可以分为三组&#xff0c;每一组都是一个符合黄金分割比例的长方形&#xff0c;而且这三个长方形是互相正交的。 所以&#xff0c;想绘制一个正二十面体是比较容易的 import numpy as np from …

大环配体配合物1407166-70-4,NODA-GA-NHS ester,NODA-GA-NHS 酯

●外观以及性质&#xff1a; NODA-GA-NHS ester产物呈固体或粘性液体&#xff0c;取决于PEG分子量&#xff0c;一般为白色固体&#xff0c;双功能大环化合物&#xff0c;大环配体配合物是指由多齿配体与环骨架上的O、N、P、S等多个配位原子形成的环配合物。 NODA-GA-NHS ester …

前端面试题2022-CSS篇

关于前端面试的题&#xff0c;最近整理了一些干货&#xff0c;经常被问到的一些问题&#xff0c;出现频率比较高的问题&#xff0c;如有不足之处&#xff0c;请高调指出&#xff0c;&#xff08;⭐代表难度&#xff0c;星星越多越难&#xff0c;以次类推&#xff09;&#xff0…

如何自动备份指定文件扩展名的文件?

关于文件扩展名 文件扩展名&#xff0c;一个点后跟几个字母&#xff0c;例如“.doc”或“.jpg”&#xff0c;构成计算机文档名称的结尾。保存文档时&#xff0c;请务必在单击“保存”之前输入文档名称和文件扩展名。 自动备份具有特定文件扩展名的文件 随着计算机的使用&…

第十章 鲁棒性检查(中)

文章目录10.5 时钟门控检查(Clock Gating Checks)高电平时钟门控(Active-High Clock Gating)10.5 时钟门控检查(Clock Gating Checks) 当一个门控信号&#xff08;gating signal&#xff09;可以控制逻辑单元中时钟信号&#xff08;clock signal&#xff09;的路径时&#xff…

最近面试遇到的面试题

先挖坑&#xff0c;有空再填坑&#xff01; 迭代器 生成器 常用高阶函数 MySQL 建索引几大原则 浅拷贝 深拷贝 区别 实现 Linux 进程名字 查看进程号 Linux 杀死一个进程 python Linux shell 脚本 数据库 主从复制 配置 nginx 权限设置 python 去除空行 pandas 保留最后一个空…

深入浅出 Swift 中的 some、any 关键字以及主关联类型(primary associated types)

问题现象 从 Swift 5.1 开始,Apple 陆续引入 some、any 关键字,并且从 Swift 5.7 开始对 any 关键字的用法做了增强,并且引入了主关联类型(primary associated types)的概念。 那么它们到底是什么意思?使用它们又能如何改进我们书写代码的范儿呢? 在本篇博文中,您将学…