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

【 React 】对React中类组件和函数组件的理解?有什么区别?

相关文章:
1 React 中的类组件
2 React中的函数组件

1. 类组件

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

如果想要访问父组件传递过来的参数,可以通过this.props方式去访问
在组件中必须实现render方法,再通return中返回React对象

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

2. 函数组件

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

//函数组件
function Hello(props){return <h1>hello,{props.name}</h1>}

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

3. 区别

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

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

3.1 编写形式

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

3.2 状态管理

在hooks出来之前,函数组件就是无状态组件,不能保管组件的状态,不像类组件中调用的setState
如果想要管理state状态,可以用useState,如下:

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

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

3.3 生命周期

在函数组件中,并不存在生命周期 ,这是因为这些生命周期钩子都来自于继承的React.Component 所以,如果用到生命周期,就只能使用类组件
但是函数组件使用useEffect也能够完成替代生命周期的作用,这里给出一个简单例子

const FunctionComponent=()=>{useEffect(()=>{console.log('hello')},[])return <h1>hello,world</h1>}

上述例子对应类组件中的componentDidMount 生命周期
如果useEffect回调函数中return 一个函数,则return 函数会在组件卸载的时候执行,整如componentWillUnmount

const FunctionComponent=()=>{React.useEffect(()=>{return ()=>{console.log('bye')}},[])return <h1>bye,world</h1>}

3.4 调用方式

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

function SayHi(){return <p>hello ,rui </p>
}
const result=SayHi(props) //<p>hello ,rui </p>

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

//自己的代码
class SayHi extends React.Component{render(){return <h1>hello,rui</h1>}
}
//React 内部
const instance=new SayHi(props) //SayHi{}
const result=instance.render() //<p>hello ,rui </p>

3.5 获取渲染的值

函数组件代码对应如下

function ProfilePage(props) {const showInfo=()=>{alert('Hi'+props.user)}const handleClick=()=>{setTimeout(showInfo,5000)}return <button onClick={handleClick}>Hi</button>
}

类组件代码对应如下

class ProfilePage extends React.Component{showInfo(){alert('Hi'+this.props.user)  }handleClick(){setTimeout(this.showInfo.bind(this),5000)}render(){return <button onClick={this.handleClick.bind(this)}>Hi</button>}
}

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

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

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

4.总结

函数组件语法更短、更简单,这使得它更容易开发、测试和理解 。
类组件会因为大量使用this让人困惑。

相关文章:

  • 【Linux】文件系统和软硬链接
  • EPDM和钉钉集成审批工作—移动端直接处理审批节点,高效协同!
  • Java开发从入门到精通(一):Java 数据库编程
  • 小程序学习 1
  • Vue源码系列讲解——内置组件篇【一】(keep-alive)
  • Cassandra 安装部署
  • 【MySQL】not in遇上null的坑
  • Rust入门:C++和Rust动态库(dll)的相互调用
  • mysql数据库(下)
  • Python 装饰器decorator 圣经
  • html css 导航栏 2
  • 如何基于 esp-at 固件测试 TCP (UART 转 WiFi 透传)吞吐?
  • C语言 —— 图形打印
  • Centos8 使用编译安装nginx
  • 内网渗透-跨域环境渗透-1
  • 网络传输文件的问题
  • 分享一款快速APP功能测试工具
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • CentOS 7 防火墙操作
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • in typeof instanceof ===这些运算符有什么作用
  • JS变量作用域
  • Js基础知识(四) - js运行原理与机制
  • LeetCode算法系列_0891_子序列宽度之和
  • Nacos系列:Nacos的Java SDK使用
  • PAT A1120
  • React的组件模式
  • storm drpc实例
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 从零搭建Koa2 Server
  • 解析带emoji和链接的聊天系统消息
  • 类orAPI - 收藏集 - 掘金
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • Java总结 - String - 这篇请使劲喷我
  • 容器镜像
  • (06)金属布线——为半导体注入生命的连接
  • (2020)Java后端开发----(面试题和笔试题)
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (二)linux使用docker容器运行mysql
  • (二)构建dubbo分布式平台-平台功能导图
  • (附源码)python旅游推荐系统 毕业设计 250623
  • .CSS-hover 的解释
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .NET Remoting Basic(10)-创建不同宿主的客户端与服务器端
  • .net经典笔试题
  • .net之微信企业号开发(一) 所使用的环境与工具以及准备工作
  • @Bean, @Component, @Configuration简析
  • @SuppressLint(NewApi)和@TargetApi()的区别
  • [23] GaussianAvatars: Photorealistic Head Avatars with Rigged 3D Gaussians
  • [Android Pro] Notification的使用
  • [bbk5179]第66集 第7章 - 数据库的维护 03
  • [C#] 基于 yield 语句的迭代器逻辑懒执行
  • [C++]高精度 bign (重载运算符版本)
  • [C++参考]拷贝构造函数的参数必须是引用类型
  • [EFI]Lenovo ThinkPad X280电脑 Hackintosh 黑苹果引导文件