重學(xué) React 筆記:使用 PropTypes 進(jìn)行類型檢查

隨著應(yīng)用日漸龐大,你可以通過類型檢查捕獲大量錯(cuò)誤。 對于某些應(yīng)用來說,你還可以使用 FlowTypeScript 這樣的 JavaScript 擴(kuò)展來對整個(gè)應(yīng)用程序進(jìn)行類型檢查。然而即使你不用它們,React 也有一些內(nèi)置的類型檢查功能。要檢查組件的屬性,你需要配置特殊的 propTypes 屬性:

import PropTypes from 'prop-types';

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

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

PropTypes 包含一整套驗(yàn)證器,可用于確保你接收的數(shù)據(jù)是有效的。在這個(gè)示例中,我們使用了 PropTypes.string。當(dāng)你給屬性傳遞了無效值時(shí),JavsScript 控制臺將會打印警告。出于性能原因,propTypes 只在開發(fā)模式下進(jìn)行檢查。

PropTypes

下面是使用不同驗(yàn)證器的例子:

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,

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

  // 一個(gè) React 元素
  optionalElement: PropTypes.element,

  // 你也可以聲明屬性為某個(gè)類的實(shí)例,這里使用 JS 的
  // instanceof 操作符實(shí)現(xiàn)。
  optionalMessage: PropTypes.instanceOf(Message),

  // 你也可以限制你的屬性值是某個(gè)特定值之一
  optionalEnum: PropTypes.oneOf(['News', 'Photos']),

  // 限制它為列舉類型之一的對象
  optionalUnion: PropTypes.oneOfType([
    PropTypes.string,
    PropTypes.number,
    PropTypes.instanceOf(Message)
  ]),

  // 一個(gè)指定元素類型的數(shù)組
  optionalArrayOf: PropTypes.arrayOf(PropTypes.number),

  // 一個(gè)指定類型的對象
  optionalObjectOf: PropTypes.objectOf(PropTypes.number),

  // 一個(gè)指定屬性及其類型的對象
  optionalObjectWithShape: PropTypes.shape({
    color: PropTypes.string,
    fontSize: PropTypes.number
  }),

  // 你也可以在任何 PropTypes 屬性后面加上 `isRequired` 
  // 后綴,這樣如果這個(gè)屬性父組件沒有提供時(shí),會打印警告信息
  requiredFunc: PropTypes.func.isRequired,

  // 任意類型的數(shù)據(jù)
  requiredAny: PropTypes.any.isRequired,

  // 你也可以指定一個(gè)自定義驗(yàn)證器。它應(yīng)該在驗(yàn)證失敗時(shí)返回
  // 一個(gè) 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.'
      );
    }
  },

  // 不過你可以提供一個(gè)自定義的 `arrayOf` 或 `objectOf` 
  // 驗(yàn)證器,它應(yīng)該在驗(yàn)證失敗時(shí)返回一個(gè) Error 對象。 它被用
  // 于驗(yàn)證數(shù)組或?qū)ο蟮拿總€(gè)值。驗(yàn)證器前兩個(gè)參數(shù)的第一個(gè)是數(shù)組
  // 或?qū)ο蟊旧?,第二個(gè)是它們對應(yīng)的鍵。
  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.'
      );
    }
  })
};

限制單個(gè)子代

使用 PropTypes.element 你可以指定只傳遞一個(gè)子代

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
};

屬性默認(rèn)值

你可以通過配置 defaultPropsprops定義默認(rèn)值:

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

// 為屬性指定默認(rèn)值:
Greeting.defaultProps = {
  name: 'Stranger'
};

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

如果你在使用像 transform-class-properties 的 Babel 轉(zhuǎn)換器,你也可以在React 組件類中聲明 defaultProps 作為靜態(tài)屬性。這個(gè)語法還沒有最終通過,在瀏覽器中需要一步編譯工作。更多信息,查看類字段提議。

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

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

defaultProps 用來確保 this.props.name 在父組件沒有特別指定的情況下,有一個(gè)初始值。類型檢查發(fā)生在 defaultProps 賦值之后,所以類型檢查也會應(yīng)用在 defaultProps 上面。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 作為一個(gè)合格的開發(fā)者,不要只滿足于編寫了可以運(yùn)行的代碼。而要了解代碼背后的工作原理;不要只滿足于自己的程序...
    六個(gè)周閱讀 8,663評論 1 33
  • 以下內(nèi)容是我在學(xué)習(xí)和研究React時(shí),對React的特性、重點(diǎn)和注意事項(xiàng)的提取、精練和總結(jié),可以做為React特性...
    科研者閱讀 8,396評論 2 21
  • 3. JSX JSX是對JavaScript語言的一個(gè)擴(kuò)展語法, 用于生產(chǎn)React“元素”,建議在描述UI的時(shí)候...
    pixels閱讀 2,971評論 0 24
  • 原教程內(nèi)容詳見精益 React 學(xué)習(xí)指南,這只是我在學(xué)習(xí)過程中的一些閱讀筆記,個(gè)人覺得該教程講解深入淺出,比目前大...
    leonaxiong閱讀 2,931評論 1 18
  • GUIDS 第一章 為什么使用React? React 一個(gè)提供了用戶接口的JavaScript庫。 誕生于Fac...
    jplyue閱讀 3,700評論 1 11

友情鏈接更多精彩內(nèi)容