在PugJS日历事件列表中为各月份添加对应HTML元素的实现问题
完全可以仅基于现有title和date字段实现该需求,不需要额外新增月份选择字段。
核心思路是先按月份对事件做归集,或者遍历事件时记录上一个处理的月份,仅在月份切换时开闭月份容器即可,两种实现方案如下:
方案1:先按月份分组再渲染(更易维护,推荐)
先在模板开头对事件数组做预处理,把同月份的事件归集到同一分组下,渲染时直接遍历分组即可:
- // 数字月份转英文月份的映射表 const monthMap = { '01': 'January', '02': 'February', '03': 'March', '04': 'April', '05': 'May', '06': 'June', '07': 'July', '08': 'August', '09': 'September', '10': 'October', '11': 'November', '12': 'December' } // 按月份分组事件,用年+月作为键避免不同年同月的事件混排 const eventsByMonth = {} calendar_events.forEach(event => { const dateStr = event.primary.event_date const monthKey = dateStr.split('-', 2).join('-') if (!eventsByMonth[monthKey]) { eventsByMonth[monthKey] = { monthName: monthMap[dateStr.split('-')[1]], list: [] } } eventsByMonth[monthKey].list.push(event) }) // 渲染分组后的事件 each monthData in Object.values(eventsByMonth) div(data-month=monthData.monthName) each event in monthData.list h2=event.primary.event_title[0].text p=event.primary.event_date
方案2:边遍历边处理(无需预处理分组)
如果不想额外做分组,也可以通过一个变量记录上一次处理的月份,仅在月份切换时开闭容器:
- const monthMap = { '01': 'January', '02': 'February', '03': 'March', '04': 'April', '05': 'May', '06': 'June', '07': 'July', '08': 'August', '09': 'September', '10': 'October', '11': 'November', '12': 'December' } // 记录上一次处理的月份 let lastMonthKey = null each event in calendar_events - const dateStr = event.primary.event_date - const currentMonthKey = dateStr.split('-', 2).join('-') - const currentMonthName = monthMap[dateStr.split('-')[1]] // 月份发生变化时处理容器开闭 if currentMonthKey !== lastMonthKey // 不是第一个月份的话,先闭合上一个容器 if lastMonthKey !== null | </div> // 开启新月份的容器 div(data-month=currentMonthName) // 渲染当前事件内容 h2=event.primary.event_title[0].text p=event.primary.event_date - lastMonthKey = currentMonthKey // 遍历结束后闭合最后一个月份的容器 if lastMonthKey !== null | </div>
你原有代码的问题是外层遍历每个事件时都会触发月份匹配逻辑,没有判断当前月份的容器是否已经创建,导致每个同月份事件都会生成新的容器,不符合预期。
内容的提问来源于stack exchange,提问作者Nuno Marques
相关产品推荐
相关产品推荐

