如何在Svelte的{#each}块中每4个月份元素包裹div
解决方案
要实现每4个月份用带背景图的div包裹,最清晰的方式是先对月份数据进行分组预处理,再通过嵌套的{#each}块渲染分组和组内月份,避免在原循环里写复杂的索引判断逻辑。
步骤1:预处理分组数据
在组件的<script>块中,将yearObj的条目转换成每4个一组的二维数组:
<script> // 假设yearObj是你的月份数据对象 const monthEntries = Object.entries(yearObj); const groupedMonths = []; // 每4个月份分为一组 for (let i = 0; i < monthEntries.length; i += 4) { groupedMonths.push(monthEntries.slice(i, i + 4)); } </script>
步骤2:嵌套循环渲染分组
修改原有的{#each}逻辑,先遍历分组,给每个分组外层添加带背景的div,再遍历组内的每个月份:
{#each groupedMonths as monthGroup} <!-- 分组外层div,这里添加背景图样式 --> <div class="month-group bg-cover bg-center" style="background-image: url('/your-background-image.jpg')"> {#each monthGroup as [key, value], index (key)} <!-- 原有的单个月份渲染代码 --> <div class="inline-block bg-slate-900 flex flex-col flex-nowrap items-center p-0 border break-after-page"> <p class="block text-center py-1.5 ">{key}</p> <table class=" bg-slate-500 bg-opacity-50 w-full"> <thead> <tr> {#each week_days as col} {#if col == 'Sunday' || col == 'Saturday'} <th class="text-purple-900 border border-gray-900 shrink px-2.5 py-1.5">{col}</th> {:else} <th class="text-black border border-gray-900 shrink px-2.5 py-1.5">{col}</th> {/if} {/each} </tr> </thead> <tbody> {#each value as mon} <tr> {#each mon as cell} <td class="border border-gray-900 py-1.5">{cell}</td> {/each} </tr> {/each} </tbody> </table> </div> {/each} </div> {/each}
可选:给不同分组设置不同背景
如果需要每组使用不同背景图,可以根据分组索引动态设置:
{#each groupedMonths as monthGroup, groupIndex} <div class="month-group bg-cover bg-center" style="background-image: url('/bg-group-{groupIndex + 1}.jpg')" > <!-- 组内月份渲染 --> </div> {/each}
或者通过CSS类名控制:
.month-group.group-1 { background-image: url('/bg-1.jpg'); } .month-group.group-2 { background-image: url('/bg-2.jpg'); } /* 以此类推 */
然后在模板中:
<div class="month-group bg-cover bg-center group-{groupIndex + 1}">
内容的提问来源于stack exchange,提问作者Kalvin
相关产品推荐
相关产品推荐

