欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

web前端高级React - React从入门到进阶之使用PropTypes进行类型检查

程序员文章站 2024-01-29 15:56:28
...

第二部分:React进阶

系列文章目录

第一章:React从入门到进阶之初识React
第一章:React从入门到进阶之JSX简介
第三章:React从入门到进阶之元素渲染
第四章:React从入门到进阶之JSX虚拟DOM渲染为真实DOM的原理和步骤
第五章:React从入门到进阶之组件化开发及Props属性传值
第六章:React从入门到进阶之state及组件的生命周期
第七章:React从入门到进阶之React事件处理
第八章:React从入门到进阶之React条件渲染
第九章:React从入门到进阶之React中的列表与key
第十章:React从入门到进阶之表单及受控组件和非受控组件
第十一章:React从入门到进阶之组件的状态提升
第十二章:React从入门到进阶之组件的组合使用
第十三章:React从入门到进阶之组件的组件的懒加载及上下文Context
第十四章:React从入门到进阶之Refs&DOM以及Refs转发
第十五章:React从入门到进阶之高阶组件
第十六章:React从入门到进阶之Render Props
第十七章:React从入门到进阶之使用PropTypes进行类型检查

PropTypes

  • 随着我们应用程序的不断扩大,有时候我们想给组件的属性添加一些类型限制,通过类型检查可以帮助我们捕获或避免一些错误。现在比较流行的是可以使用Flow或TypeScript等JavaScript扩展来做类型检查。但是如果我们不想用这些JavaScript扩展,指向用原生的JavaScript来实现类型检测也是可以的。React为我们提供了一套内置的检查功能 - propTypes。
  • 要想使用PropTypes进行类型检查,首先我们需要通过npm install 或yarn add 来安装prop-types库
  • 然后再通过import导入prop-types
  • 比如我们想限制一个组件的name prop为string类型,可以这样:
import PropTypes from 'prop-types';
class Greeting extends React.Component{
	render(){
		return <h1>Hello {this.props.name}</h1>
	}
}

//这里使用proptypes进行类型限制
Greeting.protTypes = {
	name: PropTypes.string
}

使用起来很简单。PropTypes提供了一系列验证群,可以用于确保组件接收到的数据类型是有效的。在本例中,我们使用了PropTypes.stirng。 当传入的prop的值类型不是string时,JavaScript控制台将会打出警告。

  • 出于性能方面考虑,PropTypes进制开发模式下进行检查

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,
	
	  // 任何可被渲染的元素(包括数字、字符串、元素或数组)
      // (或 Fragment) 也包含这些类型。
	  optionalNode: PropTypes.node,
	
	  // 一个 React 元素。
	  optionalElement: PropTypes.element,
	
	  // 一个 React 元素类型(即,MyComponent)。
	  optionalElementType: PropTypes.elementType,
	
	  // 也可以声明 prop 为类的实例,这里使用
	  // JS 的 instanceof 操作符。
	  optionalMessage: PropTypes.instanceOf(Message),
	
	  // 可以让 prop 只能是特定的值,指定它为
	  // 枚举类型。
	  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
	  }),
	  
	  // An object with warnings on extra properties
	  optionalObjectWithStrictShape: PropTypes.exact({
	    name: PropTypes.string,
	    quantity: PropTypes.number
	  }),   
	
	  // 可以在任何 PropTypes 属性后面加上 `isRequired` ,确保
	  // 这个 prop 没有被提供时,会打印警告信息。
	  requiredFunc: PropTypes.func.isRequired,
	
	  // 任意类型的数据
	  requiredAny: PropTypes.any.isRequired,
	
	  // 可以指定一个自定义验证器。它在验证失败时应返回一个 Error 对象。
	  // 请不要使用 `console.warn` 或抛出异常,因为这在 `onOfType` 中不会起作用。
	  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() {
    // 这必须只有一个元素,否则控制台会打印警告。
    const children = this.props.children;
    return (
      <div>
        {children}
      </div>
    );
  }
}

MyComponent.propTypes = {
  children: PropTypes.element.isRequired
};

默认 Prop 值

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

class Greeting extends React.Component {
  render() {
    return (
      <h1>Hello, {this.props.name}</h1>
    );
  }
}

// 指定 props 的默认值:
Greeting.defaultProps = {
  name: 'Alvin'
};

  • defaultProps 用于确保 prop 属性 在父组件没有指定值时,有一个默认值。
  • propTypes 类型检查发生在 defaultProps 赋值后,所以类型检查也适用于 defaultProps
    关于类型检查就到这里
    下一章节开始我们将开始学习React中专门用来配合函数组件使用的钩子函数(HOOK)