В Svelte реактивность встроена на уровне языка, что отличает его от традиционных фреймворков, где обновление интерфейса зависит от виртуального DOM или явных вызовов методов обновления состояния. В Svelte любые изменения значений переменных автоматически отражаются в DOM без необходимости дополнительного кода.
Ключевой механизм — реактивные присваивания и декларации. Простое присваивание переменной запускает обновление всех связанных с ней компонентов:
let count = 0;
function increment() {
count += 1; // автоматически обновит интерфейс
}
Для вычисляемых значений используется реактивная
декларация, обозначаемая символом $::
let a = 5;
let b = 10;
$: sum = a + b; // sum обновляется автоматически при изменении a или b
Реактивные декларации обеспечивают мгновенное отражение зависимостей, создавая цепочку реактивных вычислений, что исключает необходимость в сторонних библиотеках управления состоянием.
Svelte анализирует код на этапе компиляции и определяет зависимости переменных внутри реактивных блоков. Это означает, что:
Пример с массивами и объектами:
let items = [1, 2, 3];
$: doubled = items.map(x => x * 2); // обновляется при изменении items
Если изменить items через присваивание нового массива,
doubled пересчитается автоматически. Важно помнить, что
мутация массива напрямую (например,
items.push(4)) не всегда вызывает обновление. Для гарантии
реактивности используется присваивание нового значения:
items = [...items, 4];
Svelte поддерживает асинхронные операции внутри реактивных блоков. Это позволяет создавать сложные вычисления, зависящие от данных, получаемых из API или других источников:
let userId = 1;
let userData;
$: if (userId) {
fetch(`https://api.example.com/users/${userId}`)
.then(res => res.json())
.then(data => userData = data);
}
Блок с $: будет перезапускаться при изменении
userId, обеспечивая актуальность данных в интерфейсе.
Для передачи состояния между компонентами применяются Svelte store. Сторы реализуют реактивность через подписки:
import { writable } from 'svelte/store';
export const count = writable(0);
// использование в компоненте
import { count } from './store.js';
$count.subscribe(value => console.log(value)); // реактивное слежение
Преимущество сторов заключается в автоматическом обновлении всех
подписчиков при изменении значения, а синтаксис $count
внутри компонентов упрощает доступ и реактивное связывание:
{$count}
Svelte позволяет сочетать локальные реактивные переменные с глобальными стор-данными. Это дает гибкость в построении сложных интерфейсов:
Пример комбинации:
import { user } from './store.js';
let isEditing = false;
$: displayName = $user.name.toUpperCase();
Здесь displayName автоматически обновляется при
изменении глобального user, сохраняя локальную реактивность
без лишних вычислений.
Философия Svelte строится на компиляции времени: реактивность не требует виртуального DOM или прослушивания изменений во время выполнения. Все зависимости анализируются на этапе сборки, что делает приложения легкими и быстрыми.
Такой подход обеспечивает высокую производительность даже в сложных UI, где множество переменных и взаимодействий должно оставаться синхронизированным и предсказуемым.