react中的类(有状态)组件,函数(无状态)组件·示例,对比及组件样式引用方案(附代码)

目录

react组件分类

函数组件

创建函数组件的注意点

代码示例

函数组件的优点

类组件

创建类组件的注意点

代码示例

类组件的优点

有状态和无状态组件的区别

组件样式

行内样式

外链样式

css in js解决方案


react组件分类

在React中,有三种主要类型的组件:

1. 函数组件(Function Components):函数组件是使用函数定义的组件。它们接受输入参数(称为props),并返回一个React元素。函数组件没有自己的状态(state),也没有生命周期方法。它们通常用于描述无状态的、纯展示型的组件。

2. 类组件(Class Components):类组件是使用ES6类语法定义的组件。它们是React组件的一种常用形式,可以包含状态(state)和生命周期方法。类组件必须扩展`React.Component`类,并实现`render()`方法,该方法返回一个React元素。

3. 无状态函数组件(Stateless Functional Components):无状态函数组件是函数组件的一种特殊形式,它们没有内部状态(state)。这种组件类型的定义方式更简洁,只接收props并返回一个React元素。它们适用于纯展示型的简单组件。无状态函数组件在React 16.8版本之后引入的React Hooks之后变得更加常见和强大。

函数组件

函数组件(Function Components)是React中定义组件的一种方式,它是一种纯粹的JavaScript函数。函数组件接收props作为参数,并返回一个React元素来描述组件的输出。

函数组件是一种简单、轻量级的组件形式,适用于无状态的、只根据输入props进行渲染的组件。它们没有自己的内部状态(state)和生命周期方法,也不使用this关键字。相比于类组件,函数组件的语法更简洁,代码量更少。

创建函数组件的注意点
  • 函数的首字母必须要大写(这是规定,让别人能够区分这是一个组件并不是一个普通函)
  • 函数中必须要返回React元素(JSX)
代码示例
// 创建一个函数组件
const App = props => (<div className="app-root"><h1>欢迎学习react!!!</h1><p>这是一个react函数组件</p></div>
)
// 导出这个组件
export default App;
函数组件的优点
  1. 简洁性:函数组件的定义方式更简单,代码量更少,适用于简单的UI渲染,没有复杂的状态和生命周期要处理。

  2. 性能优化:由于函数组件没有内部状态和生命周期方法,它们在某些情况下可以比类组件更轻量级、更高效。

  3. 易于测试:函数组件是纯函数,只依赖于输入的props并返回输出,没有副作用。这使得它们更容易编写和测试。

如果需要在组件中使用内部状态、生命周期方法或其他React特性,或者需要进行复杂的逻辑处理,那么应该使用类组件。但是在React 16.8及以后的版本,可以使用Hooks API在函数组件中使用状态和其他React功能,使函数组件变得更强大和灵活。

类组件

类组件指的是在React中使用ES6 class语法来定义的组件。类组件通过扩展React.Component类来创建,可以包含内部状态(state)、生命周期方法和其他功能。

在类组件中,通过构造函数(constructor)来初始化内部状态,通过生命周期方法(componentDidMount、componentDidUpdate、componentWillUnmount等)来进行特定的操作(例如发起网络请求、订阅/取消订阅事件等),通过渲染方法(render)来返回一个React元素来描述组件的输出。

创建类组件的注意点
  • 我们创建的组件必须要继承React.Component这个父类
  • 必须要有render方法
  • render方法中必须要返回React元素(JSX)

注意:组件名的首字母必须大写。这是为了和普通的html标签区别开

代码示例
class Welcome extends React.Component {constructor(props) {super(props);this.state = {count: 0};}componentDidMount() {console.log("Component mounted.");}componentDidUpdate(prevProps, prevState) {console.log("Component updated.");}componentWillUnmount() {console.log("Component will unmount.");}render() {return <h1>Hello, {this.props.name}!</h1>;}
}

在上面的示例中,Welcome是一个类组件。它扩展了React.Component类,并定义了构造函数(constructor)、生命周期方法(componentDidMount、componentDidUpdate和componentWillUnmount)和渲染方法(render)

  • 构造函数:在构造函数中,我们通过super(props)调用父类的构造函数,然后初始化内部状态count为0。

  • 生命周期方法:在示例中,我们使用了几个常见的生命周期方法,包括componentDidMountcomponentDidUpdatecomponentWillUnmount。这些方法可用于在组件的不同生命周期阶段执行特定的操作,例如发起网络请求、订阅/取消订阅事件等。

  • 渲染方法:render方法是必须的,它负责返回一个React元素来描述组件的输出。在示例中,render方法返回一个包含问候语的标题元素(<h1>)。

类组件的优点
  1. 灵活性:类组件可以管理内部状态、处理生命周期、引入各种方法和功能,更适合处理复杂的逻辑和交互。

  2. 扩展性:类组件可以通过继承和复用来构建更复杂的组件层次结构。

有状态和无状态组件的区别

有状态组件和无状态组件的主要区别在于是否管理内部状态和是否使用生命周期方法。

1. 有状态组件(Stateful Components):

  • 管理内部状态:有状态组件可以通过state属性来管理内部状态。这意味着它可以保存和改变数据,并通过setState方法触发UI更新。有状态组件通常用于存储和操作数据,以及处理用户交互。
  • 使用生命周期方法:有状态组件可以使用生命周期方法来处理特定的阶段和事件。例如,componentDidMount在组件加载后调用,componentDidUpdate在组件更新后调用,componentWillUnmount在组件卸载前调用等。生命周期方法用于处理组件的生命周期和执行特定的操作,例如发起网络请求、订阅/取消订阅事件等。

2. 无状态组件(Stateless Components):

  • 不管理内部状态:无状态组件没有内部状态。它们只接收来自父组件的属性(props)作为输入,并根据这些属性渲染UI。无状态组件通常用于展示静态内容,没有自己的数据和状态。
  • 不使用生命周期方法:无状态组件没有生命周期方法。它们不会在特定的阶段和事件上执行任何操作或处理逻辑。无状态组件仅关注UI的呈现,根据传入的属性(props)渲染并返回React元素。

无状态组件相对于有状态组件具有以下优点:

  • 简洁:无状态组件没有内部状态和生命周期方法,代码相对简单,易于理解和维护。
  • 性能优化:由于没有状态的变化,无状态组件可以更好地进行优化。React可以更轻松地对其进行渲染和重用,并且消耗更少的内存。
  • 可复用性:无状态组件不依赖于特定的数据和状态,更易于复用,并且可以更容易地在组件层次结构中移动和组合。

总之,有状态组件适用于复杂的逻辑和交互,需要管理内部状态和使用生命周期方法。无状态组件适用于简单的UI呈现,不需要内部状态和生命周期方法。根据具体的应用场景和需求,可以选择合适的组件类型来开发。

组件样式

行内样式
  • 想给虚拟dom添加行内样式,需要使用表达式传入样式对象的方式来实现。
  • React推荐我们使用行内样式,因为React觉得每一个组件都是一个独立的整体
{ /* 注意这里的两个花括号,第一个表示我们在要JSX里插入JS了,第二个是对象的花括号 */
}
<p style={{color:'#c00', fontSize:'14px'}}>这是一个react函数组件</p>
行内样式需要写入一个样式对象,而这个样式对象的位置可以放在很多地方。例如
render 函数里、组件原型上、外链 js 文件中
外链样式
  • css样式写在一个单独的css文件中,然后在通过 import 导入
/* App.css */
.title {background: #ff0;
}
// App.js
import "./App.css";
<div className="title">欢迎学习React!</div>
css in js解决方案
  • css in js 解决方案其实就是将css样式写在js文件里面的一种技术
  • 现在比较热门的 css in js 解决方案的库有以下三种
  1. aphrodite:目前github上有4kstar
  2. radium:目前github上有6kstar
  3. styled-components:目前github上有17k多的stat
  • 使用方式,下面介绍 aphrodite 的使用方式。

1. 下载aphrodite

npm install --save aphrodite

2. 在组件中使用

import { StyleSheet, css } from 'aphrodite';
// 创建一个函数组件
const App = props => (<div><div className={css(styles.red)}>这里的背景色是红色的</div><div className={css(styles.hover)}>鼠标移上变成红色背景</div><div className={css(styles.small)}>当浏览器的宽度小于等于600px的时候这里是红色的</div><div className={css(styles.red, styles.blue)}>这里的背景色是蓝色的</div><div className={css(styles.blue, styles.small)}>当浏览器的宽度小于等于600px的时候这里是红色的,否则就是蓝色的</div></div>
)
// 定义css样式
const styles = StyleSheet.create({
red: {
backgroundColor: 'red'
},
blue: {
backgroundColor: 'blue'
},
hover: {
':hover': {
backgroundColor: 'red'
}
},
small: {
'@media (max-width: 600px)': {
backgroundColor: 'red',
}
}
});
// 导出这个组件
export default App;
  • radium使用
import Radium from 'radium';
// 创建一个函数组件
const App = props => (<div><div style={ styles.red }>这里的背景色是红色的</div></div>
)
// 定义css样式
const styles = {red: {"color": "#c00"}
}
export default Radium(App)
  • css module的使用
css 的文件名改为: App.module.css , 这样做会为你这个 css 文件下所有的 id 名或者 class 名添加一个随机的后缀名。这样就可以防止和其它的文件冲突了

使用

// App.js
import { Component } from 'react';
import style from "./App.module.css"
class App extends Component {render() {return (<div id="root" className={ style['app-root'] }>App</div>)}
}
export default App;

全局处理

:global('#root') {background: #eee;
}

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

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

相关文章

vue3全网最全教程-----(3)

目录 4. 路由 4.1. 【对路由的理解】 4.2. 【基本切换效果】 4.3. 【两个注意点】 4.4.【路由器工作模式】 4.5. 【to的两种写法】 4.6. 【命名路由】 4.7. 【嵌套路由】 4.8. 【路由传参】 query参数 params参数 4.9. 【路由的props配置】 4.10. 【 replace属性】…

Java基层医院信息化管理系统云HIS源码

医院信息系统&#xff08;HIS&#xff09;经历了从手工到单机再到局域网的两个阶段&#xff0c;随着云计算、大数据新技术迅猛发展&#xff0c;基于云计算的医院信息系统将逐步取代传统局域网HIS,以适应人们对医疗卫生服务越来越高的要求。 云HIS分系统功能 一、医疗业务子系统…

【操作系统】精选填空题

1.操作系统的4个基本特征( )( )( )( ) 2.设计操作系统要满足有效性的目标&#xff0c;有效性体现在提高系统&#xff08; &#xff09;和提高系统&#xff08; &#xff09;。 3. OS环境下的资源共享又称为资源复用&#xff0c;实现资源共享的方式包括&#xff08; &#xff09…

Kasada p.js (x-kpsdk-cd、x-kpsdk-cd、integrity)

提供x-kpsdk-cd的API服务 详细请私信~ 可试用~ 一、简述 integrity是通过身份验证Kasada检测机器人流量后获得的一个检测结果&#xff08;数据完整性&#xff09; x-kpsdk-cd 是经过编码计算等等获得。当你得到正确的解决验证码值之后&#xff0c;解码会看到如下图 二、cook…

@RequestParam详解——获取QueryString格式参数

获取QueryString格式参数&#xff08;RequestParam&#xff09; QueryString&#xff08;查询字符串&#xff09;是指URL中?符号后面的参数部分。它通常用于在HTTP请求中传递参数给服务器。 比如&#xff1a;http://localhost:8080/test?qapple&categoryfruit 其中&…

JavaScript 中的提升是什么

JavaScript中的提升&#xff08;Hoisting&#xff09;是指在代码执行之前&#xff0c;变量和函数的声明都会被提升到作用域的顶部。换句话说&#xff0c;变量和函数可以在它们被声明之前就可以使用。 变量提升: 在JavaScript中&#xff0c;变量的声明可以在赋值语句之前。在变…

C/C++ BM4 合并两个排序的链表

文章目录 前言题目1. 解决方案一1.1 思路概述1.2 源码 2. 解决方案二2.1 思路阐述2.2 源码 总结 前言 这道题采用两种方式&#xff0c;一种是直接插入法&#xff0c;还有一种就是递归调用。 题目 输入两个递增的链表&#xff0c;单个链表的长度为n&#xff0c;合并这两个链表…

用IDEA创建/同步到gitee(码云)远程仓库(保姆级详细)

前言&#xff1a; 笔者最近在学习java&#xff0c;最开始在用很笨的方法&#xff1a;先克隆远程仓库到本地&#xff0c;再把自己练习的代码从本地仓库上传到远程仓库&#xff0c;很是繁琐。后发现可以IDEA只需要做些操作可以直接把代码上传到远程仓库&#xff0c;也在网上搜了些…

【linux】head的用法 输出文件开头的内容

在linux可以用find查找一个文件&#xff0c;可以用grep查找符合要求的文件内容&#xff0c;但是有的时候希望查看文件的前几行或者后几行&#xff08;其实这种场景经常可以遇到&#xff0c;比如接触到日志分析的时候&#xff09;&#xff0c;那就应该使用head和tail这两个工具了…

Redis 数据库,忘记密码如何找回或重置

对于 Redis 数据库&#xff0c;如果忘记了密码&#xff0c;可以通过以下步骤进行密码重置&#xff1a; 找到 Redis 配置文件 redis.conf。通常情况下&#xff0c;该文件位于 Redis 安装目录下的 etc 或 conf 文件夹中。使用任意文本编辑器打开 redis.conf 文件。在文件中找到 …

Qt Creator可视化交互界面exe快速入门5

上一期介绍了加法计算器,本期介绍QObject定时器。 首先一样先建个工程,比如我这项目名为QObject 本期的任务就是制作图片在界面上显示,然后每秒定时切换,点击另一个暂停按钮,可以定格当前图片,即取消定时切换功能。 显示图片的我们可以使用显示里面的label 这个用于显示…

机场信息集成系统系列介绍(6):机场协同决策支持系统ACDM*续集

目录 1、A-CDM实施效果评估背景 2、评估核心指标项 &#xff08;1&#xff09;机位效率 &#xff08;2&#xff09;登机效率 &#xff08;3&#xff09;推出效率 &#xff08;4&#xff09;滑行效率 &#xff08;5&#xff09;协同效率 3、其他指标项 &#xff08;1&a…

计算机基础--Linux详解

一概述 Linux是一种自由和开放源码的类UNIX操作系统。它是由林纳斯托瓦兹于1991年首次发布的&#xff0c;并从那时起在全球范围内得到了广泛的应用和开发。Linux具有强大的可定制性&#xff0c;可以运行在各种硬件平台上&#xff0c;包括x86、ARM、MIPS等。它不仅广泛应用于服…

在 Linux 中使用 cat 命令

cat 命令用于打印文本文件的文件内容。至少&#xff0c;大多数 Linux 用户都是这么做的&#xff0c;而且没有什么问题。 cat 实际上代表 “连接(concatenate)”&#xff0c;创建它是为了 合并文本文件。但只要有一个参数&#xff0c;它就会打印文件内容。因此&#xff0c;它是用…

R语言孟德尔随机化研究工具包(1)---friendly2MR

friendly2MR是孟德尔岁随机化研究中的一个重要补充工具&#xff0c;可以批量探索因素间的因果关系&#xff0c;以及快速填补缺失eaf的数据&#xff0c;但是存在细微差异需要注意。 remotes::install_github("xiechengyong123/friendly2MR") library(friendly2MR)lib…

工程(十七)——自己数据集跑R2live

博主创建了一个科研互助群Q&#xff1a;772356582&#xff0c;欢迎大家加入讨论。 r2live是比较早的算法&#xff0c;编译过程有很多问题&#xff0c;通过以下两个博客可以解决 编译R2LIVE问题&解决方法-CSDN博客 r2live process has died 问题解决了_required process …

[设计模式 Go实现] 创建型~单例模式

使用懒惰模式的单例模式&#xff0c;使用双重检查加锁保证线程安全 代码实现 package singletonimport "sync"// Singleton 是单例模式接口&#xff0c;导出的 // 通过该接口可以避免 GetInstance 返回一个包私有类型的指针 type Singleton interface {foo() }// s…

华为交换机生成树STP配置案例

企业内部网络怎么防止网络出现环路&#xff1f;学会STP生成树技术就可以解决啦。 STP简介 在二层交换网络中&#xff0c;一旦存在环路就会造成报文在环路内不断循环和增生&#xff0c;产生广播风暴&#xff0c;从而占用所有的有效带宽&#xff0c;使网络变得无法正常通信。 在…

uni-app API接口扩展组件(uni-ui)

锋哥原创的uni-app视频教程&#xff1a; 2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中..._哔哩哔哩_bilibili2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中...共计23条视频&#xff0c;包括&#xff1a;第1讲 uni…

【Java | 多线程案例】定时器的实现

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【Java系列专栏】【JaveEE学习专栏】 本专栏旨在分享学习JavaEE的一点学习心得&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 这里写…