Table-компоненты в SvelteKit являются мощным инструментом для отображения структурированных данных в веб-приложениях. Они предоставляют разработчику возможность быстро создавать интерактивные, стилизованные и адаптивные таблицы с поддержкой сортировки, фильтрации, пагинации и кастомных рендеров ячеек.
В SvelteKit UI библиотеках, таких как Svelte Material UI, Skeleton UI, Flowbite-Svelte, таблицы строятся на основе компонентов с реактивными свойствами, что позволяет динамически обновлять данные без перезагрузки страницы.
Типичная таблица состоит из следующих элементов:
<Table> – контейнер таблицы,
задающий базовую структуру и стили.<TableHead> – блок заголовков
колонок. Позволяет определять заголовки и их порядок.<TableBody> – основной блок
данных. Является контейнером для строк таблицы.<TableRow> – отдельная строка
таблицы.<TableCell> – ячейка таблицы,
которая может содержать текст, ссылки, кнопки или другие
компоненты.Пример базовой таблицы:
<script>
import { Table, TableHead, TableBody, TableRow, TableCell } from 'sveltekit-ui';
let users = [
{ id: 1, name: 'Иван', email: 'ivan@example.com' },
{ id: 2, name: 'Мария', email: 'maria@example.com' },
{ id: 3, name: 'Алексей', email: 'alex@example.com' }
];
</script>
<Table>
<TableHead>
<TableRow>
<TableCell>ID</TableCell>
<TableCell>Имя</TableCell>
<TableCell>Email</TableCell>
</TableRow>
</TableHead>
<TableBody>
{#each users as user}
<TableRow>
<TableCell>{user.id}</TableCell>
<TableCell>{user.name}</TableCell>
<TableCell>{user.email}</TableCell>
</TableRow>
{/each}
</TableBody>
</Table>
SvelteKit позволяет использовать реактивные переменные для динамического обновления таблицы. В сочетании с UI библиотеками можно реализовать сортировку по колонкам.
Пример сортировки:
<script>
import { Table, TableHead, TableBody, TableRow, TableCell } from 'sveltekit-ui';
let users = [
{ id: 1, name: 'Иван', email: 'ivan@example.com' },
{ id: 2, name: 'Мария', email: 'maria@example.com' },
{ id: 3, name: 'Алексей', email: 'alex@example.com' }
];
let sortKey = 'id';
let ascending = true;
$: sortedUsers = [...users].sort((a, b) => {
if (a[sortKey] < b[sortKey]) return ascending ? -1 : 1;
if (a[sortKey] > b[sortKey]) return ascending ? 1 : -1;
return 0;
});
function toggleSort(key) {
if (sortKey === key) {
ascending = !ascending;
} else {
sortKey = key;
ascending = true;
}
}
</script>
<Table>
<TableHead>
<TableRow>
<TableCell on:click={() => toggleSort('id')}>ID</TableCell>
<TableCell on:click={() => toggleSort('name')}>Имя</TableCell>
<TableCell on:click={() => toggleSort('email')}>Email</TableCell>
</TableRow>
</TableHead>
<TableBody>
{#each sortedUsers as user}
<TableRow>
<TableCell>{user.id}</TableCell>
<TableCell>{user.name}</TableCell>
<TableCell>{user.email}</TableCell>
</TableRow>
{/each}
</TableBody>
</Table>
Ключевой момент: использование реактивного $: позволяет
автоматически пересортировывать таблицу при изменении ключа сортировки
или порядка.
Фильтрация данных часто используется вместе с таблицами для упрощения поиска по большим наборам данных.
<script>
let query = '';
$: filteredUsers = users.filter(user =>
user.name.toLowerCase().includes(query.toLowerCase()) ||
user.email.toLowerCase().includes(query.toLowerCase())
);
</script>
<input type="text" placeholder="Поиск..." bind:value={query} />
<Table>
<TableHead>
<TableRow>
<TableCell>ID</TableCell>
<TableCell>Имя</TableCell>
<TableCell>Email</TableCell>
</TableRow>
</TableHead>
<TableBody>
{#each filteredUsers as user}
<TableRow>
<TableCell>{user.id}</TableCell>
<TableCell>{user.name}</TableCell>
<TableCell>{user.email}</TableCell>
</TableRow>
{/each}
</TableBody>
</Table>
Использование реактивной переменной query обеспечивает
мгновенное обновление отображаемых строк таблицы при вводе текста.
Для больших наборов данных UI библиотеки предлагают встроенные решения для пагинации и виртуализации строк, что значительно повышает производительность.
Пример простой пагинации:
<script>
let page = 1;
let pageSize = 2;
$: paginatedUsers = users.slice((page - 1) * pageSize, page * pageSize);
function nextPage() {
if (page * pageSize < users.length) page += 1;
}
function prevPage() {
if (page > 1) page -= 1;
}
</script>
<Table>
<TableHead>
<TableRow>
<TableCell>ID</TableCell>
<TableCell>Имя</TableCell>
<TableCell>Email</TableCell>
</TableRow>
</TableHead>
<TableBody>
{#each paginatedUsers as user}
<TableRow>
<TableCell>{user.id}</TableCell>
<TableCell>{user.name}</TableCell>
<TableCell>{user.email}</TableCell>
</TableRow>
{/each}
</TableBody>
</Table>
<button on:click={prevPage} disabled={page === 1}>Назад</button>
<button on:click={nextPage} disabled={page * pageSize >= users.length}>Вперед</button>
Table-компоненты в SvelteKit UI libs позволяют вставлять внутрь ячеек любые компоненты: кнопки, аватары, иконки, чекбоксы.
Пример: добавление кнопки действия в каждой строке:
<TableBody>
{#each users as user}
<TableRow>
<TableCell>{user.id}</TableCell>
<TableCell>{user.name}</TableCell>
<TableCell>{user.email}</TableCell>
<TableCell>
<button on:click={() => alert(`Редактирование ${user.name}`)}>Редактировать</button>
</TableCell>
</TableRow>
{/each}
</TableBody>
Важно учитывать, что кастомные ячейки остаются реактивными и могут содержать вложенные компоненты с собственными событиями.
Большинство SvelteKit UI библиотек предоставляют встроенные классы для цветов, границ, тени, hover-эффектов и адаптивного поведения на мобильных устройствах.
Пример использования адаптивной таблицы:
<Table class="responsive">
...
</Table>
Ключевая идея: комбинирование встроенных стилей библиотеки и кастомных классов Tailwind или CSS позволяет создавать уникальные, удобные для пользователя таблицы.
Эти принципы охватывают полный спектр работы с Table компонентами в SvelteKit UI библиотеках: базовая структура, реактивные данные, сортировка, фильтрация, пагинация, кастомизация ячеек и адаптивная стилизация. Такой подход позволяет создавать сложные, интерактивные таблицы с минимальным количеством кода, сохраняя высокую производительность и удобство разработки.