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

第二部分: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)

猜你喜欢

转载自blog.csdn.net/lixiaosenlin/article/details/113397126