Slim Select формирует отображение выбранных значений через отдельный
слой представления, который заменяет стандартный
<select> на кастомный DOM-компонент. Ключевая
особенность заключается в том, что выбранные элементы не просто
копируются из нативного <option>, а преобразуются в
структурированные блоки, управляемые внутренним состоянием инстанса.
Внутри Slim Select выбранные значения хранятся как массив объектов состояния. Каждый объект содержит минимум:
text — отображаемый текстvalue — значение optionselected — флаг состоянияdisabled,
placeholder, data-*)При изменении выбора Slim Select пересобирает DOM-область выбранных элементов, синхронизируя её с состоянием.
Для одиночного выбора отображение строится вокруг одного элемента, который заменяет текст плейсхолдера. Для множественного выбора формируется набор “чипов” (tags-like элементов), каждый из которых является отдельной сущностью.
В режиме одиночного выбора интерфейс содержит одну активную область отображения:
Структура DOM обычно включает контейнер отображения, в который подставляется текст выбранного значения.
Поведение:
option.textПример инициализации:
new SlimSelect({
select: '#single'
})
В HTML:
<select id="single">
<option value="">Select value</option>
<option value="1">Alpha</option>
<option value="2">Beta</option>
</select>
Механика отображения:
BetaBetaВ режиме множественного выбора отображение радикально отличается. Каждый выбранный элемент превращается в независимый визуальный блок.
Типичная структура:
Каждый чип содержит:
Пример:
new SlimSelect({
select: '#multi',
settings: {
closeOnSelect: false
}
})
HTML:
<select id="multi" multiple>
<option value="1">Red</option>
<option value="2">Green</option>
<option value="3">Blue</option>
</select>
Поведение:
Red создаёт первый чипGreen добавляет второйSlim Select не перерисовывает весь компонент при каждом изменении. Используется дифф-подход:
Это позволяет минимизировать перерасчёт layout.
Каждый выбранный элемент создаётся через внутренний шаблон:
ss-valuesss-valuess-value-textss-value-deleteОтображаемый текст всегда берётся из text, но может быть
модифицирован через входные данные.
Пример кастомных данных:
new SlimSelect({
select: '#multi',
data: [
{ text: 'Item A', value: 'a' },
{ text: 'Item B', value: 'b', selected: true }
]
})
Здесь:
Item B будет отображён как выбранныйselected: true инициализирует визуальные
чипыПлейсхолдер отображается только при отсутствии выбранных значений.
Особенности:
Если используется пустое значение:
<option data-placeholder="true">Choose item</option>
Slim Select интерпретирует его как визуальный placeholder, не как selectable option.
При изменении данных через API:
let ss = new SlimSelect({ select: '#multi' })
ss.setData([
{ text: 'X', value: 'x' },
{ text: 'Y', value: 'y' }
])
Происходит полный пересбор отображения:
При этом Slim Select старается сохранить совпадающие
value, чтобы не сбрасывать выбор без необходимости.
Если option имеет disabled: true, но уже выбран:
new SlimSelect({
select: '#multi',
data: [
{ text: 'Locked', value: '1', disabled: true, selected: true }
]
})
ss.setSelected(['1', '2'])
Результат:
ss.getSelected()
Возвращает массив значений, соответствующих визуально отображённым элементам.
При большом количестве выбранных элементов:
Slim Select не агрегирует значения в “+N items” по умолчанию, поэтому отображение остаётся детализированным.
Внутреннее обновление текста возможно при пересборке data:
ss.setData([
{ text: 'New Label', value: '1', selected: true }
])
При этом:
Slim Select поддерживает двустороннюю синхронизацию:
<select><select> → обновление UI (при вызове
refresh/инициализации)Отображение выбранных элементов всегда базируется на актуальном
состоянии DOM <select>, но не зависит от него
напрямую в runtime, а через внутренний store.
ss.setSelected([])
Результат:
При этом DOM не уничтожается полностью, а перерабатывается через обновление контейнера.
Slim Select позволяет влиять на визуальную часть через CSS, так как каждый выбранный элемент имеет предсказуемую структуру классов:
.ss-values.ss-value.ss-value-text.ss-value-deleteИзменение отображения достигается исключительно стилями, без вмешательства в логику рендера, что сохраняет целостность состояния.
Отображение выбранных элементов является реактивным слоем поверх состояния. Любое изменение state вызывает:
Это исключает необходимость ручного управления DOM и делает отображение полностью декларативным относительно состояния компонента.