2015-01-07 11 views
10

私は、下にあるように、その子コンポーネントをマップして特定のタイプの子のみをフィルタリングする汎用コンポーネントを持っています。2つのコンポーネントの比較 - コンポーネントXのコンポーネントAのインスタンス

しかし、typeというプロパティを使用したのは単なる推測でしたが、私はそれがわかりません。それだけでなく、ロギングはそれが実行不可能な機能であることを示します。それに加えて、Browserifyを使用する際に回避しなければならない問題がいくつかあります。

もう1つの方法は、child.prototype.displayNameを読み取ることです。しかし、それも間違っていると感じます。

質問:基本的に、私は2つのReactJSコンポーネントが等しいかどうかを比較する確かな方法を探しています。

(更新:すべての後に悪くはない)

var Foo = React.createClass({ 
    render: function() { 
     return <div>Foo</div>; 
    } 
}); 

var Bar = React.createClass({ 
    render: function() { 
     return <div>Bar</div>; 
    } 
}); 

var Main = React.createClass({ 
    render: function() { 
     var filteredChildren = []; 

     filteredChildren = React.Children.map(function(child) { 
      if (child.type === Foo.type) { 
       return child; 
      } 
     }); 

     return (
      <div> 
       {filteredChildren} 
      </div> 
     ); 
    } 
}); 

React.render(<Main><Foo /><Bar /></Main>, document.body); 
+0

あなたはコンポーネントが等しいかを知りたいですか?等しいとは、それらが同じ出力をレンダリングすることを意味しますか? –

+1

いいえ、それは全く異なるかもしれません。私は彼らが同じReact.createClass()のインスタンスであるかどうかを知る必要があります。 – David

+1

関連:https://www.bountysource.com/issues/3127455-proptypes-define-children-component-type – David

答えて

12

私はあなたの例が正しいことだと思います。

確かに、React 0.12 child.type === Foo.typeでしか動作しません。
これは、反応中の0.12がdeprecating wrapper functionsのプロセスに関連しています。

0.13が外になると、child.type自体はFooになります。

Nitpick:this.props.children.map,this won't work when there is less than two childrenを使用しないでください。
代わりにReact.Children.mapを使用してください。

+0

光を流してくれてありがとう!これは 'child.type'がなぜ関数であるように見えるのかを説明しています。ニックピッキングに関しては、あなたはまったく正しいですし、確かにReact.Children.mapを使うべきです! – David

+2

この質問の例には特に言及していませんが、React.createClassを使用するのではなくES6クラスを作成すると、 'child.type.prototype instanceof Foo'のインスタンスを使用できます。 http://stackoverflow.com/questions/35584279/looping-this-props-children-how-do-i-test-their-type?stw=2) – mjohnsonengr

2

作成しているAPIの種類は、虚弱で混乱しています。要素をデータとして扱うべきではありません。フィルタリングが必要な場合は、データをコンポーネントに渡します。どのような意味で

<Main things={[ 
    {type: 'Foo', element: <Foo />}, 
    {type: 'Bar', element: <Bar />}, 
    {type: 'Bar', element: <div>I'm lying but it doesn't matter</div>}, 
]} /> 
var Main = React.createClass({ 
    render: function(){ 
     var filteredChildren = this.props.things.map(function(thing){ 
      return thing.type === 'Foo' ? thing.element : false; 
     }); 

     return <div>{filteredChildren}</div>; 
    } 
}); 
+1

これはほとんどの場合当てはまります。比較が正当なものであるという稀なケースがあります。たとえば、コンポーネントでサブコンポーネントがエクスポートされ、特定のタイプ(例: '

一部'です。 –

+1

そして、そのような場合にどちらがどちらであるかを知る必要があるのはなぜですか? Menu.Itemはメニューアイテムを描画し、Menu.Separatorはセパレータを描画します。そして、メニューはちょうどそのものをレンダリングし、条件付きでthis.props.childrenを含みます。 – FakeRainBrigand

+0

セパレータを除いて、渡された各子を「div」にラップしたいというユースケースがありました。あなたは正しいですが、 'Menu。アイテム '私は本当にこのチェックが必要ないでしょう - 私は各アイテムをラップするにはあまりにも怠惰でした。 –

関連する問題