web-dev-qa-db-ja.com

Reactjsでテーブルの行とセルを反復処理するにはどうすればよいですか

私はReactjsにかなり慣れていません、そして私はこのように見える私のデータベースからjsonをロードするコンポーネントを持っています

Array[2]
0: Object
_id: "56cf587fe46adb3b8960afe2"
price: 2000
title: "ps3"
url: "www.google.com"
__proto__: Object
1: Object
_id: "56db2bd434df9046e0643d22"
price: 499
title: "HENRIKSDAL"
url: "http://www.ikea.com/se/sv/catalog/products/S59847817/"
__proto__: Object
length: 2
__proto__: Array[0]

私がやりたいのは、次のようなテーブルにデータをロードすることです

//start of loop
<tr>
                          <td className="col-sm-8 col-md-6">
                          <div className="media">

                              <div className="media-body">
                                  <h4 className="media-heading"><a href="#">Product name</a></h4>
                              </div>
                          </div></td>
                          <td className="col-sm-1 col-md-1" styles="text-align: center">
                          <input type="number" name="quantity" min="1" max="10" className="form-control"/>
                          </td>
                          <td className="col-sm-1 col-md-1 text-center"><strong>500:-</strong></td>
                          <td className="col-sm-1 col-md-1 text-center"><strong>$14.61</strong></td>
                          <td className="actions" data-th="">
              <button className="btn btn-info btn-sm"><i className="fa fa-refresh"></i></button>
              <button className="btn btn-danger btn-sm"><i className="fa fa-trash-o"></i></button>
                         </td>
                      </tr>
                      <tr>
                          <td>   </td>
                          <td>   </td>
                          <td>   </td>
                          <td><h3>Total</h3></td>
                          <td className="text-right"><h3><strong>$31.53</strong></h3></td>
                      </tr>
    //end of loop

しかし、配列を反復処理する方法がわからないため、配列内の各オブジェクトのテーブル行が作成されます。助言がありますか?

8
user3476614

配列をマップして、データをhtmlに渡すことができます

        {this.state.data.map(( listValue, index ) => {
          return (
            <tr key={index}>
              <td>{listValue.id}</td>
              <td>{listValue.title}</td>
              <td>{listValue.price}</td>
            </tr>
          );
        })}
9
Guy

mapメソッドを使用できます(Arrayのプロトタイプで使用可能)。
反復はこれと同じくらい簡単です...

const rows = [
  {
    _id: "56cf587fe46adb3b8960afe2",
    price: 2000,
    title: "ps3",
    url: "www.google.com",
  }, {
    _id: "56db2bd434df9046e0643d22",
    price: 499,
    title: "HENRIKSDAL",
    url: "http://www.ikea.com/se/sv/catalog/products/S59847817/",
  }
];

var Hello = React.createClass({
  renderRow(props) {
    return (
      <tr>
        <td>{ props._id }</td>
        <td>{ props.price }</td>
        <td>{ props.title }</td>
        <td>{ props.url }</td>
      </tr>
    );
  },

  render: function() {
    return (
      <table>
        { this.props.rows.map(this.renderRow) }
      </table>
    );
  }
});

ReactDOM.render(
  <Hello rows={rows} />,
  document.getElementById('container')
);

作業中Fiddle https://jsfiddle.net/zwdjmozn/1/

3
Andreyco

これは@Andreycoの回答の拡張であり、個別のテンプレートが定義されていますが、私の場合は、マップ呼び出し内でJSXテンプレートを参照しています(<Row />

const Table = (props) => (
<div>
  <p>Your Table</p>
  <table>
  <tbody>
    {props.rows.map((x,i) => <Row key={i} data={x} />) }
  </tbody>
  </table>
</div>
)

const Row = (props:any) => (
  <tr>
      <td>{props.data[0]}</td>
      <td>{props.data[1]}</td>
      <td>{props.data[2]}</td>
    </tr>
)

JSFiddle を参照してください

0
wal