2015-12-15 8 views
15

Reactコンポーネントを視覚的にテストしたい。ユーザーはフォームを使用してコンポーネントの小道具を変更できます。私は、React.PropTypes.oneOf(['green', 'blue', 'yellow'])に基づいて<select>をレンダリングできるようにしたいと考えています。抽出/読み取りpropypeに反応する

MyComponent.propTypesを読むと、Reactで定義された関数が返されます。プロップタイプを抽出/読み込む方法はありますか?

+0

をチェックしてくださいまた、プログラム的に多分 'getDefaultProps'機能を使用して、デフォルトの小道具を読むことができて、本当に興味深いものになるだろう。 – Vadorequest

答えて

7

あなたは、以来propTypesから直接読み取ることができません機能として。

代わりにpropTypesを生成する中間形式でpropTypeを定義することができます。

var myPropTypes = { 
    color: { 
    type: 'oneOf', 
    value: ['green', 'blue', 'yellow'], 
    }, 
}; 

function processPropTypes(propTypes) { 
    var output = {}; 
    for (var key in propTypes) { 
    if (propTypes.hasOwnProperty(key)) { 
     // Note that this does not support nested propTypes validation 
     // (arrayOf, objectOf, oneOfType and shape) 
     // You'd have to create special cases for those 
     output[key] = React.PropTypes[propTypes[key].type](propTypes[key].value); 
    } 
    } 
    return output; 
} 

var MyComponent = React.createClass({ 
    propTypes: processPropTypes(myPropTypes), 

    static: { 
    myPropTypes: myPropTypes, 
    }, 
}); 

その後、MyComponent.myPropTypesまたはelement.type.myPropTypesを経由して、カスタムpropTypes形式にアクセスすることができました。

このプロセスをやや簡単にするための助けがあります。

function applyPropTypes(myPropTypes, Component) { 
    Component.propTypes = processPropTypes(myPropTypes); 
    Component.myPropTypes = propTypes; 
} 

applyPropTypes(myPropTypes, MyComponent); 
+0

私は中間段階が必要ではないことを望んでいましたが、悲しいかな、それは簡単で、簡単で保守的です。 – GijsjanB

+2

もっと良い方法があるといいですね。私たちは実際に私のチームの1つについて考えました。試してみます。それが良いとすれば私はここにフィードバックを与えるでしょう。 – Vadorequest

+0

@ Vadorequestあなたは解決策を考え出すことができますか? –

2

あなたが行っていることのコード例を追加することがありますが、わかりませんがなぜpropTypeにアクセスしていますか? PropTypesには値は含まれていませんが、コンポーネントに渡されたさまざまな小道具の値の型が何であるかを予測します。

小道具を変更できるフォームをお持ちの場合は、選択コンポーネントをレンダリングするコンポーネントに小道具を渡していると仮定します。これらの小道具は、小道具オブジェクトからアクセスできます。

次を使用することができ、異なる種類の形を持つことができpropTypesを検証しようとしている場合:あなたはそれらが定義されている、言ったように

optionalUnion: React.PropTypes.oneOfType([ 
    React.PropTypes.string, 
    React.PropTypes.number, 
    React.PropTypes.instanceOf(Message) 
]) 
+1

彼は、コンポーネントのプロパティをエンドユーザに表示するために、Reactコンポーネントの定義済みの「propType」を動的に表示する必要があります。私は実際にドキュメントの目的のために、同じことをしたい。 – Vadorequest

+0

まさに!最近これを調べたり、それをさらに研究したりしていない。 – GijsjanB

関連する問題