В SvelteKit события играют центральную роль в организации
взаимодействия между UI-компонентами и логикой приложения. Они позволяют
отслеживать действия пользователя и реактивно обновлять состояние
интерфейса без лишнего кода. В отличие от традиционного подхода в DOM,
где приходится вручную привязывать обработчики через
addEventListener, Svelte предоставляет декларативный и
реактивный механизм для работы с событиями.
События в SvelteKit обрабатываются через директиву
on:event. Синтаксис прост:
<button on:click={handleClick}>Нажми меня</button>
Здесь handleClick — это функция, которая будет вызвана
при срабатывании события click. Важное отличие Svelte —
возможность напрямую использовать локальные функции компонента:
<script>
function handleClick() {
console.log('Кнопка нажата');
}
</script>
Такой подход обеспечивает компактность кода и улучшает читаемость компонентов.
SvelteKit поддерживает передачу данных через объект события
CustomEvent. Для этого используется директива
dispatch из встроенного модуля svelte:
<script>
import { createEventDispatcher } from 'svelte';
const dispatch = createEventDispatcher();
function sendData() {
dispatch('message', { text: 'Привет из компонента!' });
}
</script>
<button on:click={sendData}>Отправить сообщение</button>
На родительском компоненте обработка выглядит так:
<ChildComponent on:message={event => console.log(event.detail.text)} />
event.detail содержит данные, переданные через
CustomEvent. Это делает взаимодействие компонентов
прозрачным и реактивным.
SvelteKit предоставляет мощные модификаторы для событий:
preventDefault — предотвращает стандартное поведение
браузера:<form on:submit|preventDefault={handleSubmit}>
stopPropagation — останавливает всплытие события:<button on:click|stopPropagation={handleClick}>Клик</button>
once — обработчик срабатывает только один раз:<button on:click|once={handleClick}>Однократный клик</button>
capture — обработчик срабатывает на фазе
перехвата:<div on:click|capture={handleCapture}>
Модификаторы делают код чище, исключая необходимость писать дополнительные проверки и вручную управлять поведением событий.
В SvelteKit события могут быть тесно интегрированы с реактивными переменными. Пример:
<script>
let count = 0;
function increment() {
count += 1;
}
</script>
<button on:click={increment}>Увеличить счетчик</button>
<p>Текущее значение: {count}</p>
Состояние count автоматически обновляется при каждом
клике, а интерфейс реагирует мгновенно. Это минимизирует необходимость в
дополнительной логике обновления DOM.
Компоненты SvelteKit могут не только принимать события, но и сами их генерировать. Такой подход позволяет строить сложные UI-композиции. Пример компонента с пользовательским событием:
<!-- Toggle.svelte -->
<script>
import { createEventDispatcher } from 'svelte';
const dispatch = createEventDispatcher();
let active = false;
function toggle() {
active = !active;
dispatch('toggle', { active });
}
</script>
<button on:click={toggle}>
{#if active}Включено{:else}Выключено{/if}
</button>
Использование в родительском компоненте:
<Toggle on:toggle={e => console.log(e.detail.active)} />
Такой паттерн обеспечивает высокую повторяемость компонентов и чистоту архитектуры.
При использовании UI-библиотек на SvelteKit, например, компонентов из
Svelte Material UI или
Carbon Components Svelte, события интегрируются так же, как
и в стандартных компонентах Svelte:
<script>
import Button from 'svelte-material-ui/button';
function handleClick() {
console.log('SMUI кнопка нажата');
}
</script>
<Button on:click={handleClick}>SMUI Кнопка</Button>
Все стандартные модификаторы и механизмы передачи данных работают без ограничений. Это позволяет сочетать преимущества готовых UI-библиотек с реактивной моделью SvelteKit.
Для событий, вызываемых часто (например, input или
scroll), рекомендуется использовать дебаунс для оптимизации
производительности:
<script>
let value = '';
function handleInput(event) {
clearTimeout(timeout);
timeout = setTimeout(() => {
value = event.target.value;
}, 300);
}
</script>
<input type="text" on:input={handleInput} />
<p>Введенное значение: {value}</p>
Это снижает нагрузку на компонент и предотвращает лишние перерендеры.
createEventDispatcher для коммуникации
между компонентами.Эти практики позволяют строить масштабируемые и управляемые UI на SvelteKit, с чистой реактивной моделью и минимальными усилиями по синхронизации состояния между компонентами.