隨着你的應用的變得愈來愈大,你能夠經過typechecking
來找到更多的bug。 對於某些應用,您可使用JavaScript擴展(如Flow
或TypeScript
)對整個應用程序進行類型檢查。 javascript
即便你不使用這些,React也有一些內置的typechecking
能力。 要在組件的props
上運行typechecking
,能夠分配特殊的propTypes
屬性:java
class Greeting extends React.Component { render() { return ( <h1>Hello {this.props.name}</h1> ) }; } Greeting.propTypes = { name: React.PropTypes.string.isRequired };
React.PropTypes
返回的是一系列驗證函數,用於確保接收的數據相似是不是有效的。
在這個例子中,咱們使用React.PropTypes.string.isRequire
檢測name
是否爲字符串,而且是必填的。
當爲prop提供無效值時,JavaScript控制檯中將顯示警告。 出於性能緣由,僅在開發模式下檢查propTypes
。node
下面是一個示例,其中提供了不一樣的驗證函數:數組
MyComponent.propTypes = { // 你能夠定義一個js原始類型的prop,默認請狀況下,這是都是可選的 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, // 任何能夠渲染的東西:數字,字符串,元素或數組(或片斷)。 optionalNode: React.PropTypes.node, // React元素 optionalElement: React.PropTypes.element, // 你也能夠聲明prop是某個類的實例。 內部使用的是JS的instanceof運算符。 optionalMessage: React.PropTypes.instanceOf(Message), // 你能夠經過將它做爲枚舉來確保你的prop被限制到特定的值。 optionalEnum: React.PropTypes.oneOf(['News', 'Photos']), // 能夠是許多類型之一的對象 optionalUnion: React.PropTypes.oneOfType([ React.PropTypes.string, React.PropTypes.number, React.PropTypes.instanceOf(Message) ]), // 某種類型的數組 optionalArrayOf: React.PropTypes.arrayOf(React.PropTypes.number), // 具備某種類型的屬性值的對象 optionalObjectOf: React.PropTypes.objectOf(React.PropTypes.number), // 採起特定樣式的對象 optionalObjectWithShape: React.PropTypes.shape({ color: React.PropTypes.string, fontSize: React.PropTypes.number }), // 你能夠用`isRequired`來鏈接到上面的任何一個類型,以確保若是沒有提供props的話會顯示一個警告。 requiredFunc: React.PropTypes.func.isRequired, // 任何數據類型 requiredAny: React.PropTypes.any.isRequired, // 您還能夠指定自定義類型檢查器。 若是檢查失敗,它應該返回一個Error對象。 不要`console.warn`或throw,由於這不會在`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: 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
,您能夠指定只有一個子元素能夠做爲內容傳遞的組件。函數
class MyComponent extends React.Component { render() { // 只能包含一個子元素,不然會給出警告 const children = this.props.children; return ( <div>{children}</div> ); } } MyComponent.propTypes = { children: React.PropTypes.element.isRequired }
您能夠經過使用defaultProps
屬性來定義props的默認值:性能
class Greeting extends React.Component { render() { return <h1>hello {this.props.name}</h1>; }; } // 若是name沒有傳值,則會將name設置爲默認的zhangyatao Greeting.defaultProps = { name: 'zhangyatao' } // 會渲染處<h1>hi zhangyatao</h1> ReactDOM.render( <Greeting />, document.getElementById('root') )
若是父組件沒有設置並傳入name
,defaultProps
將確保this.props.name
將有一個默認值。 propTypes
類型檢查發生在defaultProps
解析以後,所以類型檢查也將應用於defaultProps
。ui