Svelte 5 содержит улучшения, а именно функциональные компоненты и внедрение сигналов, но в остальном это в основном постепенное обновление. Единственным исключением является новая функция «Руны», которая предлагает множество идей по управлению реактивностью более модульным, кратким и детализированным способом.
В этой статье вы получите практическое представление об основных рунах, поставляемых в Svelte 5: $state()
, $derived()
, $props()
, $inspectI()
и $эффект().
Руны в Svelte
На первый взгляд может показаться, что новая функция рун усложняет работу со Svelte. Фактически, эта идея предлагает более простой подход к выполнению многих вещей, которые вы, вероятно, уже делаете. Термин руна относится к магическому глифу или букве алфавита, обладающей таинственной силой. В Svelte руны — это специальные токены, которые сообщают компилятору Svelte работать за кулисами определенным образом, чтобы все произошло.
Руна дает вам простой синтаксис, позволяющий движку Svelte выполнять конкретную полезную работу, такую как управление состоянием и раскрытие свойств компонента.
Основные руны, представленные в Svelte 5:
$state()
$derived()
$effect()
$props()
$inspect()
Как видите, руна — это функция, перед которой стоит символ доллара. Как разработчик, вы используете эти специальные функции почти так же, как и любую другую функцию. Затем движок Svelte незаметно реализует за вас предполагаемое действие руны.
$state()
Начнем с рассмотрения $state()
, эту руну вы, скорее всего, будете использовать чаще всего. В (очень) широком смысле слова $state
rune делает что-то логически похожее на React useState()
крючок, предоставляющий функциональный способ борьбы с реактивным состоянием.
Давайте рассмотрим простой пример. Вот как можно создать поле ввода и отобразить его значение в Svelte 4 без рун:
<script>
let text = "Default";
</script>
<input type="text" bind:value={text}/>
Text: {text}
А теперь вот то же самое действие с $state
руна:
<script>
let text = $state("Default")
</script>
<input type="text" bind:value={text}/>
Text: {text}
В обоих этих примерах у нас есть простая переменная состояния (text
) и использовать его для ввода текста, который выводится на экран. Это типичный код Svelte, особенно bind:value={text}
синтаксис, который дает вам простой способ двусторонней привязки к вводу.
Единственное изменение здесь заключается в том, что вместо объявления обычной переменной с let text = "Default"
объявляем ее государственной руной: let text = $state("Default")
. "Default"
мы переходим в $state
является начальным значением.
Обратите внимание, что bind:value
вызов вообще не должен меняться: Svelte знает, как использовать руну в этом контексте. В целом, state rune
ссылка действует правильно везде, где работает переменная.
Хотя это небольшое изменение, ясность дает очевидную выгоду. Замечательно, что компилятор Svelte волшебным образом это понимает. let count = 0
должен быть реактивным, когда он находится в верхней части компонента. Но по мере роста кодовой базы эта функция становится немного запутанной, поскольку становится трудно определить, какие переменные являются реактивными. $state
Руна устраняет эту проблему.
Еще одно преимущество заключается в том, что $state
может появиться где угодно, а не только на верхнем уровне ваших компонентов. Итак, предположим, нам нужна фабричная функция, которая будет создавать текстовые состояния для использования в произвольных входных данных. Вот простой пример:
<script>
let makeText = function(def){
let myText = $state(def);
return {
get text() { return myText },
set text(text) { myText = text },
}
}
let text = makeText("test");
</script>
<input type="text" bind:value={text.text}/>
Text: {text.text}
Хотя пример надуманный, суть в том, $state()
Декларация создает функционирующее реактивное состояние из другой области действия, что требует искажений в старом синтаксисе Svelte. Также обратите внимание, что в этом случае мы предоставили как метод получения, так и метод установки для текстовой переменной; это потому, что bind:value
вызов — это двусторонняя привязка, требующая доступа как для чтения, так и для записи к объекту состояния.
Еще одно интересное свойство $state()
руна заключается в том, что она автоматически привязывается к членам объекта:
<script>
let valueObject = new class {
text = $state('I am a test')
num = $state(42)
};
</script>
<input type="text" bind:value={valueObject.text}/>
<input type="number" bind:value={valueObject.num}/>
<br>
Text: {valueObject.text}
<br>
Number: {valueObject.num}
Суть этого фрагмента в том, что text
и num
свойства valueObject
class автоматически правильно привязываются к входам без явного объявления геттеров и сеттеров. Svelte автоматически предоставляет геттеры и сеттеры, необходимые объекту для доступа к свойствам объекта. valueObject
сорт.
$производный()
Раньше вы могли создать производное свойство, используя $:
синтаксис в Svelte. Это имело некоторые ограничения, в том числе то, что значения могли устаревать, поскольку движок обновлял вычисленное значение только при обновлении компонента. Svelte 5 заменяет $:
синтаксис с $derived()
что позволяет постоянно синхронизировать вычисленное значение.
Вот пример использования $derived
для объединения строк из текстовых полей:
<script>
let greeting = $state("Hello there");
let name = $state("User");
let sentence = $derived(greeting + " " + name);
</script>
<input type="text" bind:value={greeting}/>
<input type="text" bind:value={name}/>
<br>
Text: {sentence }
Здесь мы используем переменную предложения в качестве производная руна. Оно происходит от рун состояния приветствия и имени. Итак, производная руна объединяет состояния переменных состояния.
С использованием $derived(greeting + “ “ + name)
гарантирует, что при изменении приветствия или имени переменная предложения будет отражать эти изменения.
$эффект()
$effect
— это руна, которая работает аналогично эффекту useState() в React. Он используется для создания эффектов за пределами реактивного двигателя. Вот пример из документации Svelte:
$effect(() => {
// runs when the component is mounted, and again
// whenever `count` or `doubled` change,
// after the DOM has been updated
console.log({ count, doubled });
return () => {
// if a callback is provided, it will run
// a) immediately before the effect re-runs
// b) when the component is destroyed
console.log('cleanup');
};
});
Цель этого кода — запустить журналирование при первом монтировании компонента, а затем всякий раз, когда зависимые переменные count
и doubled
модифицированы. Необязательное возвращаемое значение позволяет выполнить необходимую очистку до запуска эффекта или при размонтировании компонента.
$реквизит()
$props()
— это новый способ объявления и использования свойств компонентов в Svelte. Это охватывает несколько вариантов использования, особенно экспорт переменных на верхнем уровне компонентов с помощью let
. Пример стоит тысячи слов, и вообще новый $props
синтаксис чист и очевиден:
// main.svelte
<script>
import Component2 from './Component2.svelte';
</script>
<Component2>
</Component2>
<Component2 prop2 = "test">
</Component2>
// Component2.svelte
<script>
let { prop1 = "foo", prop2} = $props();
</script>
{prop1}
<br>
{prop2}
//outputs:
foo
foo
test
Здесь main.svelte
компонент импортирует Component2
и демонстрация того, как изменять реквизиты с помощью свойств разметки. Заметить, что Component2
может объявлять значения по умолчанию, например prop1 = “foo”
.
$осмотр()
Последняя руна, которую мы рассмотрим, это $inspect
. Это своего рода реактивный оператор журналирования консоли:
<script>
let count = $state(0);
let message = $state('hello');
$inspect(count, message); // will console.log when `count` or `message` change
</script>
<button onclick={() => count++}>Increment</button>
<input bind:value={message} />
В этом примере (взятом из документации Svelte) цель состоит в том, чтобы создавать оператор регистрации всякий раз, когда изменяется количество переменных сообщения. По сути, это дает вам простой способ реактивного входа в консоль в ответ на обновления переменных.
Заключение
Общий эффект рун заключается в упрощении API Svelte для разработчиков. Потребуется некоторое время, чтобы адаптироваться к новому синтаксису и перенести существующий код, но в целом новый подход действительно проще. Если есть исключение, то это $effect()
руна, которая требует немного больше размышлений, прежде чем ее использовать для замены существующих подходов. Элегантность $state()
, $derived()
и $props()
более чем компенсировать $effect()
сложность. В целом, новая функция «Руны» — это свежая и долгожданная идея в области реактивности.
Дальше читайте это:
- Почему компании уходят из облака
- 5 простых способов запустить LLM локально
- Программирование с помощью ИИ: советы и лучшие практики от разработчиков
- Знакомьтесь, Zig: современная альтернатива C
- Что такое генеративный ИИ? Искусственный интеллект, который создает
- Лучшее программное обеспечение с открытым исходным кодом 2023 года