React使用propTypes進行類型檢查

注意: React.PropTypes 自 React v15.5 起已棄用。請使用 prop-types 庫代替。
隨着你的應用的開發,你會使用類型檢查的方法來捕獲不少bug。對於一些應用,你可使用js擴展就像Flow或者TypeScript去對整個應用進行類型檢查。可是即便你不是用這些擴展語言,React也有一些內置的類型檢查功能。在props上運行類型檢查,你能夠指派特殊的propTypes屬性:node

// class定義中使用方法
import PropTypes from 'prop-types';
class Greeting extends React.Component {
  render() {
    return (
      <h1>Hello, {this.props.name}</h1>
    );
  }
}

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


// ES7中使用方法示例
class Greeting extends React.Component {
  //若是沒有傳遞該屬性時的默認值
  static defaultProps = {
    name: 'stranger'
  }
  //若是傳遞該屬性,該屬性值必須爲字符串
  static propTypes={
    name:PropTypes.string
  }
  render() {
    return (
      <div>Hello, {this.props.name}</div>
    )
  }
}

PropTypes導出一系列驗證工具能夠確保你接收到的數據是有效的。在這個例子裏,咱們使用PropTypes.string。當一個無效的值被做爲prop提供時,一個警告就會出如今js控制檯裏。由於性能的緣由,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,

  // 任何可被渲染的元素(包括數字、字符串、子元素或數組)。
  optionalNode: PropTypes.node,

  // 一個 React 元素
  optionalElement: PropTypes.element,

  // 你也能夠聲明屬性爲某個類的實例,這裏使用 JS 的
  // instanceof 操做符實現。
  optionalMessage: PropTypes.instanceOf(Message),

  // 你也能夠限制你的屬性值是某個特定值之一
  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
  }),

  // 你也能夠在任何 PropTypes 屬性後面加上 `isRequired` 
  // 後綴,這樣若是這個屬性父組件沒有提供時,會打印警告信息
  requiredFunc: PropTypes.func.isRequired,

  // 任意類型的數據
  requiredAny: PropTypes.any.isRequired,

  // 你也能夠指定一個自定義驗證器。它應該在驗證失敗時返回
  // 一個 Error 對象而不是 `console.warn` 或拋出異常。
  // 不過在 `oneOfType` 中它不起做用。
  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() {
    // This must be exactly one element or it will warn.
    const children = this.props.children;
    return (
      <div>
        {children}
      </div>
    );
  }
}

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

默認prop值ui

你能夠定義props的默認值經過分配特殊的defaultProps屬性:this

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

// 爲屬性指定默認值
Greeting.defaultProps = {
  name: 'Stranger'
};

// 渲染"Hello, Stranger":
ReactDOM.render(
  <Greeting />,
  document.getElementById('example')
);

若是你在使用像 transform-class-properties 的 Babel 轉換器,你也能夠在React 組件類中聲明 defaultProps 做爲靜態屬性。這個語法尚未最終經過,在瀏覽器中須要一步編譯工做。更多信息,查看類字段提議。code

class Greeting extends React.Component {
  static defaultProps = {
    name: 'stranger'
  }

  render() {
    return (
      <div>Hello, {this.props.name}</div>
    )
  }
}

defaultProps會確保this.props.name將會有一個值若是它沒有被父組件所指定。propTypes類型檢查會在defaultProps解決了以後執行,所以defaultProps也會應用。component

相關文章
相關標籤/搜索