PropTypes 在 React 中的使用心得

news2024/11/24 3:41:12

React 开发中,PropTypes 是一个非常有用的库,用于对组件的属性进行类型检查。它可以帮助我们在开发过程中捕获潜在的错误,提高代码的可靠性和可维护性。本文将介绍 PropTypes 的基本用法和一些使用心得。

React PropTypes

一、什么是 PropTypes

PropTypesReact 提供的一个用于类型检查的库。它可以用来验证组件的属性(props)是否符合预期的类型和格式。通过在组件中定义 PropTypes,我们可以确保组件在使用时传入正确的属性,并在属性类型不匹配时给出警告信息。

二、PropTypes 的基本用法

首先,我们需要下载安装 prop-types 库:

pnpm add -S prop-types

然后,我们需要在组件文件的顶部引入 PropTypes

import PropTypes from 'prop-types';

然后,在组件定义中使用 PropTypes 进行属性类型检查。例如,我们有一个名为 MyComponent 的组件,它接受一个名为 name 的字符串属性:

MyComponent.propTypes = {
  name: PropTypes.string
};

在上面的示例中,我们使用 PropTypes.string 来指定 name 属性的类型为字符串。如果在使用 MyComponent 时传入的 name 属性不是字符串类型,将会在控制台中显示警告信息。

PropTypes 提供了许多常用的数据类型检查器:

  • PropTypes.string
  • PropTypes.symbol
  • PropTypes.number
  • PropTypes.bigint
  • PropTypes.bool
  • PropTypes.func
  • PropTypes.array
  • PropTypes.object

节点类型检查器:

  • PropTypes.node
  • PropTypes.element
  • PropTypes.elementType

三、PropTypes 的高级用法

除了基本的数据类型检查器,PropTypes 还提供了一些特殊的类型检查器:

  • PropTypes.any.isRequired:任意类型且为必填项。
  • PropTypes.func.isRequired:函数类型且为必填项。
  • PropTypes.instanceOf:指定类的实例,例如 PropTypes.instanceOf(MyClass) 表示 MyClass 的实例。
  • PropTypes.oneOf:枚举类型,例如 PropTypes.oneOf(['red', 'green']) 表示 redgreen 之一。
  • PropTypes.oneOfType:多种类型中的一种,例如 PropTypes.oneOfType([PropTypes.string, PropTypes.number]) 表示字符串或数字类型之一。
  • PropTypes.arrayOf:数组类型,例如 PropTypes.arrayOf(PropTypes.string) 表示字符串数组,等价于 TS 中的 string[]
  • PropTypes.objectOf:对象类型,例如 PropTypes.objectOf(PropTypes.string) 表示字符串对象,等价于 TS 中的 { [key: string]: string }
  • PropTypes.shape:对象类型,例如 PropTypes.shape({ name: PropTypes.string.isRequired, age: PropTypes.number }) 表示对象中包含 nameage 属性,其中 name 属性为字符串类型且为必填项,age 属性为数字类型。等价于 TS 中的 { name: string, age?: number }
  • PropTypes.exact:限定对象类型,且可以指定对象的哪些属性必须有,哪些属性可以没有。如果出现没有定义的属性,会出现警告。例如 PropTypes.exact({ name: PropTypes.string, age: PropTypes.number }).isRequired 表示对象中包含 nameage 属性,且都为必填项。等价于 TS 中的 { name: string, age: number }

还可以高级自定义类型:

const Com = () => {
  return ()
}

Com.propTypes = {
  customProp: function(props, propName, componentName) {
    if (!/matchme/.test(props[propName])) {
      return new Error(
          'Invalid prop `' + propName + '` supplied to' +
          ' `' + componentName + '`. Validation failed.'
      );
    }
  },
  
  customArrayProp: PropTypes.arrayOf(function(propValue, key, componentName, location, propFullName) {
    if (!/matchme/.test(propValue[key])) {
      return new Error(
          'Invalid prop `' + propFullName + '` supplied to' +
          ' `' + componentName + '`. Validation failed.'
      );
    }
  })
};

四、PropTypes 设置默认值

您可以通过配置特定的 defaultProps 属性来定义 props 的默认值:

import { Tabs } from 'antd'
import PropTypes from 'prop-types'

const Com = ({ tabsData, showTabs }) => {
  const onChange = (key) => {
    console.log(key)
  }

  return (
    <>
      {showTabs && (
        <Tabs defaultActiveKey="1" items={tabsData} onChange={onChange} />
      )}
    </>
  )
}

Com.propTypes = {
  tabsData: PropTypes.array,
  showTabs: PropTypes.bool,
}

Com.defaultProps = {
  tabsData: [],
  showTabs: true,
}

export default Com

五、PropTypes 的使用心得

在实际开发中,我发现 PropTypes 对于团队协作和代码维护非常有帮助。以下是一些我在使用 PropTypes 过程中的心得体会:

  1. 提前发现错误:PropTypes 可以在开发阶段就发现潜在的错误,避免在运行时出现类型不匹配的问题。这有助于减少调试时间和提高代码质量。
  2. 文档化组件接口:通过定义 PropTypes,我们可以清晰地了解组件所需的属性类型和格式。这对于组件的使用者来说非常有帮助,可以更好地理解如何正确地使用组件。
  3. 团队协作:PropTypes 可以作为团队协作的一种规范,帮助团队成员理解组件之间的依赖关系和接口约定。它提供了一种统一的方式来定义和验证属性类型,减少了团队成员之间的沟通成本。
  4. 代码维护:PropTypes 可以帮助我们更好地理解代码的意图和结构。当我们需要修改或重构组件时,PropTypes 可以作为一个指导,帮助我们更快地理解组件的用途和关联关系。

总的来说,PropTypes 是一个非常有用的工具,可以提高代码的可靠性和可维护性。它可以帮助我们在开发过程中捕获潜在的错误,并提供清晰的接口文档。在实际项目中,我强烈推荐使用 PropTypes 来进行属性类型检查。

以上是我对 PropTypes 的使用心得,希望对你有所帮助!

参考资料:

  • React PropTypes 中文文档
  • PropTypes 库文档

欢迎访问:天问博客

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

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

相关文章

Python | Flask测试:发送post请求的接口测试

HTTP/1.1 协议规定的 HTTP 请求方法有OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE、CONNECT 几种。POST通常用来向服务端提交数据&#xff0c;主要用于提交表单、上传文件。 HTTP 协议是以ASCII码传输&#xff0c;建立在 TCP/IP 协议之上的应用层规范。规范把 HTTP 请求分为…

Linux服务器 部署飞书信息发送服务

项目介绍&#xff1a; 飞书信息发送服务是指将飞书信息发送服务部署到一个Linux服务器上。飞书是一款企业级的即时通讯和协作工具&#xff0c;支持发送消息给飞书的功能。通过部署飞书信息发送服务&#xff0c;可以方便内网发送信息给外网飞书。 项目代码结构展示&#xff1a; …

Android Jetpack之用Room+ViewModel+LiveData实现增删改查数据(createFromAsset())

文章目录 一、Room简介二、用RoomViewModelLiveData增删改查数据三、下载源码 一、Room简介 Room是Google推出的数据库框架&#xff0c;是一个 ORM (Object Relational Mapping)对象关系映射数据库、其底层还是对SQLite的封装。 Room包含三个主要组件&#xff1a; 数据库类&…

软考学习五部曲

视频学知识 学习知识环节看视频看书都可以&#xff0c;书很厚一本。如果要看完的话要很多时间&#xff0c;所以我觉得还是看视频更快一点&#xff0c;而且视频还可以倍速。我看的那个视频我觉得非常不错&#xff0c;但是我看的视频b站已经下架了看不到了。其他的视频没仔细去看…

掀起全新的互联网直播风潮

随着科技的不断进步和智能手机的普及&#xff0c;无人直播作为一种全新的互联网直播方式&#xff0c;在近些年迅速崛起&#xff0c;并引起了广泛关注。本文将围绕手机无人直播展开探讨&#xff0c;探究其背后的原因以及对社会生活带来的影响。 首先&#xff0c;我们需要明确什…

商业银行数据资产估值白皮书,推荐系统源码下载

2022年12月2日&#xff0c;中共中央、国务院印发《关于构建数据基础制度更好发挥数据要素作用的意见》&#xff08;以下简称“《数据二十条》”&#xff09;&#xff0c;指出要充分发挥海量数据规模和丰富应用场景优势&#xff0c;同时明确提出探索数据资产入表新模式。2023年8…

sql学习笔记(四)

1. 避免字段名与关键字冲突 1️⃣ 2️⃣ as 设置别名 2. 同比与环比 「同比」&#xff1a;与历史「同时期&#xff3d;比较&#xff0c;例如2011年3月份与2010年3月份相比&#xff0c;叫「同比」。 「环比」&#xff1a;与「上一个」统计周期比较&#xff0c;例如2011年4…

大数据HCIE成神之路之数据预处理(3)——数值离散化

数值离散化 1.1 无监督连续变量的离散化 – 聚类划分1.1.1 实验任务1.1.1.1 实验背景1.1.1.2 实验目标1.1.1.3 实验数据解析 1.1.2 实验思路1.1.3 实验操作步骤1.1.4 结果验证 1.2 无监督连续变量的离散化 – 等宽划分1.2.1 实验任务1.2.1.1 实验背景1.2.1.2 实验目标1.2.1.3 实…

macOS 安装 oh-my-zsh 后 node 报错 command not found : node

最近为了让终端中显示 git 分支的名称&#xff0c;安装了 oh-my-zsh &#xff0c;安装之后呢&#xff0c;我原先安装的 Volta、 node 都没法用了&#xff0c;报错如下&#xff1a; 这时候粗略判断应该是系统变量出了问题&#xff0c;oh-my-zsh 的变量文件是 ~/.zshrc&#xff0…

Postman测试文件上传接口

文章目录 一、Postman测试文件上传接口1、创建一个请求→选择请求方式→填写请求的URL→填写请求的参数值2、选择 "Body" → "form-data" → "Test" → "File"3、点击 "Select Files"4、选择要上传的文件5、点击 Send 进行测…

解决 Hive 外部表分隔符问题的实用指南

简介&#xff1a; 在使用 Hive 外部表时&#xff0c;分隔符设置不当可能导致数据导入和查询过程中的问题。本文将详细介绍如何解决在 Hive 外部表中正确设置分隔符的步骤。 问题描述&#xff1a; 在使用Hive外部表时&#xff0c;可能会遇到分隔符问题。这主要是因为Hive在读…

神经网络学习小记录76——Tensorflow2设置随机种子Seed来保证训练结果唯一

神经网络学习小记录76——Tensorflow2设置随机种子Seed来保证训练结果唯一 学习前言为什么每次训练结果不同什么是随机种子训练中设置随机种子 学习前言 好多同学每次训练结果不同&#xff0c;最大的指标可能会差到3-4%这样&#xff0c;这是因为随机种子没有设定导致的&#x…

项目进度管理:掌握进度管理技巧,保障项目不延期

项目进度问题通常在小型团队中并不显著&#xff0c;因为这类团队通常人数较少&#xff0c;成员间的沟通成本相对较低。这使得他们在执行项目时更加团结和协作。 然而&#xff0c;当团队规模扩大到上百人时&#xff0c;这使得沟通变得更为复杂&#xff0c;在这个庞大的团队中&…

数据可视化---离群值展示

内容导航 类别内容导航机器学习机器学习算法应用场景与评价指标机器学习算法—分类机器学习算法—回归机器学习算法—聚类机器学习算法—异常检测机器学习算法—时间序列数据可视化数据可视化—折线图数据可视化—箱线图数据可视化—柱状图数据可视化—饼图、环形图、雷达图统…

docker 部署kafka

随笔记录 目录 1. 安装zookeeper 2. 安装Kafka 2.1 拉取kafka image 2.2 查询本地docker images 2.3 查看本地 容器&#xff08;docker container&#xff09; 2.3.1 查看本地已启动的 docker container 2.3.2 查看所有容器的列表&#xff0c;包括已停止的容器。 2.4 …

ssm基于SSM的个人事务管理系统的设计和实现论文

摘 要 使用旧方法对个人事务管理信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在个人事务管理信息的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时纠正等问题。 这次开发的个人事…

表格实现合并单元格

实现的效果 一、列合并 此需求的列合并比较简单, 直接使用el-table-column包括即可 <el-table-column align"center" sortable label"目标"><el-table-column prop"target1" sortable label"预设目标" /><el-table-c…

红队打靶练习:SOLIDSTATE: 1

信息收集 1、arp ┌──(root㉿ru)-[~/kali] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:69:c7:bf, IPv4: 192.168.12.128 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.12.1 00:50:56:c0:00:08 …

pip的基本命令与使用

一、pip简介 pip是Python的包管理器&#xff0c;类似于其他编程语言中的包管理器&#xff0c;如Ruby的gem或Node.js的npm。它可以帮助你轻松地安装、更新和卸载Python包&#xff08;库或工具&#xff09;。你可以把pip想象成一个应用商店&#xff0c;你可以从中获取你需要的Py…