---
id: reusable-components
title: 再利用可能なコンポーネント
permalink: reusable-components-ja-JP.html
prev: multiple-components-ja-JP.html
next: transferring-props-ja-JP.html
---
インターフェースをデザインするとき、明確に定義されたインターフェースでは共通のデザイン要素(ボタン、フォームフィールド、レイアウトコンポーネントなど)を再利用可能なコンポーネントにブレークダウンします。そのような方法をとることで、次にUIを作成する必要があるときに、書くコードが少なくて済みます。これは、開発速度を上げ、バグを減らし、導線を減らすことを意味します。
## Propのバリデーション
アプリが大きくなっていくにつれて、コンポーネントが正しく使われていることを保証することが役に立つようになります。`propTypes` を指定することでそういったことができるようになります。`React.PropTypes` はあなたが受け取ったデータが正しいことを認識するのに使われるバリデータを出力します。不正な値がpropに渡されたときは、警告がJavaScriptコンソールに表示されます。パフォーマンスの点で、 `propTypes` は開発モードでのみチェックされることに注意してください。異なるバリデータが提供された際の例を表すドキュメントは以下の通りです。
```javascript
React.createClass({
propTypes: {
// propがJSのプリミティブ型であると宣言できます。
// デフォルトで、以下は全てオプションです。
optionalArray: React.PropTypes.array,
optionalBool: React.PropTypes.bool,
optionalFunc: React.PropTypes.func,
optionalNumber: React.PropTypes.number,
optionalObject: React.PropTypes.object,
optionalString: React.PropTypes.string,
// 何でもレンダリングできます。number、string、要素やそれらを含む配列など。
optionalNode: React.PropTypes.node,
// Reactの要素。
optionalElement: React.PropTypes.element,
// propがクラスのインスタンスであるとの宣言もできます。
// JSのinstanceofオペレータを使用しています。
optionalMessage: React.PropTypes.instanceOf(Message),
// 以下をenumとして扱うことで、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` は上記のどの値にも繋げることができますが、
// propが提供されなかったときには警告が出ることに注意してください。
requiredFunc: React.PropTypes.func.isRequired,
// どのようなデータ型の値でも大丈夫です
requiredAny: React.PropTypes.any.isRequired,
// バリデータをカスタマイズすることもできます。
// 以下はバリデーションが落ちた時にはエラーを返します。
// `oneOfType` の中で動かなくなるので、 `console.warn` や throw はしないでください。
customProp: function(props, propName, componentName) {
if (!/matchme/.test(props[propName])) {
return new Error('Validation failed!');
}
}
},
/* ... */
});
```
## デフォルトのPropの値
Reactは以下のように、とても宣言的な方法で `props` のデフォルト値を定義できます。
```javascript
var ComponentWithDefaultProps = React.createClass({
getDefaultProps: function() {
return {
value: 'default value'
};
}
/* ... */
});
```
`getDefaultProps()` の結果は `this.props.value` が親コンポーネントで制限されなかった場合に値を保証するためにキャッシュされて使われます。これによって、自分自身でハンドルするための壊れやすいコードを何度も書くことなくpropsをただ安全に使うことができます。
## Propsの移動: ショートカット
Reactのコンポーネントに共通しているのは、単純な方法で基本的なHTML要素を拡張していることです。よく、
コンポーネントに渡されるHTML属性を、型付けを守るために、基本的なHTML要素にコピーしたいと考える人もいます。このようなことを行うために、JSXの _拡張された_ シンタックスを使うことができます。
```javascript
var CheckLink = React.createClass({
render: function() {
// 以下はCheckLinkに渡されたどんなpropsをとることができ、タグにコピーすることもできます。
return {'√ '}{this.props.children};
}
});
React.render(
React has been running for {this.state.seconds} seconds.
); } }); React.render(