注意: 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