[emailprotected](9)属性默认值和类型验证

目录

  • 1,属性默认值
    • 1.1,函数组件
    • 1.2,类组件
  • 2,属性类型验证
    • 2.1,和默认值的关系
    • 2.2,使用
    • 2.3,举例说明

1,属性默认值

通过组件的 defaultProps 静态属性设置。

1.1,函数组件

export default function FunDefault(props) {}FunDefault.defaultProps = {a: 1,b: 2,
};

1.2,类组件

export default class ClassDefault extends Component {}ClassDefault.defaultProps = {a: 1,b: 2,
};

export default class ClassDefault extends Component {static defaultProps = {a: 1,b: 2,};
}

无论是函数组件还是类组件,默认值和 props 都是先混合再使用。

  • 函数组件,在调用之前就完成了混合。
  • 类组件,在初始化的过程中完成混合,再运行构造函数。

2,属性类型验证

使用 React 官方的 prop-types 依赖进行检查。

PropTypes.any:// 任意类型
PropTypes.array:// 数组类型
PropTypes.bool:// 布尔类型
PropTypes.func:// 函数类型
PropTypes.number:// 数字类型
PropTypes.object:// 对象类型
PropTypes.string:// 字符串类型
PropTypes.symbol:// 符号类型PropTypes.node:// 任何可以被渲染的内容,字符串、数字、React元素
PropTypes.element:// react元素
PropTypes.elementType:// react元素类型
PropTypes.instanceOf(构造函数)// 必须是指定构造函数的实例
PropTypes.oneOf([xxx, xxx])// 枚举,属性必须是数组其中的一个
PropTypes.oneOfType([xxx, xxx]);  // 属性类型必须是数组中的其中一个
PropTypes.arrayOf(PropTypes.XXX)// 数组的每一项必须满足类型要求
PropTypes.objectOf(PropTypes.XXX)// 对象的属性值必须由某一类型的组成
PropTypes.shape(对象): // 属性必须是对象,并且满足指定的对象要求
PropTypes.exact({...})// 对象必须精确匹配传递的数据//自定义属性检查,如果有错误,返回错误对象即可
属性: function(props, propName, componentName) {//...
}

2.1,和默认值的关系

先进行混合,在进行验证。

2.2,使用

import React, { Component } from 'react'
import PropTypes from "prop-types";export default class Validate extends Component {static defaultProps = {a: 1,};static propTypes = {a: PropTypes.number.isRequired // isRequired 表示必填。c: PropTypes.any, // 1. 可以设置必填 2. 阵型保持整齐(所有属性都在该对象中)}
}

介绍一些特殊的:

1,.node

虽然传递 nullundefined 时不会报错,那是因为直接当做没有属性传递。如果加上非空验证,就会报错了。

2,.elementType

表示组件类型。相当于传递的是组件名或构造函数本身。

注意,组件在使用时 <Comp />,其实使用的是 new 出来的组件实例

3,.shapre

只要传递了指定的属性,那就得满足要求。其他的属性不限制。

4,.exact

相比 .shape 是精确匹配,属性不能多也不能少。

5,不能在自定义验证函数中,调用 PropTypes 自带的函数

2.3,举例说明

import React, { Component } from 'react'
import PropTypes from "prop-types";export class A {}export default class ValidationComp extends Component {//先混合属性static defaultProps = {b: false}//再调用相应的函数进行验证static propTypes = {a: PropTypes.number.isRequired,b: PropTypes.bool.isRequired,onClick: PropTypes.func, // onClick必须是一个函数c: PropTypes.any,d: PropTypes.node.isRequired, // d必填,而且必须是一个可以渲染的内容,字符串、数字、React元素e: PropTypes.element, // e必须是一个React元素F: PropTypes.elementType, // F必须是一个组件类型g: PropTypes.instanceOf(A), // g必须是A的实例sex: PropTypes.oneOf(["男", "女"]), // 属性必须是数组当中的一个h: PropTypes.arrayOf(PropTypes.number), // 数组的每一项必须是 numberi: PropTypes.objectOf(PropTypes.number), // 对象的每一个属性值必须是 numberj: PropTypes.shape({ // 对象的属性必须满足该对象的要求。name: PropTypes.string.isRequired, age: PropTypes.number,address: PropTypes.shape({province: PropTypes.string,city: PropTypes.string})}),k: PropTypes.arrayOf(PropTypes.shape({ // 数组的元素是对象,对象又做了约束name: PropTypes.string.isRequired,age: PropTypes.number.isRequired})),m: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), // 是其中一个类型即可。score: function (props, propName, componentName) { // 自定义验证条件。console.log(props, propName, componentName);const val = props[propName];// 必填if (val === undefined || val === null) {return new Error(`invalid prop ${propName} in ${componentName}${propName} is Required`);}// 该属性必须是一个数字if (typeof val !== "number") {return new Error(`invalid prop ${propName} in ${componentName}${propName} is not a number`);}const err = PropTypes.number.isRequired(props, propName, componentName);if(err){return err;}//并且取值范围是0~100if (val < 0 || val > 100) {return new Error(`invalid prop ${propName} in ${componentName}${propName} must is between 0 and 100`);}}}render() {const F = this.props.F; // 必须先赋值给一个变量,才能使用。return (<div><div>{this.props.d}<F /></div></div>)}
}

使用

import React from 'react'
import ValidationComp, { A } from "./ValidationComp"
import Comp from "./Comp"
export default function App() {return (<div><ValidationCompa={2}d={<Comp />}e={<Comp />}F={Comp}g={new A()}sex="男"h={[2, 3]}i={{a: 2}}j={{a: 3,name: "abc",age: 233,address: {province: "asdfa",city: "adsfasdf"}}}k={[{name:"asdf", age:33}]}m={23}score={"33"}/></div>)
}

以上。

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

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

相关文章

7款好用到离谱的神级App推荐!

AI视频生成&#xff1a;小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频https://aitools.jurilu.com/ 转眼间&#xff0c;2024年已经是下个月。最近有很多小伙伴的咨询&#xff0c;我也赶紧整理了7款好用的软件&#xff0c;希望对大家有所帮助。 …

Elasticsearch 分析器(内置分析器,自定义分析器,IK分析器)

Elasticsearch 分析器&#xff08;内置分析器&#xff0c;自定义分析器&#xff0c;IK分析器&#xff09; 内置分析器使用分析器自定义分析器中文分析器&#xff08;IK分析器&#xff09;安装使用添加词典 内置分析器 官网&#xff1a;https://www.elastic.co/guide/en/elasti…

03_前端三大件CSS

文章目录 CSS用于页面元素美化1.CSS引入1.1style方式1.2写入head中&#xff0c;通过写style然后进行标签选择器加载样式1.3外部样式表 2.CSS样式选择器2.1 元素选择器2.2 id选择器2.3 class选择器 3.CSS布局相关3.1 CSS浮动背景&#xff1a;先设计一些盒子因此&#xff0c;引出…

【qt】QTreeWidget 树形组件

QTreeWidget 树形组件 一.什么是树形组件二.界面设计树形组件三.代码实现1.清空2.设置列数3.设置头标签4.添加根目录①QTreeWidgetitem②设置文本③设置图标④添加为顶层目录 5.添加子目录①初始化为父目录②子目录添加到父目录③获取到子目录 四.插入目录1.获取当前选中目录项…

python数据类型之元组、集合和字典

目录 0.三者主要作用 1.元组 元组特点 创建元组 元组解包 可变和不可变元素元组 2.集合 集合特点 创建集合 集合元素要求 集合方法 访问与修改 子集和超集 相等性判断 集合运算 不可变集合 3.字典 字典特点 字典创建和常见操作 字典内置方法 pprin模块 0.…

Vxe UI 表单设计器、零代码平台

vxe-pc-ui Vxe UI 表单设计器、零代码表单设计器 安装 Vxe UI PC端组件库 官方文档 查看 github、gitee // ...import VxeUI from vxe-pc-uiimport vxe-pc-ui/lib/style.css// ...// ...createApp(App).use(VxeUI).mount(#app)// ...使用 vxe-form-design 设计器组件 vxe-fo…

分享活动规划

前两天去参加菁英学院的一些辅导&#xff0c;是关于苏州久富农业机械的发展&#xff0c;看了他们企业的故事&#xff0c;我觉得我们农机很有前景和发展空间&#xff0c;我希望重新经过一次分享活动来分享我的感触&#xff0c;希望能够再次把我学到的内容传输到其他班的同学们 请…

word 全文中 英文字体 和 样式的字体 莫名奇妙地 被改成 “等线”

word全文中英文字体和样式的字体莫名奇妙地被改成“等线” sm word又抽风了&#xff0c;改完论文保存后打开突然发现全文字体都不对劲&#xff0c;吓得冷汗直冒&#xff1a;虽然我用git管理了论文版本&#xff0c;但是只有比较大的修改我才上传了&#xff0c;刚刚修了几个小时…

Redis篇 redis基本命令和定时器原理

基本命令和定时器原理 一. exists命令二. del命令三. Expire命令四. ttl命令五. redis的过期策略六. 定时器的两种设计方式七. type命令 一. exists命令 用来判断key的值是否存在 返回值是key的个数 这样写的话&#xff0c;有没有什么区别呢&#xff1f; 效率变低&#xff0c;消…

猫抓(cat-catch)插件的常规用法

目录 1.1、前言1.2、抓取图片资源1.3、抓取音频资源1.4、抓取视频资源 1.1、前言 本文将介绍利用猫抓&#xff08;cat-catch&#xff09;插件如下抓取网页上的图片、音频、视频等资源&#xff0c;猫抓&#xff08;cat-catch&#xff09;插件的安装及设置请参考推荐一款媒体影音…

ionic关于@angular版本报错解决方案(有效)

最近学校要求使用ionicangular学习&#xff0c;但是出现下面问题&#xff0c;这里我就分享一个我亲测有效的解决方案&#xff0c;提供学习&#xff08;在VScode中&#xff09; npm error code ERESOLVE npm error ERESOLVE could not resolve npm error npm error While resol…

数据迁移测试经验分享

以下为作者观点&#xff1a; 数据迁移&#xff0c;是在保证新旧系统业务连续性的前提下&#xff0c;将数据从旧数据库迁移到新数据库的过程&#xff0c;测试前通过迁移策略和方案了解新旧系统数据如何重构与关联&#xff0c;测试过程需确保数据迁移的正确性&#xff0c;主要体…

vs2013使用qt Linguist以及tr不生效问题

一、qt Linguist&#xff08;语言家&#xff09;步骤流程 1、创建翻译文件,在qt选项中 2.选择对应所需的语言&#xff0c;得到.ts后缀的翻译文件 3.创建.pro文件&#xff0c;并将.ts配置在.pro文件中 3.使用qt Linguist 打开创建好的以.ts为后缀的翻译文件&#xff0c;按图所示…

吴恩达深度学习笔记:超 参 数 调 试 、 Batch 正 则 化 和 程 序 框 架(Hyperparameter tuning)3.4-3.5

目录 第二门课: 改善深层神经网络&#xff1a;超参数调试、正 则 化 以 及 优 化 (Improving Deep Neural Networks:Hyperparameter tuning, Regularization and Optimization)第三周&#xff1a; 超 参 数 调 试 、 Batch 正 则 化 和 程 序 框 架&#xff08;Hyperparameter …

BUUCTF-Misc24

从娃娃抓起1 1.打开附件 是两个文本文件 2.电报码 电报码在线翻译网站&#xff1a;https://usetoolbar.com/convert/cccn.html 3.汉字五笔编码 汉字五笔编码在线网站查询&#xff1a;https://www.qqxiuzi.cn/bianma/wubi.php 4.转化为MD5值 将文字保存到文本文档 用winR输入…

HarmonyOS应用开发者高级认证考试满分答案(100分)【全网最全-不断更新】

系列文章&#xff1a; HarmonyOS应用开发者基础认证满分答案&#xff08;100分&#xff09; HarmonyOS应用开发者基础认证【闯关习题 满分答案】 HarmonyOS应用开发者高级认证满分答案&#xff08;100分&#xff09; HarmonyOS云开发基础认证满分答案&#xff08;100分&#xf…

【三维修复、分割与编辑】InFusion、Bootstrap 3D、GaussianGrouping、GaussianEditor等(论文总结)

提示&#xff1a; 文章目录 前言一、InFusion&#xff1a;扩散模型助力&#xff0c;效率提高20倍&#xff01;(2024)1. 摘要2. 算法3. 效果 二、2D Gaussian Splatting三、Bootstrap 3D:从扩散模型引导三维重建1.摘要2.相关工作3.方法1.Boostrapping by Diffusion 通过扩散模型…

科技与心理学的协同舞蹈

在探讨盲人如何利用如“蝙蝠避障”这样的辅助软件融入日常生活的同时&#xff0c;我们不得不深入触及盲人教育心理学的核心&#xff0c;这一领域致力于理解盲人在学习与成长过程中独特的心理需求与挑战&#xff0c;以及如何通过教育策略激发他们的潜能&#xff0c;促进全面发展…

01-Linux【准备篇】

一、学Linux的作用&#xff1f; 1.Linux下开发(部署)软件项目 2.Linux运维 二、Linux的强与弱 1.薄弱 个人桌面领域的应用 此领域是传统Linux应用薄弱的环节&#xff0c;近些年随着Ubuntu、fedora等优秀桌面环境的兴起&#xff0c;Linux在个人桌面领域的占有率在慢慢提高…