Компонент NumberInput является специализированным
элементом интерфейса для ввода числовых значений с возможностью контроля
диапазона, шагов и формата отображения. В библиотеке Carbon
Components Svelte этот компонент реализован с учётом всех
требований к доступности, удобству взаимодействия и интеграции с
реактивной моделью Svelte.
- bind:value — реактивная привязка значения,
обеспечивающая синхронизацию состояния компонента с переменной.
- min / max — ограничения диапазона допустимых
значений.
- step — шаг изменения числа при использовании кнопок
увеличения/уменьшения.
- id / label — атрибуты для корректного связывания
поля с подписью и обеспечения доступности.
Работа с шагами и
ограничениями
NumberInput позволяет управлять увеличением и
уменьшением значения через стрелки:
- При нажатии на стрелку вверх значение увеличивается на величину
step, при нажатии вниз — уменьшается.
- При достижении min или max
дальнейшее изменение блокируется, предотвращая выход за пределы
диапазона.
Особенности поведения при ручном вводе:
- Если введённое число выходит за пределы min/max,
компонент автоматически корректирует его к ближайшему допустимому
значению.
- Некорректный ввод (например, текст) игнорируется, сохраняя
предыдущее валидное значение.
Форматирование отображаемого
числа
Компонент поддерживает кастомное отображение чисел через проп
format и встроенные функции форматирования:
`${val.toFixed(2)}%`}
/>
- Функция format вызывается при каждом рендере,
позволяя отображать значения в любом нужном формате, например валюты,
проценты или с разделителями тысяч.
Валидация и обработка ошибок
NumberInput интегрирован с системой валидации через
проп invalid и invalidText:
10}
invalidText="Число должно быть от 1 до 10"
/>
- invalid — булево значение, определяющее состояние
ошибки.
- invalidText — текст ошибки, который отображается
под полем ввода при нарушении условий.
Использование этих пропов позволяет строить динамическую проверку
значений и мгновенно информировать пользователя о некорректном
вводе.
Интерактивные события
NumberInput поддерживает несколько событий для
работы с реактивной логикой:
- on:input — срабатывает при каждом изменении
значения.
- on:change — срабатывает после завершения ввода или
при потере фокуса.
- on:focus / on:blur — обработка фокуса, полезно для
кастомной подсветки или валидации при уходе с поля.
Пример:
console.log('Input:', e.detail.value)}
on:change={(e) => console.log('Change:', e.detail.value)}
/>
Работа с большими числами и
дробями
Для точной работы с дробными числами рекомендуется использовать
step, который задаёт необходимую точность:
- Это предотвращает проблемы округления при ручном вводе.
- В комбинации с format можно отображать значения с
фиксированной точностью.
Стилизация и темы
NumberInput наследует стили Carbon и поддерживает
все темы (light/dark). Дополнительно можно управлять стилями через
классы Svelte:
- Стилизация не нарушает внутреннюю логику компонента.
- Все внутренние элементы (кнопки, поле ввода, подпись, текст ошибки)
остаются полностью функциональными.
Интеграция с формами
NumberInput легко интегрируется с формами Svelte,
включая использование реактивных объектов:
- Связь через bind:value позволяет обновлять объект
формы автоматически при каждом изменении поля.
- Упрощает обработку данных при отправке форм.
Практические рекомендации
- Использовать step для контроля точности чисел.
- Всегда задавать min и max для
предотвращения некорректного ввода.
- Применять format для пользовательского отображения
чисел.
- Использовать invalid / invalidText для динамической
валидации.
- Для интеграции с формами применять bind:value к
объектам или переменным Svelte.