2017-02-01 3 views
0

私はReactに小さなToolbarコンポーネントを書いています。ここでは、それが使用されるべき方法は次のとおりです。子どもの複雑なPropTypeを指定する

<Toolbar> 
    <ToolbarButtonSearch /> 
    <ToolbarButtonFold /> 
</Toolbar> 

または

<Toolbar> 
    <ToolbarButtonSearch /> 
</Toolbar> 

または

<Toolbar> 
    <ToolbarButtonFold /> 
</Toolbar> 

私は、Toolbarが受け入れる唯一の子供たちがToolbarButtonSearchの一つであることを指定できるようにしたいと思いますToolbarButtonFoldのいずれか、またはそれぞれのいずれかです。ここで

export default class Toolbar extends React.Component { 

    static get propTypes() { 
     const acceptedChildren = 
      React.PropTypes.oneOfType([ 
       React.PropTypes.instanceOf(ToolbarButtonFold), 
       React.PropTypes.instanceOf(ToolbarButtonSearch) 
      ]); 

     return { 
      children: React.PropTypes.oneOfType([ 
       React.PropTypes.arrayOf(acceptedChildren), 
       acceptedChildren 
      ]).isRequired 
     }; 
    } 

    render() { 
     return (
      <div className="toolbar"> 
       {this.props.children} 
      </div> 
     ); 
    } 
} 

私はそれを使用している方法は次のとおりです:ここで

は(輸入品を含めない)私が今持っているものだ

これは、次のエラーが発生し
<Toolbar> 
    <ToolbarButtonFold /> 
</Toolbar> 

Warning: Failed prop type: Invalid prop 'children' supplied to 'Toolbar'.

私は何が間違っているのか分かりません。どんな洞察も非常に役に立ちます。ありがとう!

+0

私はかなりあなたが試みていることを達成する方法がないと確信しています。 childrenプロパティはReact.PropTypes.node型であり、単一の要素または要素の配列に制限できますが、要素自体はコンポーネントクラスのインスタンスではありません。 –

+0

これは残念であり、率直に言って驚くべきことです。私は、Reactがこの機能を持つことを期待しています。 特定の子供たちを強制するより良いアプローチとしては何をお勧めしますか?そこにアプローチがありますか? – camden

答えて

1

あなたが実行しようとしましたしました:特定のコンポーネントを表示するかどう

customProp: function (props, propName, componentName) { 
    props.children.forEach(child => { 
     if (!child instanceof ToolbarButtonSearch && !child instanceof ToolbarButtonFold) { 
      return new Error(
       'Invalid children supplied to' + 
       ' `' + componentName + '`. Validation failed.' 
      ) 
     } 
    }) 
} 
+0

はい、問題は、 'Toolbar'が' Fold'と 'Search'の両方を含む場合をカバーしないことです。 – camden

+0

次に、2つのコンポーネントを 'ToolbarChildrenWrapper'の中にラップし、それをpropTypeとして定義することができます。このラッパーの中には、その一方または両方を持つことができます。 –

+0

それで 'Toolbar'コンポーネントは' Toobar'> 'ToolbarChildrenWrapper'>' [ToolbarFold、ToolbarSearch] 'のようになりますか?それはちょうど 'ToolbarChildrenWrapper'と同じ問題を作成します。 – camden

1

を代わりに部品を渡す(彼らはとにかく、ツールバーにインポートする必要があるため)、あなただけの定義小道具を渡すことができます。

const Toolbar = ({showButtonSearch = false, showButtonFold = false, buttonSearchProps = {}, buttonFoldProps = {}}) => { 

    return (

    <div className='Toolbar'> 

     {showButtonSearch ? <ButtonSearch {...buttonSearchProps} /> : null} 

     {showButtonFold ? <ButtonFold {...buttonFoldProps} /> : null} 

    </div> 

) 

} 

この方法はまた、あなたが子供のための小道具としてだけでなく、あなたが(そのような子どもたちに、特定の方法を発注など)の子どもを表示する前に必要な任意のさらなる機能を渡すことができるようになります。

+0

これは興味深いアプローチです。多数のコンポーネントで扱いにくいので、完璧な解決策ではありませんが、私のユースケースではうまくいくはずです。ありがとう! – camden

関連する問題