Работа с динамическими списками в Slim Sel ect часто требует полного
переопределения набора данных, особенно в случаях, когда источник опций
загружается асинхронно или изменяется в зависимости от состояния
интерфейса. Для этих целей используется метод setData,
обеспечивающий программную замену текущих опций без необходимости
пересоздания экземпляра компонента.
Метод setData предназначен для полной или частичной
замены набора данных, на основе которого формируется список
<select>.
Ключевая особенность заключается в том, что метод:
Это делает его основным инструментом при работе с динамическими источниками данных.
Типичная сигнатура метода:
select.setData(data);
где data — массив объектов строго определённой
структуры:
[
{ text: "Текст опции", value: "значение", selected: false, disabled: false },
{ text: "Опция 2", value: "2" }
]
text Отображаемый текст в выпадающем списке. Обязательное поле для корректного отображения.
value Значение, которое будет передано в
<select> при выборе.
selected Булево значение, определяющее выбранность опции при установке данных.
disabled Отключает возможность выбора конкретной опции.
Инициализация и последующая замена данных выглядит следующим образом:
import SlimSelect fr om 'slim-select'
const select = new SlimSelect({
select: '#example'
})
select.setData([
{ text: 'JavaScript', value: 'js' },
{ text: 'TypeScript', value: 'ts' },
{ text: 'Python', value: 'py' }
])
После вызова метода список опций полностью заменяется новым набором.
Поведение setData заключается в полном удалении старых
опций перед добавлением новых.
Пример:
select.setData([
{ text: 'HTML', value: 'html' },
{ text: 'CSS', value: 'css' }
])
Если ранее были выбраны значения, они сбрасываются, если новые данные не содержат совпадений.
При необходимости сохранить выбор требуется явно указать совпадающее значение:
select.setData([
{ text: 'Node.js', value: 'node' },
{ text: 'Deno', value: 'deno', selected: true },
{ text: 'Bun', value: 'bun' }
])
В этом случае после обновления данных автоматически установится
выбранное значение deno.
Метод часто используется при загрузке данных с сервера:
fetch('/api/languages')
.then(res => res.json())
.then(data => {
select.setData(
data.map(item => ({
text: item.name,
value: item.id
}))
)
})
Такой подход позволяет динамически обновлять список без перезагрузки страницы и без повторной инициализации компонента Slim Select.
Частый сценарий — изменение списка в зависимости от другого поля формы:
document.querySelector('#category').addEventListener('change', (e) => {
const category = e.target.value
if (category === 'frontend') {
select.setData([
{ text: 'React', value: 'react' },
{ text: 'Vue', value: 'vue' },
{ text: 'Angular', value: 'angular' }
])
}
if (category === 'backend') {
select.setData([
{ text: 'Node.js', value: 'node' },
{ text: 'Django', value: 'django' },
{ text: 'Go', value: 'go' }
])
}
})
В этом сценарии setData используется как механизм
реактивного обновления UI.
Передача пустого массива полностью очищает список:
select.setData([])
Результат:
Это часто используется при фильтрации или отсутствии результатов поиска.
При вызове setData происходит переоценка текущего
значения <select>:
selected: true — оно переопределяет
текущее состояние.Пример конфликта:
select.setData([
{ text: 'A', value: 'a' },
{ text: 'B', value: 'b' }
])
Если ранее было выбрано значение c, оно будет удалено
как несуществующее.
При использовании режима multiple структура данных остаётся идентичной:
const select = new SlimSelect({
select: '#multi',
settings: {
multiple: true
}
})
select.setData([
{ text: 'Red', value: 'red' },
{ text: 'Green', value: 'green', selected: true },
{ text: 'Blue', value: 'blue', selected: true }
])
В этом случае возможно указание нескольких выбранных значений одновременно.
Метод не поддерживает прямое частичное обновление, однако его можно имитировать:
const current = select.getData()
select.setData([
...current,
{ text: 'New option', value: 'new' }
])
Такой подход позволяет расширять список без полной потери данных.
При сложных сценариях требуется сброс состояния перед загрузкой новых данных:
select.setData([])
select.setData(newData)
Это гарантирует отсутствие “залипших” значений в интерфейсе.
<select>Важно понимать, что setData работает на уровне
внутреннего состояния компонента Slim Select, а не напрямую через
изменение DOM-узла.
Однако после вызова метода:
<option> элементы пересоздаются;value обновляется автоматически;Типичные ошибки при использовании:
select.setData([
{ label: 'A' }
])
Ошибка: отсутствует обязательное поле text или
value.
select.setData({ text: 'A', value: 'a' })
Метод ожидает массив, одиночный объект приводит к некорректному состоянию.
При частом вызове без сохранения selected возможен сброс
пользовательского выбора.
Метод оптимизирован для быстрого пересоздания небольших и средних списков.
Однако при больших объемах данных:
setData могут вызывать перерисовку
UI;В реальных приложениях setData часто интегрируется
в:
Типовой поток данных:
setData;Пример локальной фильтрации:
const allOptions = [
{ text: 'Apple', value: 'apple' },
{ text: 'Banana', value: 'banana' },
{ text: 'Orange', value: 'orange' }
]
function filter(query) {
const filtered = allOptions.filter(item =>
item.text.toLowerCase().includes(query.toLowerCase())
)
select.setData(filtered)
}
Такой подход позволяет реализовать кастомный поиск без встроенного API поиска.
Метод setData в контексте Slim Select можно
рассматривать как: