达到 6 列时创建新行
Make a new row when reach to 6 columns
我的代码有问题,无法将映射输出到 table 中的 6 列。所以我想要的是,只要数据达到 6 列,它就会创建一个新行。下面是我的代码:
import React from "react";
import { useEffect, useState } from "react";
import timestamp from "unix-timestamp";
export const Result = (code) => {
const [output, setOutput] = useState([]);
const [time, setTime] = useState([]);
const [data, setData] = useState([]);
const [hari, setHari] = useState([]);
useEffect(() => {
getWaktuSolat();
outputList();
setData([]);
}, [code.code]);
var requestOptions = {
method: "GET",
redirect: "follow",
};
async function getWaktuSolat() {
await fetch("https://mpt.i906.my/api/prayer/" + code.code, requestOptions)
.then((response) => response.json())
.then((result) => {
console.log(result.data);
setOutput(result.data);
setTime(result.data.times);
console.log(time);
})
.catch((error) => console.log("error", error));
}
function outputList() {
for (let x = 0; x < time.length; x++) {
for (let z = 0; z < 6; z++) {
let j = timestamp.toDate(time[x][z]);
data.push(j.toString().slice(15, 21));
console.log(data);
}
}
}
outputList();
return (
<div className="Result">
<h1>{output.place}</h1>
<table>
<th>Subuh</th>
<th>Syuruk</th>
<th>Zuhur</th>
<th>Asar</th>
<th>Maghrib</th>
<th>Isyak</th>
<tr>
{data.map((item, index) => (
<td>{item}</td>
))}
</tr>
</table>
</div>
);
};
export default Result;
这是我的输出
enter image description here
编辑:
为了不在 return
调用中使用三元条件并确保每个 <tr>
都能检测到其对应的 </tr>
,我将 table 的渲染拆分如下:
const renderTable = (data) => {
const rows = [];
for (let i = 0; i < data.length; i += 6) {
rows.push(<tr key={i}>{renderRow(data.slice(i, i + 6))}</tr>);
}
return rows;
};
const renderRow = (row) => {
return row.map((element) => <td key={element}>{element}</td>);
};
每六个元素将创建一个新行,最后不可能有空行。你可以看到它的实际效果 in this JSFiddle.
原创:
为了每六列触发一个新行,您可以在 index
上使用 remainder %。注意index
是从0开始的,每一个应该放在新行的项目都会有一个能被6整除的索引,即index % 6 === 0
。在这样的项目上,关闭上一行并开始另一行:
<table>
<th>Subuh</th>
<th>Syuruk</th>
<th>Zuhur</th>
<th>Asar</th>
<th>Maghrib</th>
<th>Isyak</th>
<tr>
{data.map((item, index) => (
if (index % 6 === 0) {
return <td>{item}</td></tr><tr>
} else {
return <td>{item}</td>
})
}
</tr>
</table>
这种方法的一个缺点是,如果数据单元格的数量是 6 的倍数,那么 table 将以空行结尾。要解决此问题,return 最后的 <tr>
除非 data.length % 6 === 0
,并且不要为 data
的最后一个元素开始新行,即 index === data.length - 1
.
您必须将 tr
元素放入循环中。
我提供了算法,但语法可能有误,因为我对 React 不熟悉。
<table>
<th>Subuh</th>
<th>Syuruk</th>
<th>Zuhur</th>
<th>Asar</th>
<th>Maghrib</th>
<th>Isyak</th>
{data.map((item, index) => (
if (index % 6 === 0) {
// Start a new row if first element
return <tr><td>{item}</td>
} else if (index % 6 === 5) {
// End the row if last element
return <td>{item}</td></tr>
} else {
// just insert item if middle
return <td>{item}</td>
})
}
</table>
我的代码有问题,无法将映射输出到 table 中的 6 列。所以我想要的是,只要数据达到 6 列,它就会创建一个新行。下面是我的代码:
import React from "react";
import { useEffect, useState } from "react";
import timestamp from "unix-timestamp";
export const Result = (code) => {
const [output, setOutput] = useState([]);
const [time, setTime] = useState([]);
const [data, setData] = useState([]);
const [hari, setHari] = useState([]);
useEffect(() => {
getWaktuSolat();
outputList();
setData([]);
}, [code.code]);
var requestOptions = {
method: "GET",
redirect: "follow",
};
async function getWaktuSolat() {
await fetch("https://mpt.i906.my/api/prayer/" + code.code, requestOptions)
.then((response) => response.json())
.then((result) => {
console.log(result.data);
setOutput(result.data);
setTime(result.data.times);
console.log(time);
})
.catch((error) => console.log("error", error));
}
function outputList() {
for (let x = 0; x < time.length; x++) {
for (let z = 0; z < 6; z++) {
let j = timestamp.toDate(time[x][z]);
data.push(j.toString().slice(15, 21));
console.log(data);
}
}
}
outputList();
return (
<div className="Result">
<h1>{output.place}</h1>
<table>
<th>Subuh</th>
<th>Syuruk</th>
<th>Zuhur</th>
<th>Asar</th>
<th>Maghrib</th>
<th>Isyak</th>
<tr>
{data.map((item, index) => (
<td>{item}</td>
))}
</tr>
</table>
</div>
);
};
export default Result;
这是我的输出
enter image description here
编辑:
为了不在 return
调用中使用三元条件并确保每个 <tr>
都能检测到其对应的 </tr>
,我将 table 的渲染拆分如下:
const renderTable = (data) => {
const rows = [];
for (let i = 0; i < data.length; i += 6) {
rows.push(<tr key={i}>{renderRow(data.slice(i, i + 6))}</tr>);
}
return rows;
};
const renderRow = (row) => {
return row.map((element) => <td key={element}>{element}</td>);
};
每六个元素将创建一个新行,最后不可能有空行。你可以看到它的实际效果 in this JSFiddle.
原创:
为了每六列触发一个新行,您可以在 index
上使用 remainder %。注意index
是从0开始的,每一个应该放在新行的项目都会有一个能被6整除的索引,即index % 6 === 0
。在这样的项目上,关闭上一行并开始另一行:
<table>
<th>Subuh</th>
<th>Syuruk</th>
<th>Zuhur</th>
<th>Asar</th>
<th>Maghrib</th>
<th>Isyak</th>
<tr>
{data.map((item, index) => (
if (index % 6 === 0) {
return <td>{item}</td></tr><tr>
} else {
return <td>{item}</td>
})
}
</tr>
</table>
这种方法的一个缺点是,如果数据单元格的数量是 6 的倍数,那么 table 将以空行结尾。要解决此问题,return 最后的 <tr>
除非 data.length % 6 === 0
,并且不要为 data
的最后一个元素开始新行,即 index === data.length - 1
.
您必须将 tr
元素放入循环中。
我提供了算法,但语法可能有误,因为我对 React 不熟悉。
<table>
<th>Subuh</th>
<th>Syuruk</th>
<th>Zuhur</th>
<th>Asar</th>
<th>Maghrib</th>
<th>Isyak</th>
{data.map((item, index) => (
if (index % 6 === 0) {
// Start a new row if first element
return <tr><td>{item}</td>
} else if (index % 6 === 5) {
// End the row if last element
return <td>{item}</td></tr>
} else {
// just insert item if middle
return <td>{item}</td>
})
}
</table>