В SvelteKit управление состоянием компонентов и передача данных между ними имеют свои особенности, отличающиеся от классических подходов в React или Vue. Два ключевых механизма здесь — prop drilling и контекст (context API). Понимание их работы позволяет строить чистую и поддерживаемую архитектуру приложения.
Prop drilling — это процесс передачи данных от родительского компонента к дочерним через свойства (props), даже если промежуточные компоненты сами не используют эти данные.
<!-- App.svelte -->
<script>
let user = { name: "Алексей", role: "admin" };
</script>
<Layout {user} />
<!-- Layout.svelte -->
<script>
export let user;
</script>
<Header {user} />
<MainContent {user} />
<!-- Header.svelte -->
<script>
export let user;
</script>
<h1>Привет, {user.name}</h1>
В этом примере user передаётся через Layout
к Header. Если компонентов-посредников много, количество
props, передаваемых по цепочке, растёт, усложняя поддержку кода.
Недостатки prop drilling:
SvelteKit предоставляет контекст, который позволяет передавать данные напрямую вниз по дереву компонентов без явного пропс-дриллинга.
setContext(key, value) — устанавливает значение в
контексте компонента.getContext(key) — извлекает значение из контекста
дочерним компонентом.<!-- App.svelte -->
<script>
import { setContext } from 'svelte';
import Layout from './Layout.svelte';
const user = { name: "Алексей", role: "admin" };
setContext('user', user);
</script>
<Layout />
<!-- Header.svelte -->
<script>
import { getContext } from 'svelte';
const user = getContext('user');
</script>
<h1>Привет, {user.name}</h1>
Контекст позволяет дочерним компонентам получать данные, минуя промежуточные слои, что значительно упрощает поддержку сложных приложений.
const USER = Symbol('user');
setContext(USER, user);
const user = getContext(USER);
writable из svelte/store), изменения
автоматически обновят все дочерние компоненты, которые используют это
значение.<!-- store.js -->
import { writable } from 'svelte/store';
export const userStore = writable({ name: 'Алексей', role: 'admin' });
<!-- App.svelte -->
<script>
import { setContext } from 'svelte';
import { userStore } from './store.js';
setContext('user', userStore);
</script>
<!-- Header.svelte -->
<script>
import { getContext } from 'svelte';
const userStore = getContext('user');
</script>
<h1>{$userStore.name}</h1>
Prop drilling подходит для:
Контекст необходим, когда:
Контекст идеально сочетается с Svelte stores (writable,
readable, derived), позволяя создавать
централизованное реактивное состояние приложения. Такой подход сокращает
количество пропсов, улучшает читаемость и облегчает масштабирование
приложения.
store.SvelteKit предоставляет мощные инструменты для управления состоянием и передачи данных, где prop drilling остаётся простым и прозрачным решением для локальных случаев, а контекст служит эффективным способом уменьшить связность компонентов и создать более поддерживаемую архитектуру.