[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.mzph.cn/news/841573.shtml

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

相关文章

lllllllllll

ollllllllllllll

Leetcode 3160. Find the Number of Distinct Colors Among the Balls

Leetcode 3160. Find the Number of Distinct Colors Among the Balls 1. 解题思路2. 代码实现 题目链接&#xff1a;3160. Find the Number of Distinct Colors Among the Balls 1. 解题思路 这一题思路上同样比较清晰&#xff0c;我们只需用两个hash table来分别记录每一个…

Nginx与CDN集成:提升全球访问速度

一、引言 在当今互联网高速发展的时代&#xff0c;用户对于网站访问速度的要求越来越高。为了提升用户体验&#xff0c;许多企业和开发者都在寻求各种方法来优化网站的访问速度。其中&#xff0c;Nginx与CDN&#xff08;内容分发网络&#xff09;的集成就是一个非常有效的方法…

社会网络,生态网络,贸易网络,复杂网络边介数蓄意和随机攻击

​边介数&#xff08;Edge Betweenness&#xff09; # ” 边介数&#xff08;Edge Betweenness&#xff09; 1 边介数&#xff08;Edge Betweenness&#xff09; Summer IS HERE 边介数&#xff08;Edge Betweenness&#xff09;是一种度量边在网络中重要性的指标。它定义为…

golang float转string并去除末尾的0

写go时遇到一个场景要求将得到的浮点数保留两位小数&#xff0c;同时要去除末尾的0&#xff0c;试了一下 fmt.Sprintf 和 strconv.FormatFloat 都没能一步到位&#xff0c;最后只能先按小数位约分然后再转成字符串来解决这个问题&#xff0c;如果各位有更好的方式请在评论里指教…

Linux dig 命令

dig 命令是一个用于在 Unix/Linux 操作系统中执行 DNS 查询的工具。它是 DNS 客户端&#xff0c;通常用于查询 DNS 服务器的信息&#xff0c;如域名解析、IP 地址查询等。 博主博客 https://blog.uso6.comhttps://blog.csdn.net/dxk539687357 一、常见 DNS 记录类型 类型描述…

OpenStack平台Nova管理

1. 规划节点 使用OpenStack平台节点规划 IP主机名节点192.168.100.10controller控制节点192.168.100.20compute计算节点 2. 基础准备 部署的OpenStack平台 1. Nova运维命令 &#xff08;1&#xff09;Nova管理安全组规划 安全组&#xff08;security group&#xff09;是…

设计模式八股文

什么是设计模式&#xff1f; 设计模式是软件开发过程中经常遇到的问题的通用解决方案。类似于前人总结的经验&#xff0c;遇到相似问题的时候有个参考。 设计模式七大基本原则&#xff1f; 单一职责&#xff1a;一个类应该只作一件事情。将功能分为小的独立的单元。开放封闭…

CTF之Web_python_block_chain

这种题对于我来说只能看大佬的wp&#xff08;但是这一题是wp都看不懂&#xff0c;只能表达一下我的理解了&#xff09; &#xff08;最后有简单方法&#xff0c;前面一种没看懂没关系&#xff09; 下面这一部分是首页的有用部分 访问/source_code,得到源码&#xff1a; # -*-…

qt post请求 c++ 解压缩文件

目录 qt post请求 c下载代码&#xff1a; 默认下载保存路径&#xff1a; linux qt调用 unzip进行解压缩 pro文件配置&#xff1a; QT network qt post请求 c下载代码&#xff1a; #include "mainwindow.h" #include "ui_mainwindow.h" #include &…

ffmpeg怎么将vtt文件添加到视频中

FFmpeg 是一个非常强大的多媒体框架&#xff0c;可以用来处理音频、视频以及字幕文件。要将 WebVTT&#xff08;.vtt&#xff09;字幕文件添加到视频文件中&#xff0c;你可以使用 ffmpeg 的 subtitles 过滤器。以下是基本的命令格式&#xff1a; ffmpeg -i input_video.mp4 -…

VSCode搭建Markdown编辑环境

1. 本文目标2. 准备工作3. 安装插件4. 插件的用法 4.1. Markdown All in One 4.1.1. 快捷键4.1.2. 创建/更新目录4.1.3. 给标题增加序号 4.2. Markdown Table 4.2.1. 格式化表格4.2.2. 插入表格列 4.3. Markdown PDF VSCode是笔者用过的最好用的开发工具&#xff0c;没有之一…

宁夏银川、山东济南、中国最厉害的改名大师的老师颜廷利教授的前沿思想观点

在当代社会&#xff0c;一个响亮的声音穿越了传统的迷雾&#xff0c;它来自东方哲学的殿堂&#xff0c;由一位现代学者颜廷利教授所发出。他的话语&#xff0c;如同一股清泉&#xff0c;在混沌的世界里激荡着思考的波澜&#xff1a;"有‘智’不在年高&#xff0c;无‘智’…

太空几乎没有阻力,飞船理论上能一直加速,为何还说星际旅行很难

太空几乎没有阻力&#xff0c;飞船理论上能一直加速&#xff0c;为何还说星际旅行很难&#xff1f; 答案 现代科学认为&#xff0c;我们的地球诞生于46亿年前&#xff0c;也就是太阳系诞生初期&#xff0c;在太阳系中一共有八大行星&#xff0c;而地球是唯一一颗诞生了生命的…

起保停电路工作原理

一、电路组成 起保停电路由电源保护设备&#xff08;空气开关&#xff09;、交流接触器、启动按钮、停止按钮和用电设备组成。 起保停电路的组成部分通常可分为四个部分&#xff1a; 保护部分&#xff1a;&#xff08;空气开关&#xff09;在电流或电压超出一定范围时自动切断…

异步获取线程执行结果,JDK中的Future、Netty中的Future和Promise对比

JDK中的Future和Netty中的Future、Promise的关系 三者源头追溯 Netty中的Future与JDK中的Future同名&#xff0c;但是是两个不同的接口。Netty中的Future继承自JDK的Future&#xff0c;而Promise又对Netty中的Future进行了扩展。 JDK中的Future源自JUC并发包&#xff1a; Net…

电商API接口(api商品数据)【电商商品实时数据采集API接口】

众多品牌选择电商API实时数据采集接口进行采购&#xff0c;主要是出于以下几个重要原因&#xff1a; 第一&#xff0c;高效便捷。比价工具通过自动化的方式获取价格信息&#xff0c;避免了繁琐的人工操作&#xff0c;大大节省了时间和精力。 第二&#xff0c;精准比较。API比价…

如何使用ssh将vscode 连接到服务器上,手把手指导

一、背景 我们在开发时&#xff0c;经常是window上安装一个vscode编辑器&#xff0c;去连接一个虚拟机上的linux&#xff0c;这里常用的是SSH协议&#xff0c;了解其中的操作非常必要。 二、SSH协议 SSH&#xff08;Secure Shell&#xff09;是一种安全协议&#xff0c;用于…

redis的基本命令

数据库相关操作 Redis默认 16 个数据库&#xff0c;默认使⽤第 0个 select 0 # 切换数据库 dbsize # 查看数据库⼤⼩ flushall # 清除全部库数据 flushdb # 清空当前库数据 key相关的操作 keys * # 查看所有的key exists key # 判断当前key 是否存在。 expire ke…

C#屏蔽基类成员

可以用与积累成员名称相同的成员来屏蔽 要让编译器知道你在故意屏蔽继承的成员&#xff0c;可以用new修饰符。否则程序可以成功编译&#xff0c;但是编译器会警告你隐藏了一个继承的成员 using System;class someClass {public string F1 "Someclass F1";public v…