web-dev-qa-db-fra.com

Comment itérer des tableaux imbriqués dans un composant React?

J'ai un tableau multidimensionnel: un tableau results contenant 18 tableaux row, chacun contenant 6 nombres.

Je veux rendre ceci comme une table. La logique serait

results.each as (row)
     <tr>
         row.each as (number)
               <td>number</td>
     </tr>

Mais je n'arrive pas à comprendre comment vous écririez cela dans JSX.

const Resultset = props => (
    {props.rows.map(rows => {
        <tr>
            {rows.map(number => <td>{number}</td>)}
        </tr>
    })}
);

Mais ce n'est pas juste. Quelle est la procédure à suivre, comment imbriquer les appels et interpolations de la carte?

16
GreenTriangle

Une façon de le faire

var arr = [ [ 2, 3, 4, 5, 6, 7 ],
  [ 8, 9, 10, 11, 12, 13 ],
  [ 14, 15, 16, 17, 18, 19 ],
  [ 20, 21, 22, 23, 24, 25 ],
  [ 26, 27, 28, 29, 30, 31 ],
  [ 32, 33, 34, 35, 36, 37 ],
  [ 38, 39, 40, 41, 42, 43 ],
  [ 44, 45, 46, 47, 48, 49 ],
  [ 50, 51, 52, 53, 54, 55 ],
  [ 56, 57, 58, 59, 60, 61 ],
  [ 62, 63, 64, 65, 66, 67 ],
  [ 68, 69, 70, 71, 72, 73 ],
  [ 74, 75, 76, 77, 78, 79 ],
  [ 80, 81, 82, 83, 84, 85 ],
  [ 86, 87, 88, 89, 90, 91 ],
  [ 92, 93, 94, 95, 96, 97 ],
  [ 98, 99, 100, 101, 102, 103 ],
  [ 104, 105, 106, 107, 108, 109 ] ];

var Hello = React.createClass({
  tablerows: function() {
    return this.props.arr.map(rows => {
        var row = rows.map(cell => <td>{cell}</td>); 
        return <tr>{row}</tr>;
    });
  },
  render: function() {
    return <table>{this.tablerows()}</table>;
  }
});

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

En action: https://jsfiddle.net/69z2wepo/30476/

12
manonthemat

Je suggérerais de séparer les composants en Resultset, NumberComponent et d'essayer d'être cohérent avec les fonctions de flèche.

// Explicit return

const NumberComponent = props => {
    return (
        <td>{ props.number }</td>
    )
}

const Resultset = props => {
    return (
        <tr>
            {
                props.rows.map( number => <NumberComponent number={number} />)
            }
        </tr>
    )
}

// Implicit return

const NumberComponent = props => (<td>{ props.number }</td>);

const Resultset = props => (
    <tr>
        {
            props.rows.map( number => <NumberComponent number={number} />)
        }
    </tr>
);
4
oobgam

Cela a bien fonctionné pour moi de mapper un tableau de tableaux, j'ai nommé le tableau qui contient les tableaux racine, j'ai configuré les fonctions comme suit: 

//root render function

renderNested = (row, i) => {
    return (
        root.map(function (row, i) {
            return (
            <div key={i}>
                {this.renderNested(row, i)}
            </div>
            )
        }, this)
    )
}

//nested render function

renderNested = (row, i) => {
    return (
        row.map(function (innerrow, ii) {
            return(
                <span key={ii}>
                    Nested content here
                </span>
            )
        }, this)
    )
}
0
edencorbin

Vous pouvez itérer la première partie du tableau et à la deuxième itération, appeler un autre composant et passer le second tableau en tant que prop.

const Resultset = props => (
{props.rows.map(rows => {
    <tr>
        <AnotherComponent rows={rows} />
    </tr>
})}
);

Dans un autre composant, vous répétez le même processus de carte.

0
Franco Manzur