SvelteKit предоставляет мощный и декларативный подход к созданию
форм, упрощая управление состоянием инпутов, валидацию и отправку
данных. Формы в SvelteKit строятся на стандартных HTML-элементах
(<form>, <input>,
<textarea>, <select>) с
добавлением реактивности через связывание данных
(bind:value) и обработку событий.
Ключевой особенностью Svelte является bind:value, позволяющий синхронизировать состояние инпута и переменной в компоненте:
<script>
let username = '';
let password = '';
</script>
<form on:submit|preventDefault={handleSubmit}>
<input type="text" placeholder="Имя пользователя" bind:value={username} />
<input type="password" placeholder="Пароль" bind:value={password} />
<button type="submit">Войти</button>
</form>
<script>
function handleSubmit() {
console.log({ username, password });
}
</script>
bind:value={variable} автоматически обновляет
переменную при изменении значения инпута.|preventDefault на событии
submit предотвращает перезагрузку страницы.SvelteKit поддерживает все стандартные типы инпутов, при этом двустороннее связывание работает и с чекбоксами, и с радио-кнопками.
Чекбоксы:
<script>
let subscribe = false;
</script>
<label>
<input type="checkbox" bind:checked={subscribe} />
Подписка на новости
</label>
bind:checked вместо
bind:value.Радиокнопки:
<script>
let gender = '';
</script>
<label>
<input type="radio" name="gender" value="male" bind:group={gender} />
Мужской
</label>
<label>
<input type="radio" name="gender" value="female" bind:group={gender} />
Женский
</label>
bind:group синхронизирует выбранное значение
радио-группы с переменной.<input type="text"> и
<textarea> полностью совместимы с реактивными
переменными:
<script>
let comment = '';
</script>
<textarea bind:value={comment} placeholder="Оставьте комментарий"></textarea>
<p>Количество символов: {comment.length}</p>
Для <select> доступна реактивная привязка через
bind:value и bind:group для множественного
выбора:
<script>
let country = '';
let languages = [];
</script>
<sel ect bind:value={country}>
<option value="">Выберите страну</option>
<option value="ru">Россия</option>
<option value="us">США</option>
</select>
<sel ect multiple bind:value={languages}>
<option value="en">Английский</option>
<option value="ru">Русский</option>
<option value="fr">Французский</option>
</select>
multiple позволяет выбирать несколько значений
одновременно.SvelteKit упрощает реактивную валидацию форм через $: и
вычисляемые значения:
<script>
let email = '';
let password = '';
$: emailError = email.includes('@') ? '' : 'Введите корректный email';
$: passwordError = password.length >= 6 ? '' : 'Пароль должен быть не менее 6 символов';
</script>
<form on:submit|preventDefault={handleSubmit}>
<input type="email" placeholder="Email" bind:value={email} />
{#if emailError}<span class="error">{emailError}</span>{/if}
<input type="password" placeholder="Пароль" bind:value={password} />
{#if passwordError}<span class="error">{passwordError}</span>{/if}
<button type="submit" disabled={emailError || passwordError}>Регистрация</button>
</form>
Для работы с сервером можно использовать actions SvelteKit:
<form method="POST" use:enhance>
<input type="text" name="username" bind:value={username} />
<button type="submit">Отправить</button>
</form>
<script>
import { enhance } fr om '$app/forms';
let username = '';
function handleFormSubmit({ result, form }) {
console.log('Данные формы:', form);
console.log('Ответ сервера:', result);
}
</script>
enhance позволяет обрабатывать формы асинхронно без
перезагрузки страницы.Для более сложных интерфейсов форм можно использовать специализированные библиотеки:
bind:value.Примеры использования:
<script>
import TextField fr om '@smui/textfield';
let name = '';
</script>
<TextField bind:value={name} label="Имя" required outlined />
Для больших форм рекомендуется использовать стейты форм в виде объектов:
<script>
let formData = {
name: '',
email: '',
password: ''
};
</script>
<input type="text" bind:value={formData.name} placeholder="Имя" />
<input type="email" bind:value={formData.email} placeholder="Email" />
<input type="password" bind:value={formData.password} placeholder="Пароль" />
SvelteKit позволяет создавать поля на лету с помощью реактивных массивов:
<script>
let tasks = [''];
function addTask() {
tasks = [...tasks, ''];
}
</script>
{#each tasks as task, index}
<input type="text" bind:value={tasks[index]} placeholder="Задача {index + 1}" />
{/each}
<button type="button" on:click={addTask}>Добавить задачу</button>
Формы в SvelteKit объединяют чистый HTML, реактивность Svelte, и современные UI-библиотеки, обеспечивая:
Такой подход делает работу с формами максимально гибкой, модульной и удобной для любых веб-приложений.