В библиотеке Carbon Components Svelte элементы интерфейса предоставляют встроенные механизмы для управления состояниями disabled и loading, что позволяет создавать динамичные и отзывчивые компоненты без дополнительной ручной логики. Эти состояния критически важны для улучшения UX, предотвращения некорректных действий пользователя и визуального отображения процессов.
disabledСостояние disabled блокирует взаимодействие с
компонентом, делая его недоступным для кликов, ввода текста и других
событий. В Svelte это реализуется через проп
disabled, который передается в компонент:
<script>
import { Button } from 'carbon-components-svelte';
let isDisabled = true;
</script>
<Button disabled={isDisabled}>Нажми меня</Button>
Особенности поведения:
disabled.disabled=true визуальная стилизация автоматически
переключается на соответствующий стиль (затемнение, курсор
«неактивен»).disabled можно
динамически менять через реактивные переменные. Это позволяет управлять
доступностью компонентов на лету.<script>
import { Button } from 'carbon-components-svelte';
let loading = false;
let disabled = false;
function toggleDisabled() {
disabled = !disabled;
}
</script>
<Button disabled={disabled} on:click={toggleDisabled}>
{disabled ? 'Выключено' : 'Включено'}
</Button>
loadingСостояние loading используется для отображения
процессов, требующих времени, например, отправки формы или загрузки
данных. В Carbon Components Svelte оно чаще всего применяется в
кнопках и индикаторах прогресса.
<script>
import { Button } from 'carbon-components-svelte';
let isLoading = false;
function startProcess() {
isLoading = true;
setTimeout(() => isLoading = false, 3000); // имитация асинхронного запроса
}
</script>
<Button loading={isLoading} on:click={startProcess}>
{isLoading ? 'Загрузка...' : 'Отправить'}
</Button>
Ключевые моменты реализации:
loading=true кнопка блокируется автоматически
(disabled включается внутрь компонента).loading с
disabled, используя реактивные выражения:<Button disabled={isLoading || disabled} loading={isLoading}>
{isLoading ? 'Пожалуйста, подождите...' : 'Подтвердить'}
</Button>
Использование реактивных переменных Svelte позволяет создавать
сложные сценарии, где disabled и loading
управляются одновременно, реагируя на состояние формы или сетевых
запросов.
<script>
import { TextInput, Button } from 'carbon-components-svelte';
let inputValue = '';
let submitting = false;
$: isDisabled = inputValue.trim() === '' || submitting;
async function handleSubmit() {
submitting = true;
await new Promise(resolve => setTimeout(resolve, 2000));
submitting = false;
inputValue = '';
}
</script>
<TextInput bind:value={inputValue} placeholder="Введите текст..." disabled={submitting} />
<Button on:click={handleSubmit} disabled={isDisabled} loading={submitting}>
Отправить
</Button>
Пояснение к примеру:
isDisabled).loading визуально сигнализирует пользователю
о процессе отправки.Компоненты Carbon Components Svelte хорошо интегрируются с формами.
Состояние disabled может распространяться на все поля
формы, а loading – на кнопку отправки:
<script>
import { Button, TextInput, Checkbox } from 'carbon-components-svelte';
let formSubmitting = false;
function submitForm() {
formSubmitting = true;
setTimeout(() => formSubmitting = false, 2500);
}
</script>
<TextInput placeholder="Имя" disabled={formSubmitting} />
<Checkbox label="Согласен с условиями" disabled={formSubmitting} />
<Button loading={formSubmitting} on:click={submitForm}>
Отправить форму
</Button>
Преимущества:
formSubmitting.Состояния disabled и loading легко
расширяются на собственные компоненты. В Svelte достаточно использовать
реактивные пропсы и условный рендеринг спиннера:
<script>
export let disabled = false;
export let loading = false;
</script>
<button disabled={disabled || loading}>
{#if loading}
<span class="spinner"></span> Загрузка...
{:else}
Кликни меня
{/if}
</button>
Выводы по практике:
disabled и
loading.Хотите, я могу сразу подготовить отдельный блок с примерами
комбинирования loading и disabled в сложных
таблицах и модальных окнах, где такие состояния критически
важны для UX? Это будет полноценное практическое руководство с
кодом.