Carbon Components Svelte предоставляет мощный набор инструментов для создания интерактивных и доступных пользовательских интерфейсов. Основная цель при работе с формами — обеспечить структурированность, повторное использование компонентов и корректное управление состояниями.
Для организации сложных форм используется компонент Form
и его вспомогательные контейнеры:
<Form on:submit="{handleSubmit}">
<FormGroup legendText="Основная информация">
<TextInput labelText="Имя" bind:value="{name}" />
<TextInput labelText="Фамилия" bind:value="{surname}" />
</FormGroup>
<FormGroup legendText="Контакты">
<EmailInput labelText="Электронная почта" bind:value="{email}" />
<TelephoneInput labelText="Телефон" bind:value="{phone}" />
</FormGroup>
<Button type="submit">Отправить</Button>
</Form>
submit.legendText) для улучшения визуальной иерархии.bind:value.Использование FormGroup позволяет создавать читаемую структуру формы, особенно если она содержит десятки полей.
Carbon Components Svelte поддерживает несколько типов состояний:
Пример управления состояниями через свойства компонента:
<TextInput
labelText="Имя пользователя"
bind:value="{username}"
invalid="{!isValidUsername}"
invalidText="Имя пользователя должно содержать не менее 3 символов"
/>
invalid — принимает булево значение, включающее
отображение ошибки.invalidText — текст ошибки, выводимый под полем.Для сложных форм, где требуется адаптивное размещение элементов, применяется Grid:
<Grid>
<Column sm="4">
<TextInput labelText="Город" bind:value="{city}" />
</Column>
<Column sm="4">
<TextInput labelText="Регион" bind:value="{region}" />
</Column>
<Column sm="4">
<TextInput labelText="Почтовый индекс" bind:value="{zip}" />
</Column>
</Grid>
sm="4") задаёт ширину в 4/12 части
контейнера на малых экранах. Можно комбинировать md и
lg для адаптивности на средних и больших экранах.Для сложных форм часто требуются комбинированные элементы:
Пример комбинированного поля:
<FormGroup legendText="Выбор даты и времени">
<DatePicker bind:value="{selectedDate}" dateFormat="m/d/Y" />
<TimePicker bind:value="{selectedTime}" />
</FormGroup>
Компоненты поддерживают двустороннюю привязку, что облегчает сбор и валидацию данных на уровне родительской формы.
В Carbon Components Svelte валидация может быть локальной для компонента или глобальной для формы.
Локальная валидация:
<TextInput
labelText="Пароль"
bind:value="{password}"
invalid="{password.length < 8}"
invalidText="Пароль должен быть не менее 8 символов"
/>
Глобальная валидация:
function handleSubmit(event) {
event.preventDefault();
const isFormValid = name && email && password.length >= 8;
if (!isFormValid) {
alert("Форма содержит ошибки");
} else {
console.log("Данные формы:", { name, email, password });
}
}
Сложные формы часто требуют возможности добавления элементов
на лету. Это реализуется через массивы и
#each:
{#each contacts as contact, index}
<FormGroup legendText="Контакт">
<TextInput
labelText="Имя"
bind:value="{contact.name}"
/>
<TextInput
labelText="Телефон"
bind:value="{contact.phone}"
/>
<Button kind="secondary" on:click="{() => removeContact(index)}">Удалить</Button>
</FormGroup>
{/each}
<Button on:click="{addContact}">Добавить контакт</Button>
addContact добавляет новый объект в массив
contacts.removeContact(index) удаляет элемент по индексу.При работе с большими формами важно минимизировать количество реактивных вычислений:
store, если данные не требуются вне формы.bind:this для прямого обращения к DOM
элементам при необходимости, чтобы избежать лишнего ререндеринга.Все компоненты Carbon поддерживают ARIA-атрибуты, обеспечивая доступность для скринридеров:
aria-label и aria-describedby
автоматически управляются компонентами.FormGroup и legendText помогают
скринридерам понять логическую группировку полей.Toggle,
RadioButtonGroup, CheckboxGroup гарантирует
корректное взаимодействие с клавиатурой.#each.Эта структура позволяет создавать масштабируемые, удобные и доступные формы, легко расширяемые и поддерживаемые на любом уровне сложности.