我在数组中有很长的项目列表。这些都需要在一个组件中呈现,并且应该很好。但是,我需要每3个项目将它们包裹在另一个组件中。
所以,如果我只是渲染项目,它将看起来像这样:
return (
<div>
items.map((x, index) => {
<span key={index}>{x}</span>
})
</div>
)
但基本上,我希望每三个项目都被包装在具有特殊类的div中,所以是这样的:
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>
)
执行此操作的理想方法是什么?请记住,商品的数量确实会发生变化,因此手动进行是不可能的。
答案 0 :(得分:3)
您可以使用Lodash chunk
将数组拆分为长度为3
的数组,然后分别进行渲染。
示例
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")
);
<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>
答案 1 :(得分:3)
使用纯JavaScript,您可以使用Array.reduce()
从您的商品创建子数组。然后两次映射您的物品:
border: 1px solid #34c1e5;
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')
);
.group-of-3 {
border: 1px solid black;
padding: 5px;
margin: 5px;
width: 50px;
text-align: center;
}
答案 2 :(得分:1)
您可以使用Array.from()
将列表划分为类别,并使用内部Array.map()
来呈现项目:
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
);
.group-of-3 {
margin: 1em 0;
border: 1px solid black;
}
span {
display: block;
}
<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>
答案 3 :(得分:1)
您可以先将数组的元素分为多个较小的数组,每个数组包含3个元素。
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);