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.
4 Réponses :
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")
);
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')
);
C'est une solution géniale. Merci beaucoup!
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
);
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);
Lorsque
index% 3est1, ouvrez le div interne. Lorsqueindex% 3est0, 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