1.基本說明
PropTypes定義爲組件類自身的屬性,用以定義prop的類型。在開發模式下,當提供一個不合法的值做爲prop時,控制檯會出現警告;javascript
在產品模式下,爲了性能考慮應忽略propTypes
Prop types 是一個在運行時使用的新特性. 咱們可以經過下面的方式在咱們的團隊裏邊使用.java
2.版本更新
在15.5版本以後, 代替使用 PropTypes 直接從 React 對象這種導入方式, 安裝一個新的包 prop-types 而且使用以下的方式進行導入:node
// After (15.5) import React from 'react'; import PropTypes from 'prop-types'; class Component extends React.Component { render() { return <div>{this.props.text}</div>; } } Component.propTypes = { text: PropTypes.string.isRequired, };
以下代碼,爲以前的書寫方式react
// Before (15.4 and below) import React from 'react'; class Component extends React.Component { render() { return <div>{this.props.text}</div>; } } Component.propTypes = { text: React.PropTypes.string.isRequired, }
因爲版本不一致,通常會致使以下錯誤:react-native
Unhandled JS Exception: Cannot read property 'string' of undefined
只要按照版本對應起來使用就能夠了數組
3.具體使用
靜態屬性,只能經過類名.屬性名指定性能
class Greeting extends React.Component { render() { return ( <h1>Hello, {this.props.name}</h1> ); } } Greeting.propTypes = { // 靜態屬性,只能經過類名.屬性名指定 name: PropTypes.string };
React.PropTypes輸出一系列的驗證器,用以確保你收到的數據是合法的。flex
下面是一個例子記錄了不一樣的驗證器;ui
MyComponent.propTypes = { // 能夠聲明prop是特定的JS基本類型 // 默認狀況下這些prop都是可選的 optionalArray:PropTypes.array, optionalBool: PropTypes.bool, optionalFunc: PropTypes.func, optionalNumber: PropTypes.number, optionalObject: PropTypes.object, optionalString: PropTypes.string, optionalSymbol: PropTypes.symbol, // 任何能夠被渲染的事物:numbers, strings, elements or an array // (or fragment) containing these types. optionalNode: PropTypes.node, // A React element. optionalElement: PropTypes.element, // 聲明一個prop是某個類的實例,用到了JS的instanceof運算符 optionalMessage: PropTypes.instanceOf(Message), // 用enum來限制prop只接受特定的值 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 }), // 你能夠用以上任何驗證器連接‘isRequired’,來確保prop不爲空 requiredFunc: PropTypes.func.isRequired, // 不可空的任意類型 requiredAny: 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對象 // 在array或者object中,驗證器對於每一個key都會被調用The first two // 驗證器的前兩個arguments是array或者object自身以及當前的key值 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.' ); } }) };
Requiring Single Child
你可使用React.PropTypes.element指定僅能夠將單一子元素做爲子節點傳遞給組件。this
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值
經過賦值特殊的defaultProps屬性,你能夠爲props定義默認值:
class Greeting extends React.Component { render() { return ( <h1>Hello, {this.props.name}</h1> ); } } // Specifies the default values for props: Greeting.defaultProps = { name: 'Stranger' }; // Renders "Hello, Stranger": ReactDOM.render( <Greeting />, document.getElementById('example') );
若是父組件沒有爲this.props.name傳值,defaultProps會給其一個默認值。propTypes的類型檢測是在defaultProps解析以後發生的,所以也會對默認屬性defaultProps進行類型檢測。
4.無狀態組件的檢查和默認設置
以下面所示,對無狀態組件進行設置
import React, { PureComponent } from 'react'; import PropTypes from 'prop-types'; import { View, Text, TextInput } from 'react-native'; const TextSegment = (props) => { const { behindStyle, delimiter, delimiterStyle, frontStyle, value, style, } = props; let frontValue = ''; let behindValue = ''; const splits = value && delimiter && value.split(delimiter); if (splits && splits.length) { frontValue = splits[0]; behindValue = splits[1]; } if (!delimiter) { return ( <View style={[{ flexDirection: 'row' }, style]}> <Text style={frontStyle}>{value}</Text> </View> ); } return ( <View style={[{ flexDirection: 'row' }, style]}> <Text style={frontStyle}>{frontValue}</Text> <Text style={delimiterStyle}>{delimiter}</Text> <Text style={behindStyle}>{behindValue}</Text> </View> ); }; TextSegment.propTypes = { frontStyle: TextInput.propTypes.style, delimiterStyle: TextInput.propTypes.style, behindStyle: TextInput.propTypes.style, style: View.propTypes.style, delimiter: PropTypes.string, value: PropTypes.string, }; TextSegment.defaultProps = { style: { alignItems: 'flex-end', }, value: '', }; export default TextSegment;
在上面代碼中,經過方法名進行引用propTypes和defaultProps,其餘用法和組件中使用一致。