一、基础入门

1.1、首先你需要通过在终端安装一个叫prop-types的第三方包;

npm install prop-types

1.2、然后通过下面的写法对你的某一个组件的道具中的变量进行类型检测:

yourComponent.propTypes = {属性1:属性1的变量类型,属性2:属性2的变量类型//...
}

二、使用全解

2.1利用propTypes检测全部数据类型的变量

import React from 'react'class Son extends React.Component{render(){return (<div style ={{padding:30}}>{this.props.number}<br/>{this.props.array}<br/>{this.props.boolean.toString()}</div>)}
}
class Father extends React.Component{render(){return (<Sonnumber = {'1'}array = {'[1,2,3]'}boolean = {'true'}/>)}
}

比如这个例子,我们通过道具从父组件向子组件传递属性,你原本试图通过数目,阵列和布尔这三个属性分别向子中传递一个数字,数组和一个布尔型数值,但由于你刚一下子追完了50多集“人民的名义”,导致你过度疲惫,把它们都写成了字符串,虽然渲染是正常的,但这可能会导致你接下来调用一些方法的时候发生错误,而系统并不提供任何提示。


让我们给它加上propTypes的类型检测:

import React from 'react'
import PropTypes from 'prop-types';
class Son extends React.Component{render(){return (<div style ={{padding:30}}>{this.props.number}<br/>{this.props.array}<br/>{this.props.boolean.toString()}</div>)}
}
Son.propTypes = {number:PropTypes.number,array:PropTypes.array,boolean:PropTypes.bool
}
class Father extends React.Component{render(){return (<Sonnumber = {'1'}array = {'[1,2,3]'}boolean = {'true'}/>)}
}

然后我们就能看到报的错误了,而且这个时候,报的错误包括错误的道具属性名称,错误的变量类型,属性所在的组件名称,预期的正确的变量类型,错误代码的位置以及其他更详细的信息。

这种“人为控制”的报错比一般的系统报错看起来应该要亲切自然得多吧…你大可以说:这个错误是我“私人定制”的呦(//▽//)


propTypes能用来检测全部数据类型的变量,包括基本类型的的字符串,布尔值,数字,以及引用类型的对象,数组,函数,甚至还有ES6新增的符号类型

Son.propTypes = {optionalArray: PropTypes.array,//检测数组类型optionalBool: PropTypes.bool,//检测布尔类型optionalFunc: PropTypes.func,//检测函数(Function类型)optionalNumber: PropTypes.number,//检测数字optionalObject: PropTypes.object,//检测对象optionalString: PropTypes.string,//检测字符串optionalSymbol: PropTypes.symbol,//ES6新增的symbol类型
}

【注意】下面这些是从官方英文文档里引用过来的,你大概能够注意到,五种基本类型中的不确定和空并不在此列,propTypes类型检测的缺憾之一是,对于不确定的和无效的值,它无法捕捉错误

让我们把上述实例中的父组件传递给子组件修改一下,改成:

class Father extends React.Component{render(){return (<Sonnumber = {null}array = {null}boolean = {null}/>)}
}

结果是输出台不报任何错误,(当然你改成未定义也是同样效果)。

2.2 通过oneOfType实现多选择检测-可规定多个检测通过的数据类型

上个例子中类型检测的要求是一个变量对应一个数据类型,也就是规定的变量类型只有一个。那么怎样能让它变得灵活一些,比如规定多个可选的数据类型都为检测通过呢? PropTypes里的oneOfType方法可以做到这一点,oneOfType方法接收参数的是一个数组,数组元素是你希望检测通过的数据类型。

import React from 'react'
import PropTypes from 'prop-types';
class Son extends React.Component{
render(){
return (<div style ={{padding:30}}>
{this.props.number}
</div>)
}
}
Son.propTypes = {
number:PropTypes.oneOfType(
[PropTypes.string,PropTypes.number]
)
}
class Father extends React.Component{
render(){
//分别渲染数字的11和字符串的11
return (<div>
<Son number = {'字符串11'}/>
<Son number = {11}/>
</div>)
}
}

这时候,因为在类型检测中,号码属性的规定类型包括字符串和数字两种,所以此时控制台无报错


当然,如果你改为number = {数组或其他类型的变量},那么这时就会报错了

2.3 通过oneOf实现多选择检测-可规定多个检测通过的变量的值

3.2是规定了多个可检测通过的数据类型,那么同样的道理,我们也可以规定多个可检测通过的变量的值,这就要用到PropTypes里的oneOf方法,和PropTypes方法一样oneOf方法接收参数的是一个数组,数组元素是你希望检测通过的变量的值,比如我们把上面类型检测的部分改成:

Son.propTypes = {number:PropTypes.oneOf([12,13])
}

那么运行时就会报这样一段错误:

2.4 arrayOf,objectOf实现多重嵌套检测

试想一下,如果我们检测的是基本类型的变量,那么这自然是很简单的,但当我们要检测的是一个引用类型的变量呢?当我们除了检测这个变量是否符合规定的引用类型外(对象/阵列),还想要进一步检测对象中的属性变量或阵列中数组元素的数据类型时,单靠上面的方法已经不能满足要求了。这时候就要用到PropTypes的arrayOf,objectOf方法。

arrayOf接收一个参数,这个参数是规定的数组元素的数据类型.objectOf接收的参数则是属性的数据类型

我们对上述例子做些修改:

import React from 'react'
import PropTypes from 'prop-types';
class Son extends React.Component{render(){return (<div style ={{padding:30}}>{this.props.array}</div>)}
}
Son.propTypes = {array:PropTypes.arrayOf(PropTypes.number)
}
class Father extends React.Component{render(){return (<div><Son array = {[1,2,3,4]}/></div>)
}
}

正常渲染,然后我们把改为<Son array = {[‘1’,‘2’,‘3’,‘4’]} /> ,报错

【注意】虽然报错但是这并不会影响程序的正常运行(譬如上面我们看到渲染仍然是正常的),因为本质上说类型检测报的是非致命性错误的警告而不是致命性错误的错误(区别在于是否影响了正常运行)。对objectOf也是同样的做法

2.5 通过形状方法检测目标对象不同属性的不同数据类型

如果你认真思考一下的话,你会发现3.4中的objectOf有一个缺陷,就是它内部的属性的数据类型被强行规定为一种,但通常一个对象里应该是有多种不同类型的属性了,那么这时候objectOf就不符合要求了,我们应该使用形状方法,其用法:

PropTypes.shape({属性1:类型1,属性2:类型2,//...
}),

举个例子:


import React from 'react'
import PropTypes from 'prop-types';
class Son extends React.Component{render(){return (<div style ={{padding:30}}>{'我的名字叫' + this.props.object.name}<br/>{'我的年龄是' + this.props.object.age}</div>)}
}
Son.propTypes = {object:PropTypes.shape({name:PropTypes.string,age:PropTypes.number})
}
class Father extends React.Component{render(){return (<div><Son object = {{name:'彭湖湾',age:20}}/></div>)}
}

无报错,把<Son object = {{name:‘彭湖湾’,年龄:20}} />改成<Son object = {{name:‘彭湖湾’,年龄:‘20’}} /> ,然后就能喜闻乐见得报错了

2.6通过isRequired检测道具中某个必要的属性(如果该属性不存在就报错)
有时候,我们在对某个变量进行类型检测时,我们不仅要求它符合预期的类型,同时也要求它是必须写入的,这时候就要用到isRequired。

【分析】

Son.propTypes = {number:PropTypes.number
}

这段代码的作用是当你在道具中写入号码属性且号码属性类型错误时给予报错提示,可如果你压根就没有写入号码属性呢?没错,什么错误都不会报。这就是使用isRequired的必要性

【栗子】

import React from 'react'
import PropTypes from 'prop-types';class Son extends React.Component{render(){return (<div style ={{padding:30}}>{this.props.number}</div>)}
}
Son.propTypes = {number:PropTypes.number
}
class Father extends React.Component{render(){return (<div><Son /></div>)}
}

控制台无任何输出

如果我们改成:

Son.propTypes = {number:PropTypes.number.isRequired
}

再运行,我们就又可以喜闻乐见得看到错误了:

【注意】在这里给大家提个问题:我们上述的写法是数量:PropTypes.number.isRequired,这要求数是数字类型,但如果你不想控制数的类型而仅仅是想控制它的必要性呢?难道写成号:isRequired或number:PropTypes.isRequired? 这个时候PropTypes.any就登场啦!它代表了该变量可取任何一种数据类型,所以你可以写成这样–number:PropTypes.any.isRequired

2.7应对更复杂的类型检测 - 将PropTypes的属性值写成函数

Son.propTypes = {prop:function(props,propName,componentName){if(/*判断条件*/){return new Error(/*错误的参数*/)}}
}

在属性prop的类型检测中,属性值是一个函数,在这里props是包含prop的props对象,propName是prop的属性名,componentName是props所在的组件名称,函数的返回值是一个Error对象

import React from 'react'
import PropTypes from 'prop-types';
class Son extends React.Component{render(){return (<div style ={{padding:30}}>{this.props.email}</div>)}
}
Son.propTypes = {email:function(props,propName,componentName){if(!/^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+/.test(props[propName])){return new Error('组件' + componentName+ '里的属性' + propName + '不符合邮箱的格式');}}
}
class Father extends React.Component{render(){return (<div><Son email = {2314838004}/></div>)}
}

在这里我们利用正则表达式检测传递到Son组件的email属性是否符合邮箱格式,如果不符合就抛出错误,那么2314838004显然不符合这一要求,所以我们就得到下面的demo:(其实加上qq.com就是我的邮箱啦 哈哈)

3、ES7下类型检测的新写法:

可能你觉得把propTypes写在类外看起来有些怪怪的,在ES7的静态类属性的支持下,你可以这样写:

class Son extends React.Component{
static propTypes = {//..类型检测
}
render(){return (/* 渲染*/)}
}

但注意,这在ES7下生效

4.props-types的独立与react.PropTypes的弃用

在上面我是利用props-types这个独立的第三方库来进行类型检测的,但在不久前(react V15.5以前),它使用的是react内置的类型检测,而不是第三方库(也就是说我们现在的prop-types是当初以react内置的PropTypes对象为基础分离出来的)

翻译成中文就是:

所以说在你也可以这样进行类型检测,虽然并不推荐(为了保持向下兼容这在最新版本的react上仍然是可用的)

Son.propTypes = {number:React.PropTypes.number
}

prop-types详解相关推荐

  1. Android 系统(200)---Android build.prop参数详解

    Android build.prop参数详解 前言 build.prop是Android系统中的一个重要的属性文件,它记录了Android系统运行的很多配置信息,当程序运行时需要某种系统状态时,会到该 ...

  2. Android 系统(95)---Android build.prop参数详解

    Android build.prop参数详解 前言 build.prop是Android系统中的一个重要的属性文件,它记录了Android系统运行的很多配置信息,当程序运行时需要某种系统状态时,会到该 ...

  3. Android build.prop参数详解

    前言 build.prop是Android系统中的一个重要的属性文件,它记录了Android系统运行的很多配置信息,当程序运行时需要某种系统状态时,会到该模块中进行读取,类似Window中的注册表对少 ...

  4. android rom 属性 分辨率,ROM的 build.prop参数详解

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 在/system下的build.prop文件是一个属性文件,在Android系统中很重要,记录了系统的设置和改变 以下是修改教程及一些build.prop ...

  5. sys.types详解

    sys.types (Transact-SQL) 每个系统类型和用户定义类型都在表中对应一行. 列名 数据类型 说明 名称 sysname 类型的名称. 在架构内是唯一的. system_type_i ...

  6. ajax jqxhr,jquery ajax 之 jqXHR 和 Data Types详解

    jQuery 发送的所有 Ajax 请求,内部都会通过调用 $.ajax() 函数来实现.通常没有必要直接调用这个函数,可以使用几个已经封装的简便方法,如$.get()和.post().如果你需要用到 ...

  7. build.prop参数详解和部分修改

    build.prop是Android系统中的一个重要的属性文件,它记录了Android系统的一些重要的设置信息,类似于/etc中的文件,改变它能够取得一些意想不到的效果,但是也正是因为build.pr ...

  8. curl mimetype类型_MIME types 详解

    MIME type 的全称是 Multipurpose Internet Mail Extensions (MIME) ,可以标志一个文件的类型.IANA 的网站上有一个正式的 MIME type 的 ...

  9. HSQLDB数据库使用详解(入门)及快速使用

    hsql数据库使用详解(入门)及快速使用 一.简介: hsql数据库是一款纯Java编写的免费数据库,许可是BSD-style的协议,如果你是使用Java编程的话,不凡考虑一下使用它,相对其 他数据库 ...

  10. vscode中setting.json配置详解

    vscode中的setting.json配置文件配置详解 话不多说上配置文件 大家按需复制到自己的setting.json配置文件中即可 [{// 控制是否在编辑器中显示 CodeLens." ...

最新文章

  1. Linux下通过进程名查询占用的端口
  2. mysql mysqld_multi 单机多进程
  3. LARS 最小角回归算法简介
  4. Lisp尺寸标注增加前后缀_汽车雨刷器也是有尺寸的,那具体的尺寸该如何分辨呢?...
  5. 【模型训练-loss】模型训练过程中train, test loss的关系及原因
  6. note.js和mysql的优劣_nginx与Node.js的优缺点是什么?
  7. C++ 对象模型(二)
  8. Scala实现Mapreduce程序4-----数据去重
  9. VMware Workstation 15 解锁Mac OS安装
  10. 亿图脑图-MindMaster-思维导图及亿图图示会员-史上超值活动
  11. 积分商城系统架构图_积分商城系统设计_OctShop
  12. Mandriva本地安装
  13. 笔趣看小说Python3爬虫抓取
  14. 徒步西藏旅游攻略之岗仁波齐神山之行
  15. Python机器学习:评价分类结果007TPR和FPR之间的关系
  16. 哔!您有一份程序员数学公式宝典,请查收
  17. AVL Cruise和MATLAB DLL联合仿真时快速生成Simulink模型的方法
  18. 按键控制8*8led点阵C语言程序,单片机按键控制8X8LED点阵屏显示图形 程序的几个问题...
  19. linux视频处理速度,Linux下视频处理
  20. CHATROOM项目整理

热门文章

  1. 玩转Java 8 Stream 系列二进阶(Collectors.mapping 、Collectors.reducing、Collectors.summarizingInt等)
  2. 如何将华为云服务器重做系统并保留其中的指定数据
  3. mysql leader/followers_half-sync/half-async 和 Leader/Followers 模式的主要区别
  4. SpringBoot的高级教程
  5. 使用python程序抓取天眼查,企查查和爱企查上的企业基本信息
  6. 点击图片播放音乐实现
  7. 【C++】2048游戏系列---优化模块第一稿【加载图片】
  8. css字体毛边属性设置
  9. 计算机技术论文搜索引擎,垂直搜索引擎核心技术研究及展望论文
  10. kafka-eagle 使用配置及远程jmx端口设置遇到的问题