每四条记录显示一列
Show columns every four records
我正在为如何每四条记录显示列或分隔列而苦恼。我正在使用 bulma 列,我的目标是在数组映射内的每四个记录上显示列。感谢您的帮助。
地图函数内部
{list.map(function(item, key){
return <div className="columns">
<div className="column">{item.name}</div>
</div>
})}
假设列表是8条记录,预期结果应该是这样
<div className="columns">
<div className="column">name 1</div>
<div className="column">name 2</div>
<div className="column">name 3</div>
<div className="column">name 4</div>
</div>
<div className="columns">
<div className="column">name 5</div>
<div className="column">name 6</div>
<div className="column">name 7</div>
<div className="column">name 8</div>
</div>
您可以在渲染列之前执行类似的操作,
let columns = [];
let records = [1,2,3,4,5,6,7,8];
const recordsPerColumn = 4
while (records.length) {
columns.push(records.splice(0, recordsPerColumn));
}
// this will group the records in size of 4, which then you can iterate over
return (
....
{columns.map(function(column, key){
return <div className="columns">
{ // for rendering the items dynamically, this will also hold good in case there are less than 4 records for say the last group
column.map(item=> <div className="column">{item}</div>)
}
</div>
})}
....
)
您可以从数组创建块,然后用 <div className="columns">
包裹每个块
function array_chunks(array, chunks) {
let result = [];
let n = array.length;
for (let i = 0; i < n; i += chunks) {
result = [...result, array.slice(i, i + chunks)];
}
return result;
}
let columns = array_chunks(list, 4);
function App() {
return (
<div className="App">
{columns.map(function(items, key) {
return (
<div className="columns">
{items.map(function(item) {
return <div className="column">{item.name}</div>;
})}
</div>
);
})}
</div>
);
}
请参阅sandbox。
我来晚了一点。但这里有一个更精确的解决方案:
你可以在这里使用Array.reduce
。
const columns = [1,2,3,4,5,6,7,8];
{
columns
.reduce((acc, curr, index, self) => {
if (index % 4 === 0) acc.push(self.slice(index, index + 4));
return acc;
}, [])
.map((items, _idx) => (
<div className="columns" key={_idx}>
{
items.map(item => (
<div className="column" key={item}>{item}</div>
))
}
</div>
))
}
为了实现相同的布局,您可以使用 sizing property of Bulma 列:
return (
<div className="columns">
{list.map(function(item, key) {
return (
// Orders 4 items per column, rest of items rearrange automatically
<div className="column is-one-quarter">{item.name}</div>
)
}}
</div>
)}
如果您需要特定的数据结构(出于某些其他原因),则必须将数据转换为特定的数据结构。
function chunk (arr, len) {
var chunks = [],
i = 0,
n = arr.length;
while (i < n) {
chunks.push(arr.slice(i, i += len));
}
return chunks;
}
const dummyArray = new Array(20).fill(1);
const { useState, useEffect } = React;
function App() {
const [data, setData] = useState([]);
useEffect(() => {
setData(chunk(dummyArray, 4));
}, []);
return (
<main>
{data.map((item, index) => (
<div className="columns" key={index}>
{item.map((subitem, index)=> (
<div className="column" key={index}>
<p>1</p>
</div>
))}
</div>
))}
</main>
);
}
ReactDOM.render(<App />, document.getElementById("app"));
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bulma/0.7.5/css/bulma.css">
<script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
<div id="app"></div>
是否必须将 4 件物品分成不同的 div
容器?
Bulma 有一个 .is-multiline
class 位于 .columns
容器上,可让您添加任意数量的列,它们会自动换行,从而让您创建项目网格每列 4 列。
https://bulma.io/documentation/columns/options/#multiline
<link href="https://cdn.jsdelivr.net/npm/bulma@0.8.0/css/bulma.css" rel="stylesheet"/>
<div class="columns is-multiline is-mobile">
<div class="column is-3">1</div>
<div class="column is-3">2</div>
<div class="column is-3">3</div>
<div class="column is-3">4</div>
<div class="column is-3">5</div>
<div class="column is-3">6</div>
<div class="column is-3">7</div>
<div class="column is-3">8</div>
</div>
所以也许可以这样编辑您的代码:
{list.map(function(item, key){
return <div className="columns is-multiline">
<div className="column is-3">{item.name}</div>
</div>
})}
我正在为如何每四条记录显示列或分隔列而苦恼。我正在使用 bulma 列,我的目标是在数组映射内的每四个记录上显示列。感谢您的帮助。
地图函数内部
{list.map(function(item, key){
return <div className="columns">
<div className="column">{item.name}</div>
</div>
})}
假设列表是8条记录,预期结果应该是这样
<div className="columns">
<div className="column">name 1</div>
<div className="column">name 2</div>
<div className="column">name 3</div>
<div className="column">name 4</div>
</div>
<div className="columns">
<div className="column">name 5</div>
<div className="column">name 6</div>
<div className="column">name 7</div>
<div className="column">name 8</div>
</div>
您可以在渲染列之前执行类似的操作,
let columns = [];
let records = [1,2,3,4,5,6,7,8];
const recordsPerColumn = 4
while (records.length) {
columns.push(records.splice(0, recordsPerColumn));
}
// this will group the records in size of 4, which then you can iterate over
return (
....
{columns.map(function(column, key){
return <div className="columns">
{ // for rendering the items dynamically, this will also hold good in case there are less than 4 records for say the last group
column.map(item=> <div className="column">{item}</div>)
}
</div>
})}
....
)
您可以从数组创建块,然后用 <div className="columns">
function array_chunks(array, chunks) {
let result = [];
let n = array.length;
for (let i = 0; i < n; i += chunks) {
result = [...result, array.slice(i, i + chunks)];
}
return result;
}
let columns = array_chunks(list, 4);
function App() {
return (
<div className="App">
{columns.map(function(items, key) {
return (
<div className="columns">
{items.map(function(item) {
return <div className="column">{item.name}</div>;
})}
</div>
);
})}
</div>
);
}
请参阅sandbox。
我来晚了一点。但这里有一个更精确的解决方案:
你可以在这里使用Array.reduce
。
const columns = [1,2,3,4,5,6,7,8];
{
columns
.reduce((acc, curr, index, self) => {
if (index % 4 === 0) acc.push(self.slice(index, index + 4));
return acc;
}, [])
.map((items, _idx) => (
<div className="columns" key={_idx}>
{
items.map(item => (
<div className="column" key={item}>{item}</div>
))
}
</div>
))
}
为了实现相同的布局,您可以使用 sizing property of Bulma 列:
return (
<div className="columns">
{list.map(function(item, key) {
return (
// Orders 4 items per column, rest of items rearrange automatically
<div className="column is-one-quarter">{item.name}</div>
)
}}
</div>
)}
如果您需要特定的数据结构(出于某些其他原因),则必须将数据转换为特定的数据结构。
function chunk (arr, len) {
var chunks = [],
i = 0,
n = arr.length;
while (i < n) {
chunks.push(arr.slice(i, i += len));
}
return chunks;
}
const dummyArray = new Array(20).fill(1);
const { useState, useEffect } = React;
function App() {
const [data, setData] = useState([]);
useEffect(() => {
setData(chunk(dummyArray, 4));
}, []);
return (
<main>
{data.map((item, index) => (
<div className="columns" key={index}>
{item.map((subitem, index)=> (
<div className="column" key={index}>
<p>1</p>
</div>
))}
</div>
))}
</main>
);
}
ReactDOM.render(<App />, document.getElementById("app"));
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bulma/0.7.5/css/bulma.css">
<script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
<div id="app"></div>
是否必须将 4 件物品分成不同的 div
容器?
Bulma 有一个 .is-multiline
class 位于 .columns
容器上,可让您添加任意数量的列,它们会自动换行,从而让您创建项目网格每列 4 列。
https://bulma.io/documentation/columns/options/#multiline
<link href="https://cdn.jsdelivr.net/npm/bulma@0.8.0/css/bulma.css" rel="stylesheet"/>
<div class="columns is-multiline is-mobile">
<div class="column is-3">1</div>
<div class="column is-3">2</div>
<div class="column is-3">3</div>
<div class="column is-3">4</div>
<div class="column is-3">5</div>
<div class="column is-3">6</div>
<div class="column is-3">7</div>
<div class="column is-3">8</div>
</div>
所以也许可以这样编辑您的代码:
{list.map(function(item, key){
return <div className="columns is-multiline">
<div className="column is-3">{item.name}</div>
</div>
})}