如何循环列表并在 svelte 中每行显示 4 个项目
how to loop over list and display 4 items per row in svelte
我有以下代码
<script>
let cats = [
{ id: 'OUtn3pvWmp1', name: 'Cat1' },
{ id: 'OUtn3pvWmp2', name: 'Cat2' },
{ id: 'OUtn3pvWmp3', name: 'Cat3' },
{ id: 'OUtn3pvWmp4', name: 'Cat4' },
{ id: 'OUtn3pvWmp5', name: 'Cat4' },
{ id: 'OUtn3pvWmp6', name: 'Cat6' },
{ id: 'OUtn3pvWmp7', name: 'Cat7' },
{ id: 'OUtn3pvWmp8', name: 'Cat8' },
{ id: 'OUtn3pvWmp9', name: 'Cat9' },
];
</script>
<style>
.first{ background-color:pink}
.second{ background-color:yellow;padding-top:10px}
.third{ background-color:green;padding-top:10px}
</style>
我想遍历数据并像这样每行显示 4 个项目作为输出。
<h1>The Famous Cats of YouTube</h1>
<div class="row first">
<main class="col-md-10 col-md-10 col-lg-10 px-md-4 pt-1" role="main">
<div class="row first">
<div class="card-group">
<div class="card">cat1</div>
<div class="card">cat2</div>
<div class="card">cat3</div>
<div class="card">cat4</div>
</div>
</div> <!--end row -->
<div class="row second">
<div class="card-group">
<div class="card">cat5</div>
<div class="card">cat6</div>
<div class="card">cat7</div>
<div class="card">cat8</div>
</div>
</div> <!--end row -->
<div class="row third">
<div class="card-group">
<div class="card">cat9</div>
</div>
</div><!--end row -->
</main>
</div>
基于列表的实现可能如下所示:
使用模运算:
{#each cats as cat, i}
{#if i % 4 === 0}
<div>{cats[i]}</div>
<div>{cats[i + 1]}</div>
<div>{cats[i + 2]}</div>
<div>{cats[i + 3]}</div>
{/if}
{/each}
要按照描述排列 <div>
标签,您的示例中需要额外的 css。
添加:
您必须为行定义 css 类 和 card-group。
<style>
.row {
display:grid;
grid-columns: 4;
}
.card-group {
display: flex;
}
</style>
这是我使用的方式。每行的列数是一个变量。这使用模数学。有一个 if 条件检查数组中是否存在某个项目,以确保您没有使用越界索引。
<script>
let cols = 4;
let cats = [...];
</script>
{#each cats as cat, i}
{#if i % cols === 0}
<div class="row">
{#each Array(cols) as _,j}
{#if cats[i/cols*cols + j]}
<div class="col">{cats[i/cols*cols + j]}</div>
{/if}
{/each}
</div>
{/if}
{/each}
我有以下代码
<script>
let cats = [
{ id: 'OUtn3pvWmp1', name: 'Cat1' },
{ id: 'OUtn3pvWmp2', name: 'Cat2' },
{ id: 'OUtn3pvWmp3', name: 'Cat3' },
{ id: 'OUtn3pvWmp4', name: 'Cat4' },
{ id: 'OUtn3pvWmp5', name: 'Cat4' },
{ id: 'OUtn3pvWmp6', name: 'Cat6' },
{ id: 'OUtn3pvWmp7', name: 'Cat7' },
{ id: 'OUtn3pvWmp8', name: 'Cat8' },
{ id: 'OUtn3pvWmp9', name: 'Cat9' },
];
</script>
<style>
.first{ background-color:pink}
.second{ background-color:yellow;padding-top:10px}
.third{ background-color:green;padding-top:10px}
</style>
我想遍历数据并像这样每行显示 4 个项目作为输出。
<h1>The Famous Cats of YouTube</h1>
<div class="row first">
<main class="col-md-10 col-md-10 col-lg-10 px-md-4 pt-1" role="main">
<div class="row first">
<div class="card-group">
<div class="card">cat1</div>
<div class="card">cat2</div>
<div class="card">cat3</div>
<div class="card">cat4</div>
</div>
</div> <!--end row -->
<div class="row second">
<div class="card-group">
<div class="card">cat5</div>
<div class="card">cat6</div>
<div class="card">cat7</div>
<div class="card">cat8</div>
</div>
</div> <!--end row -->
<div class="row third">
<div class="card-group">
<div class="card">cat9</div>
</div>
</div><!--end row -->
</main>
</div>
基于列表的实现可能如下所示:
使用模运算:
{#each cats as cat, i}
{#if i % 4 === 0}
<div>{cats[i]}</div>
<div>{cats[i + 1]}</div>
<div>{cats[i + 2]}</div>
<div>{cats[i + 3]}</div>
{/if}
{/each}
要按照描述排列 <div>
标签,您的示例中需要额外的 css。
添加:
您必须为行定义 css 类 和 card-group。
<style>
.row {
display:grid;
grid-columns: 4;
}
.card-group {
display: flex;
}
</style>
这是我使用的方式。每行的列数是一个变量。这使用模数学。有一个 if 条件检查数组中是否存在某个项目,以确保您没有使用越界索引。
<script>
let cols = 4;
let cats = [...];
</script>
{#each cats as cat, i}
{#if i % cols === 0}
<div class="row">
{#each Array(cols) as _,j}
{#if cats[i/cols*cols + j]}
<div class="col">{cats[i/cols*cols + j]}</div>
{/if}
{/each}
</div>
{/if}
{/each}