2.Typechecking With PropTypes(使用propTypes进行类型检查)

React版本:15.4.2
**翻译:xiyoki **

随着应用程序的成长,你可以通过typechecking捕捉很多bug。对于某些应用程序,你可以使用Javascript扩展(如Flow或TypeScript)来对整个应用程序进行类型检查。但是即使你不使用这些,React也有一些内置的typechecking能力。要在组件的props上运行typechecking,可以指定特殊的propTypes属性:

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

Hello, {this.props.name}

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

React.PropTypes导出一系列验证器,可用于确保接收的数据有效。在这个例子中,我们正在使用React.PropTypes.string。当为prop提供无效值时,Javascript控制台中将显示警告。出于性能原因,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.'
      );
    }
  })
};

Requiring Single Child(需要单独的child)

对于React.PropTypes.element,你可以指定只有一个单独的child作为children被传递给组件。

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: React.PropTypes.element.isRequired };

Default Prop Values(默认的Prop值)

你可以为你的props定义默认的值,通过将特殊的defaultProps属性赋给props

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

Hello, {this.props.name}

); } } // Specifies the default values for props: Greeting.defaultProps = { name: 'Stranger' }; // Renders "Hello, Stranger": ReactDOM.render( , document.getElementById('example') );

defaultProps将被用于确保this.props.name有一个值,如果它的值不是由父组件指定。当defaultProps被处理后,propTypes类型检查将会进行,所以类型检查也将适用于defaultProps

你可能感兴趣的:(2.Typechecking With PropTypes(使用propTypes进行类型检查))