我正在开始研究用 Svelte 构建的项目,之前从未使用过 Svelte。我正在构建带有分页的表格,目前遇到的问题是我不知道如何实现分页按钮来显示不同的行。有什么建议我下一步应该做什么吗?
<script>
import { onMount } from "svelte";
import Header from "./components/Header.svelte";
import Row from "./components/Row.svelte";
import Footer from "./components/Footer.svelte";
import Overlay from "./components/Overlay.svelte";
let rows = [];
let page = 0;
let totalPages = [];
let currentPageRows = [];
let itemsPerPage = 5;
let loading = true;
const paginate = (items) => {
const pages = Math.ceil(items.length / itemsPerPage);
const paginatedItems = Array.from({ length: pages }, (_, index) => {
const start = index * itemsPerPage;
return items.slice(start, start + itemsPerPage);
});
console.log("paginatedItems are", paginatedItems);
totalPages = [...paginatedItems];
currentPageRows = paginatedItems[page];
};
onMount(() => {
fetch("devapi/accountStatement/transactions.json")
.then((response) => {
if (response.ok) {
return response.json();
}
throw Error(response.status);
})
.then((data) => {
rows = data;
paginate(data);
loading = false;
})
.catch((error) => {
console.log(error);
});
});
const nextPageHandler = () => {
if (page < totalPages.length) {
page += 1;
}
console.log("page is", page);
};
const previousPageHandler = () => {
if (page > 0) {
page -= 1;
}
console.log("page is", page);
};
</script>
<table class="table table-bordered table-striped table-hover">
<Header />
<tbody>
{#if loading}
<Overlay />
{/if}
{#each currentPageRows as row, i}
<Row {row} />
{:else}
<tr>
<td colspan="100%">
<h5 class="text-center">There is no data to display here.</h5>
</td>
</tr>
{/each}
</tbody>
<Footer />
</table>
<nav class="pagination">
<ul>
<li>
<button
type="button"
class="btn-next-prev"
on:click={() => previousPageHandler()}
>PREV
</button>
</li>
{#each totalPages as page, i}
<li>
<button type="button" class="btn-page-number">{i + 1}</button>
</li>
{/each}
<li>
<button
type="button"
class="btn-next-prev"
on:click={() => nextPageHandler()}
>NEXT
</button>
</li>
</ul>
</nav>
Run Code Online (Sandbox Code Playgroud)
你就快到了。您想要做的是引入 Svelte 的反应语句,使其currentPageRows依赖于 的当前值page。
您可以使用一行代码来完成此操作:
...
let rows = [];
let page = 0;
let totalPages = [];
let currentPageRows = [];
let itemsPerPage = 5;
let loading = true;
$: currentPageRows = totalPages.length > 0 ? totalPages[page] : [];
const paginate = (items) => {
...
}
...
Run Code Online (Sandbox Code Playgroud)
您还可以使用单个函数简化页面导航的处理:
const setPage = (p) => {
if (p >= 0 && p < totalPages.length) {
page = p;
}
}
Run Code Online (Sandbox Code Playgroud)
并在所有on:click事件处理程序中使用此函数:
<nav class="pagination">
<ul>
<li>
<button
type="button"
class="btn-next-prev"
on:click={() => setPage(page - 1)}
>
PREV
</button>
</li>
{#each totalPages as page, i}
<li>
<button
type="button"
class="btn-page-number"
on:click={() => setPage(i)}
>
{i + 1}
</button>
</li>
{/each}
<li>
<button
type="button"
class="btn-next-prev"
on:click={() => setPage(page + 1)}
>
NEXT
</button>
</li>
</ul>
</nav>
Run Code Online (Sandbox Code Playgroud)
请参阅此 REPL以获取精简示例。
| 归档时间: |
|
| 查看次数: |
3253 次 |
| 最近记录: |