Pagination (постраничная навигация) является ключевым элементом пользовательского интерфейса при работе с большими наборами данных. В контексте SvelteKit использование UI-библиотек для реализации пагинации позволяет создавать интерактивные, отзывчивые и легко настраиваемые компоненты без необходимости вручную управлять состоянием страниц и логикой навигации.
Пагинация делится на несколько важных аспектов:
currentPage) —
индекс активной страницы.totalPages)
— определяется размером набора данных и количеством элементов на одной
странице.pageSize) —
количество элементов, отображаемых на одной странице.Пример структуры состояния для пагинации в SvelteKit:
let currentPage = 1;
let pageSize = 10;
let totalItems = 120;
let totalPages = Math.ceil(totalItems / pageSize);
Современные SvelteKit UI библиотеки, такие как Svelte Material UI (SMUI), SvelteKit UI, Skeleton UI, предоставляют готовые компоненты пагинации с настраиваемым интерфейсом:
<script>
import { Pagination } from 'skeleton-ui';
let currentPage = 1;
const totalPages = 12;
function handlePageChange(event) {
currentPage = event.detail.page;
}
</script>
<Pagination {currentPage} {totalPages} on:change={handlePageChange} />
Ключевые параметры:
currentPage — текущая выбранная страница.totalPages — общее количество страниц.on:change — событие, вызываемое при смене
страницы.Дополнительно компоненты поддерживают такие настройки, как отображение стрелок навигации, элементов первой/последней страницы и «скрытых» страниц с многоточием.
Для работы с большими наборами данных часто используется динамическая пагинация, когда данные подгружаются по мере смены страницы. В SvelteKit это можно реализовать через асинхронные функции и реактивные переменные:
<script>
import { onMount } from 'svelte';
import { Pagination } from 'skeleton-ui';
let currentPage = 1;
let pageSize = 20;
let totalPages = 0;
let items = [];
async function fetchData(page) {
const response = await fetch(`/api/items?page=${page}&limit=${pageSize}`);
const data = await response.json();
items = data.items;
totalPages = data.totalPages;
}
$: fetchData(currentPage);
function handlePageChange(event) {
currentPage = event.detail.page;
}
</script>
<ul>
{#each items as item}
<li>{item.name}</li>
{/each}
</ul>
<Pagination {currentPage} {totalPages} on:change={handlePageChange} />
Особенности:
fetchData вызывается автоматически при изменении
currentPage благодаря реактивной декларации
$:.Pagination управляет пользовательским вводом
и передает выбранную страницу через событие change.UI библиотеки для SvelteKit позволяют тонко настраивать стили пагинации:
size="small" | "medium" | "large")color="primary" | "secondary" | "accent")showArrows={true|false})Пример с адаптивным отображением страниц:
<Pagination
{currentPage}
{totalPages}
showArrows={true}
maxVisiblePages={5}
on:change={handlePageChange}
/>
Для проектов с большим количеством страниц используется интеллектуальное отображение страниц, когда видны только ближайшие и крайние страницы:
...).function getVisiblePages(currentPage, totalPages, maxVisible = 5) {
const pages = [];
const half = Math.floor(maxVisible / 2);
let start = Math.max(1, currentPage - half);
let end = Math.min(totalPages, currentPage + half);
if (start > 1) pages.push(1, '...');
for (let i = start; i <= end; i++) pages.push(i);
if (end < totalPages) pages.push('...', totalPages);
return pages;
}
Реализация подобной логики внутри Svelte компонента позволяет создавать динамически масштабируемую пагинацию, подходящую для интерфейсов с сотнями страниц.
SvelteKit обеспечивает возможность связывать пагинацию с URL-параметрами, что позволяет использовать прямые ссылки на определённые страницы:
<script>
import { page } from '$app/stores';
import { Pagination } from 'skeleton-ui';
import { goto } from '$app/navigation';
$: currentPage = +$page.url.searchParams.get('page') || 1;
function handlePageChange(event) {
goto(`?page=${event.detail.page}`);
}
</script>
<Pagination {currentPage} {totalPages} on:change={handlePageChange} />
Преимущества такого подхода:
Пагинация в SvelteKit UI библиотеках сочетает удобство готовых компонентов с гибкостью кастомной логики. Ключевые возможности включают:
Эти подходы позволяют создавать эффективные и отзывчивые интерфейсы, подходящие как для малых проектов, так и для сложных корпоративных приложений.