В основе управления значениями в Slim Sel ect лежит синхронизация
между DOM-элементом <select> и внутренним состоянием
экземпляра библиотеки. Любое добавление или удаление значения отражается
одновременно в визуальном компоненте и в исходном элементе формы, что
позволяет сохранять совместимость с нативной отправкой форм.
Работа с выбранными значениями осуществляется через API-интерфейс экземпляра Slim Select, который предоставляет методы для установки, расширения и очистки текущего состояния выбора.
setМетод set используется для полного переопределения
выбранных значений. При его вызове текущее состояние заменяется новым
набором данных.
const select = new SlimSelect({
select: '#example'
});
// установка одного значения
select.set('value1');
Для множественного выбора передаётся массив значений:
select.set(['value1', 'value2', 'value3']);
Особенность метода заключается в том, что он не дополняет текущий выбор, а полностью заменяет его. Это делает его базовым инструментом для синхронизации состояния с внешними источниками данных, например, с сервером или состоянием приложения.
set в режиме расширенияSlim Select не предоставляет отдельного метода «append» для выбранных значений, однако добавление реализуется через комбинирование текущего состояния с новым.
const current = select.getData().map(item => item.value);
select.set([...current, 'newValue']);
Такой подход позволяет аккуратно расширять выбор без потери уже выбранных элементов. При работе с множественным выбором это основной способ динамического добавления значений.
addПомимо управления выбранными значениями, библиотека позволяет динамически добавлять новые элементы в список опций. Это особенно важно при работе с пользовательским вводом или асинхронной загрузкой данных.
select.add({
text: 'Новая опция',
value: 'new_option'
});
Добавленная опция сразу становится доступной для выбора и отображается в выпадающем списке. При необходимости можно добавлять сразу несколько элементов:
select.add([
{ text: 'Опция 1', value: 'opt1' },
{ text: 'Опция 2', value: 'opt2' }
]);
Добавление опций не изменяет текущее состояние выбранных значений,
если явно не выполняется их выбор через set.
setУдаление выбранных значений в Slim Select реализуется через повторную установку состояния без исключаемых элементов.
select.set(['value1', 'value2', 'value3']);
// удаление одного значения
select.set(['value1', 'value3']);
Такой подход сохраняет предсказуемость поведения, поскольку любое изменение состояния проходит через единый механизм установки значений.
Для полного сброса выбранных значений используется передача пустого массива или пустого значения.
select.set([]);
или
select.set('');
В зависимости от конфигурации multiple поведение может
отличаться, однако итоговым результатом всегда становится отсутствие
выбранных элементов.
removeУдаление элементов из списка доступных опций осуществляется через
метод remove, который принимает значение или объект
опции.
select.remove('value1');
При удалении опции происходит автоматическая проверка: если значение было выбрано, оно также удаляется из текущего состояния.
Удаление нескольких элементов:
select.remove(['value1', 'value2']);
При работе с динамическими интерфейсами это позволяет синхронизировать доступные данные с сервером или бизнес-логикой приложения.
При получении данных с сервера список опций часто требуется полностью заменить:
fetch('/api/options')
.then(res => res.json())
.then(data => {
select.setData(data);
});
После обновления данных выбранные значения могут быть восстановлены
отдельно через set.
В интерфейсах с возможностью ввода новых элементов применяется комбинированный подход: сначала добавляется опция, затем она устанавливается как выбранная.
select.add({
text: 'Пользовательское значение',
value: 'custom_value'
});
select.set([...select.getData().map(i => i.value), 'custom_value']);
Удаление значений часто связано с бизнес-логикой, например, фильтрацией доступных вариантов:
const allowed = ['value1', 'value3'];
const current = select.getData().map(i => i.value);
const filtered = current.filter(v => allowed.includes(v));
select.set(filtered);
Каждое изменение через API Slim Select автоматически синхронизируется
с оригинальным <select>:
const element = document.querySelector('#example');
select.set('value1');
console.log(element.value);
В режиме multiple:
console.log(Array.fr om(element.selectedOptions).map(o => o.value));
Это обеспечивает совместимость с нативной отправкой форм без дополнительных преобразований.
В режиме multiple управление значениями требует учета
массива:
select.set(['a', 'b']);
select.set(['a', 'b', 'c']);
select.set(['a', 'c']);
При прямом изменении DOM <select> без
использования API возможны расхождения состояния. Для восстановления
корректного отображения применяется повторная установка данных:
select.set(select.getData().filter(i => i.selected).map(i => i.value));
Логика работы с добавлением и удалением строится вокруг трёх операций:
setaddremoveЭта модель обеспечивает предсказуемое поведение при динамическом изменении данных и позволяет строить интерфейсы с асинхронной загрузкой, пользовательскими значениями и сложной фильтрацией без нарушения целостности состояния компонента.