2017-04-03 17 views
0

私はここでは全く新しい初心者です.Jqueryを使って長い間作業しています。だからこそReact/Reduxスタイルを使うことができます。ReactJS子要素が1つのコンポーネントの子要素を操作する

私は子供の要素で立ち往生しているしばらくの間、別の子の要素の機能を処理してみてください。

{this.state.stocks.map(function(data, index) { 

    return (
     <div className={"list-group-item list-group-item-action flex-column align-items-start"} key={index}> 

      <div className={"d-flex w-100 justify-content-between"} onClick={this.handleToggle}> 
      <h5 className="mb-1"> 
       <span className={styles.symbolTitle}>Stock Symbol:</span> <span className={styles.symbolName}>{data.symbol}</span> ${data.price}&nbsp;&nbsp; 
       <button type="button" className={"btn btn-outline-primary btn-sm "+ styles.btnTrans +""} >more...</button> 
      </h5> 
      <small> 
       {this.state.shares}&nbsp; 
       <span className={styles.colorGrey}>shares</span>&nbsp;&nbsp;&nbsp;&nbsp; 
       <button type="button" className={"btn btn-outline-success btn-sm "+ styles.btnTrans +""} onClick={this.handleBuy}>Buy</button>&nbsp;&nbsp; 
       <button type="button" className={"btn btn-outline-danger btn-sm "+ styles.btnTrans +""} onClick={this.handleSell}>Sell</button> 
      </small> 
      </div> 

      <div className={stateStyle}> 
       <small>Open Price: {data.open}</small>&nbsp; 
       <small>Highest Price: {data.high}</small>&nbsp; 
       <small>Lowest Price: {data.low}</small>&nbsp; 
       <small>All Price: {(data.low + data.high).toFixed(2)}</small>&nbsp; 
       <small>Volume: {data.volume}</small>&nbsp; 
       <small>Average Volume: {data.average_volume}</small>&nbsp; 
       <small>Volatility: {data.volatility}</small> 
      </div> 

     </div> 
    ) 
}.bind(this))} 

上記のように、divの一連のループ。私は、onClick関数を持つdivの兄弟divを簡単に切り替えることを試みています。しかし、これまでのところ、handleToggle関数はmap関数の下で生成されたすべてのdivをトグルする関数です。トグル機能は次のとおりです。

handleToggle: function() { 
    if (this.state.active) { 
     this.setState({ 
     active: false 
     }) 
    } else { 
     this.setState({ 
     active: true 
     }) 
    } 
    }, 

次に何をするのかわかりません。あなたは私にいくつかの洞察を教えてもらえますか?

+0

あなたは 'すべてのdiv toggle'によって何を意味しています。変更された状態の「アクティブ」は何をしていますか? – Panther

+0

@Pantherご覧のとおり、1つの親に2つのdivがあります。最初の子divはonClickを持ち、私はそのDivをボタンとして使って次の子(兄弟)をトグルしようとしていました。アクティブ状態は、表示/非表示を変更するためのハンドラです。 – Yuhao

+0

複数の 'child' divを同時に開くことができますか? – Panther

答えて

0

handleRowToggle(key)は、keyに関連するすべてのオブジェクトを切り替えます。

handleButtonBuy(key)は、buyCountの値をstateに格納します。

const data = [ 
 
     { id: 1, title : 'test1', value1: 'value11', value2: 'value21', buyCount: 0}, 
 
     { id: 2, title : 'test2', value1: 'value21', value2: 'value22', buyCount: 5}, 
 
     { id: 3, title : 'test3', value1: 'value31', value2: 'value32', buyCount: 10} 
 
]; 
 

 
class App extends React.Component { 
 
    constructor(props) { 
 
    super(props); 
 
    
 
    this.state = { 
 
     stocks: data 
 
    } 
 
    } 
 

 
    handleRowToggle(key) { 
 
    var allKeyRecords = document.querySelectorAll(`[data-toggle="${key}"]`); 
 
    allKeyRecords.forEach(record => record.classList.toggle('hide')) 
 
    } 
 
    
 
    handleButtonBuy(key) { 
 
    this.setState(function(prevState, props) { 
 
     const stocks = prevState.stocks.map(stock => { 
 
     if (stock.id === key) { 
 
      stock.buyCount++; 
 
     } 
 
     return stock; 
 
     }); 
 
     // New state console logged 
 
     console.log(stocks); 
 
     
 
     // ES6 it's the same as stocks: stocks 
 
     return { 
 
     stocks 
 
     }; 
 
    }); 
 
    } 
 

 
    render() { 
 
    return (
 
     <div> 
 
     <StockList 
 
      stocks={this.state.stocks} 
 
      handleRowToggle={this.handleRowToggle.bind(this)} 
 
      handleButtonBuy={this.handleButtonBuy.bind(this)} 
 
      /> 
 
     </div> 
 
    ); 
 
    } 
 
} 
 

 
class StockList extends React.Component { 
 
    renderList() { 
 
    return this.props.stocks.map((stock) => { 
 
     return (
 
     <tr 
 
      key={stock.id} 
 
      > 
 
      <td data-toggle={stock.id}> 
 
      {stock.id} 
 
      </td> 
 
      <td data-toggle={stock.id}> 
 
      {stock.title} 
 
      </td>   
 
      <td data-toggle={stock.id}> 
 
      {stock.value1} 
 
      </td> 
 
      <td data-toggle={stock.id}> 
 
      {stock.value2} 
 
      </td>    
 
      <td data-toggle={stock.id}> 
 
      {stock.buyCount} 
 
      </td> 
 
      <td data-toggle={stock.id}> 
 
      <button onClick={ (event) => this.props.handleButtonBuy(stock.id) }>Buy Me</button> 
 
      </td> 
 
      <td> 
 
      <button onClick={ (event) => this.props.handleRowToggle(stock.id) }>Toggle Row</button> 
 
      </td>    
 
     </tr> 
 
    ); 
 
    }); 
 
    } 
 

 
    render() { 
 
    return (
 
     <table className="table"> 
 
     <tbody> 
 
     {this.renderList()} 
 
     </tbody> 
 
     </table> 
 
    ) 
 
    } 
 
} 
 

 

 

 

 

 

 
ReactDOM.render(
 
    <App />, 
 
    document.getElementById('root') 
 
);
tr td.hidden { 
 
    display: none; 
 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.4.2/react.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.4.2/react-dom.js"></script> 
 

 
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> 
 

 
<!-- Optional theme --> 
 
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap-theme.min.css" integrity="sha384-rHyoN1iRsVXV4nD0JutlnGaslCJuC7uwjduW9SVrLvRYooPp2bWYgmgJQIXwl/Sp" crossorigin="anonymous"> 
 

 

 
<div id="root"></div>

+0

ありがとう、私はそれが私が探していたものだと思う!調整するためにコードを修正します。結果を後でお知らせします – Yuhao

+0

確かに、それがあなたに合っているかどうか教えてください – loelsonk

+0

は完璧に働いた!おかげで – Yuhao

0

stateactiveをオプションで表示することができます。ような何か:this.state.activetrueある場合

{this.state.stocks.map(function(data, index) { 
    const summary = (
     <div className={stateStyle}> 
      <small>Open Price: {data.open}</small>&nbsp; 
      <small>Highest Price: {data.high}</small>&nbsp; 
      <small>Lowest Price: {data.low}</small>&nbsp; 
      <small>All Price: {(data.low + data.high).toFixed(2)}</small>&nbsp; 
      <small>Volume: {data.volume}</small>&nbsp; 
      <small>Average Volume: {data.average_volume}</small>&nbsp; 
      <small>Volatility: {data.volatility}</small> 
     </div> 
    ) 

    return (
     <div className={"list-group-item list-group-item-action flex-column align-items-start"} key={index}> 

     <div className={"d-flex w-100 justify-content-between"} onClick={this.handleToggle}> 
      <h5 className="mb-1"> 
       <span className={styles.symbolTitle}>Stock Symbol:</span> <span className={styles.symbolName}>{data.symbol}</span> ${data.price}&nbsp;&nbsp; 
       <button type="button" className={"btn btn-outline-primary btn-sm "+ styles.btnTrans +""} >more...</button> 
      </h5> 
      <small> 
      {this.state.shares}&nbsp; 
      <span className={styles.colorGrey}>shares</span>&nbsp;&nbsp;&nbsp;&nbsp; 
      <button type="button" className={"btn btn-outline-success btn-sm "+ styles.btnTrans +""} onClick={this.handleBuy}>Buy</button>&nbsp;&nbsp; 
      <button type="button" className={"btn btn-outline-danger btn-sm "+ styles.btnTrans +""} onClick={this.handleSell}>Sell</button> 
      </small> 
     </div> 

     { this.state.active && summary } 

     </div> 
    ) 
}.bind(this))} 

は、これが唯一の(より適切な名前を選択して自由に感じる)summary要素をレンダリングします。

関連する問題