初学者:在 table reactJS 中使用条件循环
Beginner : Loop with condition in table reactJS
我正在尝试在 reactJS 中做一个“每周计划”,我是一个初学者,如果您发现任何错误,我们深表歉意。
我有一系列事件,如下所示:
var events = [
{
date : moment("14-03-2022", "DD-MM-YYYY").format("ddd D MMM YYYY"),
name : "EVENT MONDAY 13 2022"
},
{
date : moment("16-03-2022", "DD-MM-YYYY").format("ddd D MMM YYYY"),
name : "EVENT WEDNESDAY 2022"
}];
我创建了一个条件来查看事件日期是否与星期日期相同,我将其放在 table 中,如下所示:
<table className="table table-bordered text-center">
<thead>
<tr className="bg-light-gray">
{week.map((wk) => (<th class="text-uppercase">{wk}</th>))}
</tr>
</thead>
<tbody>
<tr>
{week.map((wk) => (
events.map((ev) =>(
wk === ev.date ?
<td>{ev.name}</td>
:
<td></td>
))
))}
</tr>
</tbody>
</table>
但它不起作用,因为它创建了太多的“td”元素,而且我不知道如何将事件名称放在正确的日期下方...
有人可以帮我吗?
考虑 table 需要渲染时的样子。首先,您需要“制作行”,然后在每一行内,您需要“制作列”。因为你只做一个星期,所以它几乎免费给你第一个任务,只有一行。
关于第二部分,渲染列,你需要更好地准备你的数据。在事件发生的那一天组织事件。我会将此视为一项简单的任务,事件仅在您发布的一个特定日期发生,如果您希望事件跨越多天,代码显然会有所不同。
首先,成像想要的输出是什么:
var events = {
[date]: [eventName, eventName, eventName],
[date]: [eventName],
[date]: [],
}
这显示了一个结构,一天可以英雄零,一个或多个事件发生。对于“零”情况,也可以使用 undefined
而不是 []
。这使您可以轻松渲染:
{week.map((wk) => (
<td key={wk}>
{events[wk] ? events[wk].join(', ') : null}
</td>
)}
现在,它所做的是,当渲染一周中的某一天时,它会将事件列表打印到该单元格中(如果有的话)。这肯定是简化了,但它显示了要做什么。
最后,您需要修改您的数据以匹配最终数据:
var events = [
{
date: moment("14-03-2022", "DD-MM-YYYY").format("ddd D MMM YYYY"),
name: "EVENT MONDAY 13 2022"
},
{
date: moment("16-03-2022", "DD-MM-YYYY").format("ddd D MMM YYYY"),
name: "EVENT WEDNESDAY 2022"
}
];
var eventsMapped = {}
var event
for (event of events) {
if (!eventsMapped[event.date]) {
eventsMapped[event.date] = []
}
eventsMapped[event.date].push(event.name)
}
您可以在渲染函数中简单地执行此操作。对于小型阵列,应该没问题。如果获取事件较多,后期可以考虑优化。
然后你可以使用 eventsMapped
渲染上面 events
的位置。
我正在尝试在 reactJS 中做一个“每周计划”,我是一个初学者,如果您发现任何错误,我们深表歉意。
我有一系列事件,如下所示:
var events = [
{
date : moment("14-03-2022", "DD-MM-YYYY").format("ddd D MMM YYYY"),
name : "EVENT MONDAY 13 2022"
},
{
date : moment("16-03-2022", "DD-MM-YYYY").format("ddd D MMM YYYY"),
name : "EVENT WEDNESDAY 2022"
}];
我创建了一个条件来查看事件日期是否与星期日期相同,我将其放在 table 中,如下所示:
<table className="table table-bordered text-center">
<thead>
<tr className="bg-light-gray">
{week.map((wk) => (<th class="text-uppercase">{wk}</th>))}
</tr>
</thead>
<tbody>
<tr>
{week.map((wk) => (
events.map((ev) =>(
wk === ev.date ?
<td>{ev.name}</td>
:
<td></td>
))
))}
</tr>
</tbody>
</table>
但它不起作用,因为它创建了太多的“td”元素,而且我不知道如何将事件名称放在正确的日期下方...
有人可以帮我吗?
考虑 table 需要渲染时的样子。首先,您需要“制作行”,然后在每一行内,您需要“制作列”。因为你只做一个星期,所以它几乎免费给你第一个任务,只有一行。
关于第二部分,渲染列,你需要更好地准备你的数据。在事件发生的那一天组织事件。我会将此视为一项简单的任务,事件仅在您发布的一个特定日期发生,如果您希望事件跨越多天,代码显然会有所不同。
首先,成像想要的输出是什么:
var events = {
[date]: [eventName, eventName, eventName],
[date]: [eventName],
[date]: [],
}
这显示了一个结构,一天可以英雄零,一个或多个事件发生。对于“零”情况,也可以使用 undefined
而不是 []
。这使您可以轻松渲染:
{week.map((wk) => (
<td key={wk}>
{events[wk] ? events[wk].join(', ') : null}
</td>
)}
现在,它所做的是,当渲染一周中的某一天时,它会将事件列表打印到该单元格中(如果有的话)。这肯定是简化了,但它显示了要做什么。
最后,您需要修改您的数据以匹配最终数据:
var events = [
{
date: moment("14-03-2022", "DD-MM-YYYY").format("ddd D MMM YYYY"),
name: "EVENT MONDAY 13 2022"
},
{
date: moment("16-03-2022", "DD-MM-YYYY").format("ddd D MMM YYYY"),
name: "EVENT WEDNESDAY 2022"
}
];
var eventsMapped = {}
var event
for (event of events) {
if (!eventsMapped[event.date]) {
eventsMapped[event.date] = []
}
eventsMapped[event.date].push(event.name)
}
您可以在渲染函数中简单地执行此操作。对于小型阵列,应该没问题。如果获取事件较多,后期可以考虑优化。
然后你可以使用 eventsMapped
渲染上面 events
的位置。