博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
React文档(十五)使用propTypes进行类型检查
阅读量:6907 次
发布时间:2019-06-27

本文共 3653 字,大约阅读时间需要 12 分钟。

注意: React.PropTypes 自 React v15.5 起已弃用。请使用 prop-types 库代替。

随着你的应用的开发,你会使用类型检查的方法来捕获很多bug。对于一些应用,你可以使用js扩展就像Flow或者TypeScript去对整个应用进行类型检查。但是即使你不是用这些扩展语言,React也有一些内置的类型检查功能。在props上运行类型检查,你可以指派特殊的propTypes属性:

import PropTypes from 'prop-types';
class Greeting extends React.Component {  render() {    return (      

Hello, {
this.props.name}

); }}Greeting.propTypes = { name: PropTypes.string};

PropTypes导出一系列验证工具可以确保你接收到的数据是有效的。在这个例子里,我们使用PropTypes.string。当一个无效的值被作为prop提供时,一个警告就会出现在js控制台里。因为性能的原因,propTypes只是在开发环境里来使用。

PropTypes

下面是一个不同验证器的例子:

import PropTypes from 'prop-types';MyComponent.propTypes = {  // 你可以将属性声明为以下 JS 原生类型  optionalArray: PropTypes.array,  optionalBool: PropTypes.bool,  optionalFunc: PropTypes.func,  optionalNumber: PropTypes.number,  optionalObject: PropTypes.object,  optionalString: PropTypes.string,  optionalSymbol: PropTypes.symbol,  // 任何可被渲染的元素(包括数字、字符串、子元素或数组)。  optionalNode: PropTypes.node,  // 一个 React 元素  optionalElement: PropTypes.element,  // 你也可以声明属性为某个类的实例,这里使用 JS 的  // instanceof 操作符实现。  optionalMessage: PropTypes.instanceOf(Message),  // 你也可以限制你的属性值是某个特定值之一  optionalEnum: PropTypes.oneOf(['News', 'Photos']),  // 限制它为列举类型之一的对象  optionalUnion: PropTypes.oneOfType([    PropTypes.string,    PropTypes.number,    PropTypes.instanceOf(Message)  ]),  // 一个指定元素类型的数组  optionalArrayOf: PropTypes.arrayOf(PropTypes.number),  // 一个指定类型的对象  optionalObjectOf: PropTypes.objectOf(PropTypes.number),  // 一个指定属性及其类型的对象  optionalObjectWithShape: PropTypes.shape({    color: PropTypes.string,    fontSize: PropTypes.number  }),  // 你也可以在任何 PropTypes 属性后面加上 `isRequired`   // 后缀,这样如果这个属性父组件没有提供时,会打印警告信息  requiredFunc: PropTypes.func.isRequired,  // 任意类型的数据  requiredAny: PropTypes.any.isRequired,  // 你也可以指定一个自定义验证器。它应该在验证失败时返回  // 一个 Error 对象而不是 `console.warn` 或抛出异常。  // 不过在 `oneOfType` 中它不起作用。  customProp: function(props, propName, componentName) {    if (!/matchme/.test(props[propName])) {      return new Error(        'Invalid prop `' + propName + '` supplied to' +        ' `' + componentName + '`. Validation failed.'      );    }  },  // 不过你可以提供一个自定义的 `arrayOf` 或 `objectOf`   // 验证器,它应该在验证失败时返回一个 Error 对象。 它被用  // 于验证数组或对象的每个值。验证器前两个参数的第一个是数组  // 或对象本身,第二个是它们对应的键。  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.element你可以指定只能有一个子元素被作为children传递给一个组件。

 
import PropTypes from 'prop-types';
class MyComponent extends React.Component {  render() {    // This must be exactly one element or it will warn.    const children = this.props.children;    return (      
{children}
); }}MyComponent.propTypes = { children: PropTypes.element.isRequired};

默认prop值

你可以定义props的默认值通过分配特殊的defaultProps属性:

class Greeting extends React.Component {  render() {    return (      

Hello, {
this.props.name}

); }}// 为属性指定默认值Greeting.defaultProps = { name: 'Stranger'};// 渲染"Hello, Stranger":ReactDOM.render(
, document.getElementById('example'));
如果你在使用像 transform-class-properties 的 Babel 转换器,你也可以在React 组件类中声明 defaultProps 作为静态属性。这个语法还没有最终通过,在浏览器中需要一步编译工作。更多信息,查看类字段提议。
class Greeting extends React.Component {  static defaultProps = {    name: 'stranger'  }  render() {    return (      
Hello, {
this.props.name}
) }}

defaultProps会确保this.props.name将会有一个值如果它没有被父组件所指定。propTypes类型检查会在defaultProps解决了之后执行,因此defaultProps也会应用。

转载于:https://www.cnblogs.com/hahazexia/p/6478251.html

你可能感兴趣的文章
优化体系结构 - 混合运算实现 T+0查询
查看>>
java bean 对象属性复制框架BeanMapping-01-入门案例
查看>>
脑洞大开的翻转代码
查看>>
优化体系结构 - 数据外置减少中间表
查看>>
用ABAP代码读取S/4HANA生产订单工序明细
查看>>
海报推广神器:活码加多级加密跳转防封双重保护
查看>>
rabbitmq的基本使用
查看>>
深入 Nginx 之架构篇
查看>>
93. Restore IP Addresses
查看>>
环境变量python从版本2.x更改为3.x时,yum报错
查看>>
ant Table rowSelection勾选后更新数据无法清除缓存(无法取消勾选)
查看>>
【Linux系统编程】普通用户绑定(bind)特权端口
查看>>
代码编辑器Sublime_Text3的使用
查看>>
Docker Stack 部署web集群
查看>>
thinkphp源码分析(一)—开门篇
查看>>
猫叔产品读记 | 如何更好的玩转补贴、阿里入股B站商业化变现、儿童口腔市场怎么样?(3期)...
查看>>
Worse Is Better 思想的发展史
查看>>
力软移动框架 ionic cordova插件jpush-phonegap-plugin 极光推送配置方法 vs2017
查看>>
Will it finally: 关于 try/catch 的一些细节
查看>>
浅谈RPC
查看>>