使用propTypes进行类型检查

React文档(十五)使用propTypes进行类型检查

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

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

Greeting.propTypes = {
  name: React.PropTypes.string
};
复制代码

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

React.PropTypes

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

复制代码
MyComponent.propTypes = {
  // You can declare that a prop is a specific JS primitive. By default, these
  // are all optional.
  optionalArray: React.PropTypes.array,
  optionalBool: React.PropTypes.bool,
  optionalFunc: React.PropTypes.func,
  optionalNumber: React.PropTypes.number,
  optionalObject: React.PropTypes.object,
  optionalString: React.PropTypes.string,
  optionalSymbol: React.PropTypes.symbol,

  // Anything that can be rendered: numbers, strings, elements or an array
  // (or fragment) containing these types.
  optionalNode: React.PropTypes.node,

  // A React element.
  optionalElement: React.PropTypes.element,

  // You can also declare that a prop is an instance of a class. This uses
  // JS's instanceof operator.
  optionalMessage: React.PropTypes.instanceOf(Message),

  // You can ensure that your prop is limited to specific values by treating
  // it as an enum.
  optionalEnum: React.PropTypes.oneOf(['News', 'Photos']),

  // An object that could be one of many types
  optionalUnion: React.PropTypes.oneOfType([
    React.PropTypes.string,
    React.PropTypes.number,
    React.PropTypes.instanceOf(Message)
  ]),

  // An array of a certain type
  optionalArrayOf: React.PropTypes.arrayOf(React.PropTypes.number),

  // An object with property values of a certain type
  optionalObjectOf: React.PropTypes.objectOf(React.PropTypes.number),

  // An object taking on a particular shape
  optionalObjectWithShape: React.PropTypes.shape({
    color: React.PropTypes.string,
    fontSize: React.PropTypes.number
  }),

  // You can chain any of the above with `isRequired` to make sure a warning
  // is shown if the prop isn't provided.
  requiredFunc: React.PropTypes.func.isRequired,

  // A value of any data type
  requiredAny: React.PropTypes.any.isRequired,

  // You can also specify a custom validator. It should return an Error
  // object if the validation fails. Don't `console.warn` or throw, as this
  // won't work inside `oneOfType`.
  customProp: function(props, propName, componentName) {
    if (!/matchme/.test(props[propName])) {
      return new Error(
        'Invalid prop `' + propName + '` supplied to' +
        ' `' + componentName + '`. Validation failed.'
      );
    }
  },

  // You can also supply a custom validator to `arrayOf` and `objectOf`.
  // It should return an Error object if the validation fails. The validator
  // will be called for each key in the array or object. The first two
  // arguments of the validator are the array or object itself, and the
  // current item's key.
  customArrayProp: React.PropTypes.arrayOf(function(propValue, key, componentName, location, propFullName) {
    if (!/matchme/.test(propValue[key])) {
      return new Error(
        'Invalid prop `' + propFullName + '` supplied to' +
        ' `' + componentName + '`. Validation failed.'
      );
    }
  })
};
复制代码

要求单个子元素

通过React.PropTypes.element你可以指定只能有一个子元素被作为children传递给一个组件。

复制代码
class MyComponent extends React.Component {
  render() {
    // This must be exactly one element or it will warn.
    const children = this.props.children;
    return (
      <div>
        {children}
      </div>
    );
  }
}

MyComponent.propTypes = {
  children: React.PropTypes.element.isRequired
};
复制代码

默认prop值

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

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

// Specifies the default values for props:
Greeting.defaultProps = {
  name: 'Stranger'
};

// Renders "Hello, Stranger":
ReactDOM.render(
  <Greeting />,
  document.getElementById('example')
);
复制代码

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
React PropTypes 是 React 库中的一个功能,用于对组件的属性进行类型检查。它可以帮助开发者在开发过程中捕获潜在的错误和 bug。 在使用 PropTypes 之前,需要先安装 prop-types 包。安装命令如下: ``` npm install prop-types ``` 然后,在需要进行属性类型检查的组件文件中,导入 PropTypes: ```js import PropTypes from 'prop-types'; ``` 接下来,在组件定义之后,可以使用 PropTypes 来定义组件接收的属性类型。 ```js MyComponent.propTypes = { name: PropTypes.string, age: PropTypes.number, isStudent: PropTypes.bool, onClick: PropTypes.func, config: PropTypes.shape({ title: PropTypes.string, description: PropTypes.string, }), }; ``` 上述代码中,我们通过 `PropTypes` 对象来定义了 `MyComponent` 组件接收的属性类型。例如,`name` 属性应该是一个字符串,`age` 属性应该是一个数字,`isStudent` 属性应该是一个布尔值,`onClick` 属性应该是一个函数,`config` 属性应该是一个对象,并且对象中应包含 `title` 和 `description` 两个属性。 如果传递给组件的属性类型不符合定义,React 会在开发模式下发出警告,并帮助我们找到问题所在。 PropTypes 提供了多种属性类型检查的方法,例如 `array`, `bool`, `func`, `number`, `object`, `string`, `symbol` 等等。还可以使用 `oneOfType` 来指定多个可能的属性类型,或者使用 `isRequired` 来指定某个属性是必需的。 总之,React PropTypes 是一种用于对组件属性进行类型检查的强大工具,它可以提高代码的可靠性和可维护性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值