公式のReact.jsライブラリドキュメントのAdvanced Guidesセクションの一連の翻訳の継続。
PropTypes-Reactでの型チェック
アプリケーションが大きくなると、多数のタイプチェックエラーが発生する可能性があります。 一部のアプリケーションでは、 FlowやTypeScriptなどのJavaScript拡張機能を使用して、アプリケーション全体を型チェックできます。 ただし、使用しない場合、Reactは組み込みの型チェック機能を提供します。
コンポーネントのコンポーネントタイプチェック(props)を実行するには、コンポーネントクラスの特別なプロパティpropTypes
定義できます。
class Greeting extends React.Component { render() { return ( <h1>Hello, {this.props.name}</h1> ); } } Greeting.propTypes = { name: React.PropTypes.string };
React.PropTypes
モジュールは、受信したデータの検証に使用できるバリデーターのセットをエクスポートします。 この例では、 React.PropTypes.string
バリデーターを使用します。 無効な値がプロパティに渡されると、JavaScriptコンソールに警告が表示されます。 パフォーマンスのために、 propTypes
は開発モードでのみチェックされます。
React.PropTypes
この例では、サポートされているさまざまなバリデーターが実装されています。
MyComponent.propTypes = { // , JavaScript . // , . // . 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, // -, React (): , , /, // . optionalNode: React.PropTypes.node, // React. optionalElement: React.PropTypes.element, // , . // JavaScript instanceof. optionalMessage: React.PropTypes.instanceOf(Message), // . 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 }), // . `React.PropTypes.func` , // . // `.isRequired` . // `.isRequired` . 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
を使用してReact.PropTypes.element
1つの子のみをコンポーネントに渡すことができるという制限を課すことができます。
class MyComponent extends React.Component { render() { // props.children . const children = this.props.children; return ( <div> {children} </div> ); } } MyComponent.propTypes = { children: React.PropTypes.element.isRequired };
デフォルトのプロパティ値
コンポーネントクラスの特別なプロパティdefaultProps
定義することprops
、 props
デフォルト値を定義できます。
class Greeting extends React.Component { render() { return ( <h1>Hello, {this.props.name}</h1> ); } } // props: Greeting.defaultProps = { name: 'Stranger' }; // "Hello, Stranger": ReactDOM.render( <Greeting />, document.getElementById('example') );
この例では、JSXコンポーネントで定義されていない場合、 defaultProps
値を使用してthis.props.name
を設定します。 propTypes
型検証はpropTypes
から値を設定した後に実行されるため、 defaultProps
から値を設定する場合にも型チェックが適用されます。
次の部分:
前の部分:
ソース: React-上級ガイド-PropTypesによる型チェック