В SvelteKit компоненты являются строительными блоками интерфейса. Каждый компонент инкапсулирует структуру (HTML), логику (JS/TS) и стили (CSS/SCSS), что обеспечивает модульность и повторное использование. В UI библиотеках SvelteKit компоненты часто поставляются с расширенным API, позволяющим легко управлять состоянием, событиями и взаимодействием с другими элементами.
Типичная структура компонента в SvelteKit UI lib включает три части:
<script lang="ts">
export let title: string;
let isOpen = false;
function toggle() {
isOpen = !isOpen;
}
</script>
<style>
.modal { background: white; padding: 1rem; border-radius: 8px; }
.hidden { display: none; }
</style>
<div class="modal" class:hidden={!isOpen}>
<h2>{title}</h2>
<button on:click={toggle}>Закрыть</button>
</div>
<script> — содержит логику
компонента, экспортируемые свойства (props), локальное
состояние и функции-обработчики событий.<style> — описывает стили
компонента. Можно использовать scoped CSS или интеграцию с CSS-in-JS
библиотеками, поддерживаемыми UI lib.{}.SvelteKit UI libs активно используют props для передачи данных в компоненты. Пример передачи данных:
<MyButton color="primary" size="large" on:click={handleClick} />
color и size — настраиваемые свойства,
влияющие на стили.on:click — синтаксис добавления обработчиков
событий.Реактивность обеспечивается с помощью
$:, позволяющей автоматически обновлять
DOM при изменении состояния:
<script>
let count = 0;
$: doubled = count * 2;
</script>
<p>{doubled}</p>
<button on:click={() => count += 1}>Увеличить</button>
UI компоненты часто предоставляют слоты, которые позволяют вставлять кастомное содержимое внутрь компонента без изменения его внутренней логики:
<Modal>
<h1 slot="header">Заголовок модалки</h1>
<p>Содержимое модалки</p>
<button slot="footer">Закрыть</button>
</Modal>
slot="header" и
slot="footer" — именованные слоты для точного
размещения контента.Компоненты UI libs могут эмитировать кастомные
события, которые обрабатываются через
on:event:
<Dropdown on:select={handleSelect} />
Внутри компонента событие создаётся с помощью
createEventDispatcher:
<script>
import { createEventDispatcher } from 'svelte';
const dispatch = createEventDispatcher();
function selectItem(item) {
dispatch('sel ect', item);
}
</script>
Это позволяет отделять логическую часть от внешнего взаимодействия.
Современные UI библиотеки для SvelteKit поддерживают темизацию и варианты стилей через props или CSS-переменные:
<Button variant="outline" color="secondary">Кнопка</Button>
variant — определяет базовый стиль (filled, outline,
ghost).color — управляет основной цветовой схемой.Большинство библиотек позволяют переопределять глобальные CSS-переменные для создания собственной темы без изменения исходного кода компонента.
SvelteKit UI libs активно используют композицию компонентов:
<Card>
<CardHeader>Заголовок</CardHeader>
<CardBody>Основное содержимое</CardBody>
<CardFooter>Подвал</CardFooter>
</Card>
Card)
предоставляют контейнер с общей структурой.CardHeader,
CardBody, CardFooter) отвечают за
семантическое разделение контента.Это повышает гибкость и снижает дублирование кода.
Для UI компонентов важно централизованное управление состоянием. В SvelteKit UI libs используются stores:
<script>
import { writable } fr om 'svelte/store';
export const modalOpen = writable(false);
</script>
Компоненты могут подписываться на store и автоматически обновляться при изменении:
<script>
import { modalOpen } from './store.js';
</script>
{#if $modalOpen}
<Modal>Содержимое модалки</Modal>
{/if}
$modalOpen — реактивное значение из store.SvelteKit UI libs часто включают встроенные анимации и переходы.
Пример использования transition:
<script>
import { fade } from 'svelte/transition';
let visible = true;
</script>
<button on:click={() => visible = !visible}>Toggle</button>
{#if visible}
<div transition:fade>Появляющийся блок</div>
{/if}
fade,
slide, fly, а также пользовательские кастомные
функции.Компоненты UI libs обычно соответствуют стандартам WCAG и включают ARIA-атрибуты:
<Modal aria-label="Диалоговое окно" role="dialog" />
Эти подходы создают фундамент для построения масштабируемых, настраиваемых и поддерживаемых интерфейсов в SvelteKit с использованием UI библиотек.