4
votes

Comment puis-je utiliser la carte pour afficher une liste d'éléments mais regroupés tous les 3 éléments?

J'ai une longue liste d'éléments dans un tableau. Celles-ci doivent être rendues dans un composant, qui devrait être parfait et élégant. Cependant, j'ai besoin que ceux-ci soient enveloppés par un autre composant tous les 3 éléments.

Donc, si je devais simplement rendre les éléments, cela ressemblerait à ceci:

return (
  <div>
    <div className='group-of-3'>
      <span>Item 1</span>
      <span>Item 2</span>
      <span>Item 3</span>
    </div>
    <div className='group-of-3'>
      <span>Item 4</span>
      <span>Item 5</span>
      <span>Item 6</span>
    </div>
    .
    .
    .
  </div>
)

Mais fondamentalement, je veux que tous les trois éléments soient enveloppés dans un div avec une classe spéciale, donc quelque chose comme ceci:

return (
  <div>
    items.map((x, index) => {
      <span key={index}>{x}</span>
    })
  </div>
)

Quelle serait la manière idéale de faire cela? Gardez à l'esprit que le nombre d'articles change, il est donc hors de question de le faire manuellement.


5 commentaires

Lorsque index% 3 est 1 , ouvrez le div interne. Lorsque index% 3 est 0 , fermez le div interne.


@ PM77-1 react n'est pas impératif, vous ne pouvez pas "ouvrir" et "fermer" les divs: le contenu des éléments doit être connu à la création.


@zerkms - Je ne connais pas ReactJS. Je ne peux donc pas ajouter de code à la fonction de carte?


@ PM77-1 vous pouvez, mais il doit renvoyer des éléments complets. Voir la réponse affichée, j'espère qu'elle fera un meilleur travail pour clarifier cela.


Ma prise: codesandbox.io/s/qlmm0rrzqj


4 Réponses :


3
votes

Vous pouvez utiliser Lodash chunk pour vous séparer votre tableau en tableaux de longueur 3 et les restituer séparément.

Exemple

<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>

<div id="root"></div>
function App(props) {
  const chunkedItems = _.chunk(props.items, 3);

  return (
    <div>
      {chunkedItems.map((arr, index) => (
        <div key={index}>
          {arr.map((item, index) => (
            <span key={index}>{item}</span>
          ))}
        </div>
      ))}
    </div>
  );
}

ReactDOM.render(
  <App items={[1, 2, 3, 4, 5, 6, 7]} />,
  document.getElementById("root")
);


0 commentaires

5
votes

En utilisant JavaScript brut, vous pouvez utiliser Array.reduce () pour créer des sous-tableaux à partir de vos éléments. Ensuite, mappez deux fois sur vos éléments:

<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div id="root"></div>
.group-of-3 {
  border: 1px solid black;
  padding: 5px;
  margin: 5px;
  width: 50px;
  text-align: center;
}
const group = (items, n) => items.reduce((acc, x, i) => {
  const idx = Math.floor(i / n);
  acc[idx] = [...(acc[idx] || []), x];
  return acc;
}, []);

function Example({ items }) {
  return (
    <div>{group(items, 3).map(children =>
        <div className='group-of-3'>
          {children.map((x, i) => <span key={i}>{x}</span>)}
        </div>
    )}</div>
  );
}

ReactDOM.render(
  <Example items={[1, 2, 3, 4, 5, 6, 7, 8]} />,
  document.getElementById('root')
);


1 commentaires

C'est une solution géniale. Merci beaucoup!



1
votes

Vous pouvez utiliser Array.from () pour diviser la liste en catégories, avec un Array.map () interne pour rendre les éléments:

p>

<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>

<div id="demo"></div>
.group-of-3 {
  margin: 1em 0;
  border: 1px solid black;
}

span {
  display: block;
}
const items = ['item1', 'item2', 'item3', 'item4', 'item5', 'item6', 'item7', 'item8', 'item9', 'item10', 'item11'];

const Demo = ({ items, size = 3 }) => (
  <div>
    {Array.from(
      { length: Math.ceil(items.length / size) },
      (_, i) => (
        <div key={i} className='group-of-3'>
        {items.slice(i * size, (i + 1) * size)
          .map((item) => <span key={item}>{item}</span>)
        }
        </div>
      )
    )}
  </div>
);


ReactDOM.render(
  <Demo items={items} />,
  demo
);


0 commentaires

1
votes

Vous pouvez commencer par regrouper les éléments du tableau en plusieurs tableaux plus petits, chacun avec 3 éléments.

const arr = [1,2,3,4,5,6,7,8,9];

const grouped = arr.reduce((res, el, i) => {
  if (i % 3 === 0) {
    res[res.length] = [el];
  } else {
    res[res.length-1] = [...res[res.length-1], el];
  }
  return res;
}, []);

console.log(grouped);


0 commentaires