2016-12-26 1 views
1

このは、コンポーネント

class CarMaker extends React.Component { 
    constructor(props) { super(props); } 
    handleEvent() { /* common handler code */ } 

    getComponent() { 
     let component = null; 

     switch(type) { 
      case 'hatchback': 
       // unique logic about hatchbacks 
       // consider attribues computed inside each case 
       component = <HatchbackMaker {...hatchbackAttrs} />; 
       break; 
      case 'sedan': 
       component = <SedanMaker {...sedanAttrs} />; 
       break; 
      case 'truck': 
       component = <TruckMaker {...truckAttrs} />; 
       break; 
     } 
     // Is there any way to attach event handler like this dynamically? 
     component.onClick = this.handleEvent.bind(component); 
     return component; 
    } 

    render() { 
     let arr = []; 
     dataList.forEach(function(dataItem) { 
      arr.push(this.getComponent(dataItem.type)); 
     }, this); 

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

(変数で開催された)既存のコンポーネントへのonClickハンドラを追加して、「この」の値とそのコンポーネント自体をバインドするための最良の方法は何でしょうか。考えてみての反応しますか

私はこれらが含まれているのか分からないので、あなたが渡すことができます属性とは別に、上記の例で小道具を示している割り当て

getComponent() { 
     let component = null; 

     switch(type) { 
      case 'hatchback': 
       // unique logic about hatchbacks 
       // consider attribues computed inside each case 
       component = <HatchbackMaker {...hatchbackAttrs} onClick={this.handleEvent.bind(this)}/>; 
       break; 
      case 'sedan': 
       component = <SedanMaker {...sedanAttrs} onClick={this.handleEvent.bind(this)}/>; 
       break; 
      case 'truck': 
       component = <TruckMaker {...truckAttrs} onClick={this.handleEvent.bind(this)}/>; 
       break; 
     } 

     return component; 
    } 

onClickイベントを割り当てないのはなぜ

+0

いいえイベントを動的に追加する必要はありません。このためにはsetStateを使用する必要がありますが、間違った方法です。 これはあなたのコードのアーキテクチャ上の問題のようで、このようなコンポーネントに対してswitch文を使用しないでください。私はもっ​​と助けることができるように完全なコードを投稿してください。 dataListはどこから来たのですか? –

+0

'handleClick'にはどのようなコードがありますか? –

+0

私はあなたがアーキテクチャーについて何を言っているのか理解していますが、コンポーネントにonClick属性を動的に追加することができれば、繰り返しコードを節約できます。 'ホンダ・シティ'、 タイプ: 'セダン'、 shapeSVGURL: ''、 –

答えて

0

それぞれprop attributesも同様です。

+0

私の例の文脈におけるthis.handleEvent.bind(this)は、必要に応じてHatchbakMaker/SedanMaker/TruckMakerの代わりにCarMakerを参照します。私はそれが作成された後にコンポーネントにバインドしたい。 –

-1

あなたは、入力されたタイプに基づいて代わりに動的にエレメントを作成したいと思っています。

開始時に大文字に変更してください。

など。 "セダン"→ "セダン"

または、大文字でJSを使用します。

class Cars extends React.Component { 
    constructor(props) { 
     super(props); 

     this.state = { 
      carData: [] 
     }; 
    } 
    OonClickHandler() { 
     /* common handler code */ 
    } 
    componentWillMount() { 
     //Api call to server to get car types just for example 
     $.ajax("someUrl", success: (data) => { 
      //[ { title: 'Honda City', type: 'sedan', shapeSVGURL: '<url>', . . //more properties . }, { title: 'VW Golf', type: 'hatchback', otherUniqueAttrs: [] . //more properties . } ] 
      this.setState({carData: data}); 
     }); 
    } 
    render() { 
     return (
      <div> 
       //Make sure that type has upper case later at start or use JS to make it so 
       this.state.carData.map(car => React.createElement(car[type], {...car, onClick={this.onClickHandler}})) 
      </div> 
     ) 
    } 
} 

class Honda extends React.Component { 
    render() { 
     return (

     ) 
    } 
} 

class VWGolf extends React.Component { 
    render() { 
     return (

     ) 
    } 
} 
+0

クリックイベントハンドラを既存のコンポーネントに関連付け、コンポーネント自体をハンドラにバインドするという基本的な質問には、私が尋ねたことに近いものではないと感じました。 –

+0

@BrieuceWayneこれはあなたが望むもので、イベントハンドラを動的にアタッチしません。 一般的な車がロジックを共有する場合は、そのロジックを車のクラスまで上げます。 –

+0

あなたの例では、共通ロジックをcarsクラスに移動することに同意します。これは、すべてのタイプのコンポーネントを処理する単一のメソッドが存在するように、私の例でCarMakerクラスのコンポーネントオブジェクトをハンドラにバインドする理由です。 –