2016-08-09 18 views
0

ボタンを押すと、反応成分を動的に追加しようとしていますが、今はjQueryを使用していますが、コードは大変です。主な考え方は、私が <Button onClick={this.addProcess} data-mode="Hadoop"><Icon name="plus"/></Button> を押すとプロセスがサーバーに接続されます。これはすべてのロジックを持っているonClick={this.addProcess}によって処理されます。追加反応コンポーネント

私のjQueryを使用してコード:

var React = require('react'); 
var ReactDOM = require('react-dom'); 
var {Icon} = require('react-fa'); 
var moment = require('moment'); 
var TimeAgo = require('react-timeago') 

var { 
    ButtonGroup, 
    DropdownButton, 
    MenuItem, 
    Button, 
    Grid, 
    Row, 
    Col 
} = require('react-bootstrap'); 

var ServerCanvas = React.createClass({ 
     addProcess: function(event) { 
    // console.log(event.currentTarget.dataset.mode) 


    var process = event.currentTarget.dataset.mode; 
    var processDiv; 

    switch (process) { 
     case "Hadoop": 
      processDiv = ` <div class="Grid-cell Grid" style="flex-flow: column nowrap; background: linear-gradient(135deg, rgb(244, 143, 177) 0%, rgb(194, 24, 91) 100%);"> 
      <div class="Grid-cell" style="font-size: 150%;">Hd</div> 
      <div class="Grid-cell" style="font-size: 75%;">Hadoop</div> 
      <div class="Grid-cell" style="font-size: 75%; color: rgb(0, 0, 0);"> 
      </div> 
      </div>`; 
      break; 
     default: 

    } 

    var server = $('#servers').find('.test').not('.complete').first(); 

    if (server.children().length < 3) { 

     server.append(processDiv); ///Append the new process 

     if (server.first().children().length === 3) { 
      server.addClass('complete'); 
     } 
    } 
}, 

    render: function() { 
     return (
      <div className=""> 
       <Grid className="no-margin-padding container-hack"> 
        <Row> 
         <Col md={4} className='grey-box'> 
          <Row className="rowHeight"> 
           <Col md={6} className='text-center rowButton_Mid_Height'> 
            <div className="pull-right"> 
             <Button bsClass='btn btn-default btn-lg btn-round' onClick={this.addServer}><Icon name="plus"/></Button> 
             <div>Add server</div> 
            </div> 
           </Col> 
           <Col md={6} className='text-center rowButton_Mid_Height'> 
            <div className="pull-left"> 
             <Button bsClass='btn btn-default btn-lg btn-round' onClick={this.removeServer}><Icon name="minus"/></Button> 
             <div>Destroy Server</div> 
            </div> 
           </Col> 
          </Row> 

         </Col> 
         <Col md={8} className='black-box'> 
          <h1>Server Canvas</h1> 
          <div id='servers' className="serverContainer"> 
           <div className="test grey-box"> 
            <div className='text-center'>Server 0</div> 
           </div> 
          </div> 
         </Col> 
        </Row> 
        <Row> 
         <Col xs={4} md={4} className=''> 
          <Row> 
           <Col xs={12} md={12} className=''> 
            <div> 
             <div className='HadoopBackground pull-left'> 
              &nbsp; 
             </div> 
             Hadoop 
             <div className='pull-right'> 
              <Button bsClass='btn btn-default btn-xs btn-round HadoopBackgroundButton'><Icon name="minus"/></Button> 
              <Button bsClass='btn btn-default btn-xs btn-round HadoopBackgroundButton' onClick={this.addProcess} data-mode="Hadoop"><Icon name="plus"/></Button> 
             </div> 
            </div> 
           </Col> 
          </Row> 
         </Col> 
        </Row> 
       </Grid> 
      </div> 
     ) 
    } 
}); 

ReactDOM.render(
    <ServerCanvas/>, document.getElementById('app')); 

しかし、私は他の反応成分を(次のコードで名前のプロセス)を作成し、私はボタンを押すとaddProcessは、プロセスコンポーネントを挿入発射されるとされて探していますということ(いくつかのコードが削除された):あなたが状態の配列として、現在のサーバーを表現するために小さな調整を行う場合

var Process = React.createClass({ 
    render: function() { 
    return (
     <div className="Grid-cell Grid"> 
     <div className="Grid-cell" >Hd</div> 
     <div className="Grid-cell" >Hadoop</div> 
     <div><time className='loaded timeago'></time></div> 
     <div className="Grid-cell" > 
     </div> 
    </div> 
    ); 
    } 
}) 


addProcess: function(event) { 
    // console.log(event.currentTarget.dataset.mode) 


    var process = event.currentTarget.dataset.mode; 
    var processDiv; 

    var server = $('#servers').find('.test').not('.complete').first(); 

    if (server.children().length < 3) { 
     console.log('puedo crear hijos'); 
      server.append(<Process />); //Add the new process but nothing happend. 


     if (server.first().children().length === 3) { 
      server.addClass('complete'); 
     } 
    } 
} 

答えて

1

、あなただけ追加されているすべてのサーバーを反復処理することができます。ここでは、そのことについて行くかもしれない方法を実証するためにストリップダウンバージョンは次のとおりです。

var ServerCanvas = React.createClass({ 
    // represent servers in state 
    getInitialState: function() { 
     return { 
      servers: [] 
     } 
    }, 
    // add new server to state 
    addService: function(event) { 
     this.setState({ 
      servers: this.state.servers.concat(event.currentTarget.dataset.mode) 
     }); 
    }, 
    render: function() { 
     return (
      <div> 
       <h3>Servers</h3> 
       <div className="servers"> 
        {this.state.servers.map(function(server) { 
         return (
          <div className="Grid-cell Grid" style="flex-flow: column nowrap; background: linear-gradient(135deg, rgb(244, 143, 177) 0%, rgb(194, 24, 91) 100%);"> 
           <div class="Grid-cell" style="font-size: 75%;">{server}</div> 
           <div class="Grid-cell" style="font-size: 75%; color: rgb(0, 0, 0);"> 
           </div> 
          </div> 
         ) 
        })} 
       </div> 
      </div> 
     ) 
    } 
}) 

あなたはまた、独自のコンポーネントにサーバーを分割することができます:

var Server = React.createClass({ 
    render: function() { 
     return (
      <div className="Grid-cell Grid" style="flex-flow: column nowrap; background: linear-gradient(135deg, rgb(244, 143, 177) 0%, rgb(194, 24, 91) 100%);"> 
       <div class="Grid-cell" style="font-size: 75%;">{this.props.serviceName}</div> 
       <div class="Grid-cell" style="font-size: 75%; color: rgb(0, 0, 0);"> 
       </div> 
      </div> 
     ) 
    } 
}) 

や変更をServerCanvasにレンダリング:

{this.state.servers.map(function(server) { 
    return <Server serviceName={server} />; 
})} 
0

分離されたコンポーネントを作成し、ProcessComponentなどのファイルにインポートする必要があります。

複数のスタンスを追加するには、このコンポーネントの配列を自分の状態にする必要があります。別のステートを追加する必要がある場合は、ステートにあるこの配列に値をプッシュし、setStateを使用してレンダーと更新。

このような何かにレンダリング:

render() { 
    var self = this; 
    //This "self" here is because inside the loop below, the "this" context is going to be Jquery and not your Class. So you keep it in a separated value just for refence purpose. Like passing a callBack as in the example. 
    var processComponent = this.state.processOnState.map(function(item, i) 
    { 
     return (
       <Process key={"process"+i} ref={"process"+i} anyCallback={self.callBackMethodForParent.bind(self)} dataForProcess={item.dataToComponent} /> 
       ); 
    }.bind(this)); 
return (
<div> 
     <Col md={8} className='black-box'> 
      <h1>Server Canvas</h1> 
      <div id='servers' className="serverContainer"> 
       <div className="test grey-box"> 
        <div className='text-center'>Server 0</div> 
       </div> 
       {processComponent} 
      </div> 
     </Col> 
</div> 
) 

を使用すると、データを更新したら、あなたが使用して更新をトリガすることができます:デフォルトでは

setState({processOnState:[{dataToComponent:1},{dataToComponent:2}]}) 

は、常にすべてのレンダリングおよび更新を処理すべき反応しますそれは、DOMを通して実行され、何が変わったのかを見つけ出すだけでなく、それを再レンダリングするロジックを持っています。この動作は、setStateを使ってトリガすることができます。

Ref:https://facebook.github.io/react/docs/component-api.html#setstate

関連する問題