react使用PropTypes进行类型检查的种类

来源:网络 文章列表 2019-12-02 608
对Component设置propTypes属性,可以为Component的props属性进行类型检查。PropTypes提供了许多验证工具,用来帮助你确定props数据的有效性。在上面这个例子中,我们使用了PropTypes.stirng。意思是:name的值类型应该是string。

1.组件特殊属性——propTypes

对Component设置propTypes属性,可以为Component的props属性进行类型检查。

  1. import PropTypes from 'prop-types';
  2. class Greeting extends React.Component {
  3. render() {
  4. return (
  5. <h1>Hello, {this.props.name}</h1>
  6. );
  7. }
  8. }
  9. Greeting.propTypes = {
  10. name: PropTypes.string
  11. };

PropTypes提供了许多验证工具,用来帮助你确定props数据的有效性。在上面这个例子中,我们使用了PropTypes.stirng。意思是:name的值类型应该是string。 当Component的props接收到一个无效的值时,浏览器控制台就会输出一个警告。因此,<Greeting name={123}/> 控制台会出现如下警告:

处于性能原因,类型检查仅在开发模式下进行。

2.PropTypes的更多验证器

  1. import React from 'react';
  2. import PropTypes from 'prop-types';
  3. class MyComponent extends React.Component {
  4. render() {
  5. // 利用属性做更多得事
  6. }
  7. }
  8. MyComponent.propTypes = {
  9. //你可以定义一个属性是特定的JS类型(Array,Boolean,Function,Number,Object,String,Symbol)。默认情况下,这些都是可选的。
  10. optionalArray: PropTypes.array,
  11. optionalBool: PropTypes.bool,
  12. optionalFunc: PropTypes.func,
  13. optionalNumber: PropTypes.number,
  14. optionalObject: PropTypes.object,
  15. optionalString: PropTypes.string,
  16. optionalSymbol: PropTypes.symbol,
  17. //指定类型为:任何可以被渲染的元素,包括数字,字符串,react 元素,数组,fragment。
  18. optionalNode: PropTypes.node,
  19. // 指定类型为:一个react 元素
  20. optionalElement: PropTypes.element,
  21. //你可以类型为某个类的实例,这里使用JS的instanceOf操作符实现
  22. optionalMessage: PropTypes.instanceOf(Message),
  23. //指定枚举类型:你可以把属性限制在某些特定值之内
  24. optionalEnum: PropTypes.oneOf(['News', 'Photos']),
  25. // 指定多个类型:你也可以把属性类型限制在某些指定的类型范围内
  26. optionalUnion: PropTypes.oneOfType([
  27. PropTypes.string,
  28. PropTypes.number,
  29. PropTypes.instanceOf(Message)
  30. ]),
  31. // 指定某个类型的数组
  32. optionalArrayOf: PropTypes.arrayOf(PropTypes.number),
  33. // 指定类型为对象,且对象属性值是特定的类型
  34. optionalObjectOf: PropTypes.objectOf(PropTypes.number),
  35. //指定类型为对象,且可以规定哪些属性必须有,哪些属性可以没有
  36. optionalObjectWithShape: PropTypes.shape({
  37. optionalProperty: PropTypes.string,
  38. requiredProperty: PropTypes.number.isRequired
  39. }),
  40. // 指定类型为对象,且可以指定对象的哪些属性必须有,哪些属性可以没有。如果出现没有定义的属性,会出现警告。
  41. //下面的代码optionalObjectWithStrictShape的属性值为对象,但是对象的属性最多有两个,optionalProperty 和 requiredProperty。
  42. //出现第三个属性,控制台出现警告。
  43. optionalObjectWithStrictShape: PropTypes.exact({
  44. optionalProperty: PropTypes.string,
  45. requiredProperty: PropTypes.number.isRequired
  46. }),
  47. //加上isReqired限制,可以指定某个属性必须提供,如果没有出现警告。
  48. requiredFunc: PropTypes.func.isRequired,
  49. requiredAny: PropTypes.any.isRequired,
  50. // 你也可以指定一个自定义的验证器。如果验证不通过,它应该返回Error对象,而不是`console.warn `或抛出错误。`oneOfType`中不起作用。
  51. customProp: function(props, propName, componentName) {
  52. if (!/matchme/.test(props[propName])) {
  53. return new Error(
  54. 'Invalid prop `' + propName + '` supplied to' +
  55. ' `' + componentName + '`. Validation failed.'
  56. );
  57. }
  58. },
  59. //你也可以提供一个自定义的验证器 arrayOf和objectOf。如果验证失败,它应该返回一个Error对象。
  60. //验证器用来验证数组或对象的每个值。验证器的前两个参数是数组或对象本身,还有对应的key。
  61. customArrayProp: PropTypes.arrayOf(function(propValue, key, componentName, location, propFullName) {
  62. if (!/matchme/.test(propValue[key])) {
  63. return new Error(
  64. 'Invalid prop `' + propFullName + '` supplied to' +
  65. ' `' + componentName + '`. Validation failed.'
  66. );
  67. }
  68. })

3. 限制单个子元素

使用 PropTypes.element 你可以指定只有一个子元素可以被传递给组件。

  1. //将children限制为单个子元素。
  2. Greeting.propTypes = {
  3. name: PropTypes.string,
  4. children: PropTypes.element.isRequired
  5. };

如果如下方式引用Greeting组件:

  1. //传了两个子元素给组件Greeting那么,控制台会出现警告
  2. <Greeting name={'world'}>
  3. <span>子元素1</span>
  4. <span>子元素2</span>
  5. </Greeting>

警告如图:

4.指定默认属性值。

你可以给组件分配一个特殊的defaultProps属性。

  1. //给Greeting属性中的name值指定默认值。当组件引用的时候,没有传入name属性时,会使用默认值。
  2. Greeting.defaultProps = {
  3. name: 'Stranger'
  4. };

// ES6可以这样写

  1. class Greeting extends React.Component {
  2. static defaultProps = {
  3. name: 'stranger'
  4. }
  5. render() {
  6. return (
  7. <div>Hello, {this.props.name}</div>
  8. )
  9. }
  10. }

 

腾讯云限量秒杀

1核2G 5M 50元/年 2核4G 8M 74元/年 4核8G 5M 818元/年 CDN流量包 100GB 9元

版权声明

本站部分原创文章,部分文章整理自网络。如有转载的文章侵犯了您的版权,请联系站长删除处理。如果您有优质文章,欢迎发稿给我们!联系站长:QQ:1292237044
愿本站的内容能为您的学习、工作带来绵薄之力。

评论

  • 随机获取
点击刷新
精彩评论