Работа с группами опций в Slim Select основана на стандартной
HTML-конструкции <optgroup>, которая позволяет
логически объединять элементы выпадающего списка. Библиотека сохраняет
нативную семантику группировки, расширяя её интерактивными
возможностями: поиском внутри групп, кастомным рендерингом, управлением
состоянием и программным контролем.
Slim Select использует обычный <select> с
вложенными группами:
<select id="example">
<optgroup label="Фрукты">
<option value="apple">Яблоко</option>
<option value="banana">Банан</option>
</optgroup>
<optgroup label="Овощи">
<option value="carrot">Морковь</option>
<option value="potato">Картофель</option>
</optgroup>
</select>
Каждый optgroup задаёт логическую категорию, а атрибут
label используется как заголовок группы в интерфейсе Slim
Select.
При инициализации библиотеки структура автоматически преобразуется в внутреннюю модель данных, где группы становятся контейнерами элементов.
new SlimSelect({
select: '#example'
});
При таком подключении библиотека:
<optgroup> и
<option>Никаких дополнительных настроек для поддержки optgroup не требуется — функциональность встроена по умолчанию.
После парсинга HTML Slim Select преобразует структуру в объектный формат:
[
{
label: 'Фрукты',
options: [
{ text: 'Яблоко', value: 'apple' },
{ text: 'Банан', value: 'banana' }
]
},
{
label: 'Овощи',
options: [
{ text: 'Морковь', value: 'carrot' },
{ text: 'Картофель', value: 'potato' }
]
}
]
Каждая группа содержит:
label — название группыoptions — массив элементовТакая структура используется при рендеринге и фильтрации.
Slim Select визуально разделяет группы:
HTML-структура внутри компонента выглядит логически так:
Фрукты
Яблоко
Банан
Овощи
Морковь
Картофель
Группы не являются кликабельными элементами выбора по умолчанию, но могут быть кастомизированы через рендеринг.
Фильтрация работает не только по плоскому списку, но и внутри групп. При вводе текста Slim Select:
option.textПример поведения:
new SlimSelect({
select: '#example',
searchText: 'Поиск...'
});
Если пользователь вводит мор, результат будет:
Овощи
Морковь
Группа «Фрукты» автоматически скрывается.
Slim Select не предоставляет прямого API для управления группой как сущностью, но позволяет управлять опциями внутри неё.
const select = new SlimSelect({
select: '#example'
});
// установка значений
select.set(['apple', 'carrot']);
Группы при этом игнорируются как сущность — управление идёт через
value.
select.getSelected();
Результат:
['apple', 'carrot']
Групповая структура в ответе не сохраняется, так как Slim Select возвращает плоский массив значений.
Группы можно добавлять программно через обновление
<select> или через обновление данных (если
используется data-режим).
const select = document.querySelector('#example');
const group = document.createElement('optgroup');
group.label = 'Напитки';
const option = document.createElement('option');
option.value = 'tea';
option.text = 'Чай';
group.appendChild(option);
select.appendChild(group);
// требуется пересоздание Slim Select
new SlimSelect({ select: '#example' });
new SlimSelect({
select: '#example',
data: [
{
label: 'Напитки',
options: [
{ text: 'Чай', value: 'tea' },
{ text: 'Кофе', value: 'coffee' }
]
}
]
});
В этом режиме структура optgroup полностью задаётся JavaScript-объектом.
Slim Select позволяет модифицировать рендеринг через
addable, searchFilter, а также через
переопределение шаблонов (в зависимости от конфигурации версии).
Основные сценарии кастомизации:
Можно модифицировать label до передачи:
data: [
{
label: '? Товары',
options: [...]
}
]
Группы часто используются для:
При активной фильтрации Slim Select применяет правило:
Это поведение не требует дополнительной настройки и встроено в алгоритм поиска.
Несмотря на поддержку групп, существуют ограничения:
value, а не с группамиHTML поддерживает атрибут disabled у
<optgroup>:
<optgroup label="Архив" disabled>
<option value="old1">Старый элемент</option>
</optgroup>
Slim Select:
При включённом multiple: true:
new SlimSelect({
select: '#example',
settings: {
multiple: true
}
});
При необходимости можно реализовать внешнюю фильтрацию:
const select = new SlimSelect({
select: '#example'
});
function filterByGroup(groupName) {
const options = document.querySelectorAll('#example optgroup');
options.forEach(group => {
group.style.display = group.label === groupName ? '' : 'none';
});
}
После DOM-изменений требуется обновление или пересоздание компонента для синхронизации.
Группы особенно полезны при работе с:
Типичный паттерн — комбинация серверной генерации групп и клиентской фильтрации через Slim Select.
При большом количестве групп:
Рекомендуется ограничивать глубину и количество элементов в одной группе для сохранения производительности интерфейса.