Библиотека Slim Select поддерживает несколько вариантов структуры данных для формирования списка опций, группировки элементов, динамической загрузки и управления состоянием select-компонента. Правильный формат данных играет ключевую роль при работе с API библиотеки, особенно при генерации списков из JavaScript, AJAX-запросов или серверных данных.
Основой Slim Select является массив объектов. Каждый объект описывает отдельную опцию списка.
Простейший формат:
const data = [
{
text: 'JavaScript',
value: 'js'
},
{
text: 'Python',
value: 'python'
},
{
text: 'PHP',
value: 'php'
}
]
Использование:
new SlimSelect({
select: '#skills',
data: data
})
| Поле | Назначение |
|---|---|
text |
Отображаемый текст |
value |
Значение option |
selected |
Предварительно выбранный элемент |
disabled |
Блокировка опции |
placeholder |
Признак placeholder |
html |
HTML-разметка вместо обычного текста |
data |
Пользовательские data-атрибуты |
mandatory |
Запрет удаления выбранного элемента |
Поле text определяет содержимое, отображаемое
пользователю.
{
text: 'React',
value: 'react'
}
Если поле отсутствует, интерфейс будет отображаться некорректно или элемент окажется пустым.
html;Пример:
{
text: 'TypeScript',
value: 'ts'
}
Поле value соответствует значению HTML-атрибута
value.
{
text: 'Vue',
value: 'vue'
}
После выбора:
<option value="vue">Vue</option>
Пример числовых значений:
[
{
text: 'Level 1',
value: 1
},
{
text: 'Level 2',
value: 2
}
]
Для установки активного значения используется поле
selected.
const data = [
{
text: 'JavaScript',
value: 'js',
selected: true
},
{
text: 'Python',
value: 'python'
}
]
В режиме множественного выбора допускается несколько
selected.
[
{
text: 'HTML',
value: 'html',
selected: true
},
{
text: 'CSS',
value: 'css',
selected: true
}
]
Поле disabled делает элемент недоступным.
{
text: 'Недоступный пункт',
value: 'disabled-item',
disabled: true
}
HTML-эквивалент:
<option disabled>
Placeholder обозначается свойством placeholder.
{
text: 'Выберите язык',
placeholder: true
}
value.Пример:
{
text: 'Выберите страну',
value: '',
placeholder: true
}
Поле html позволяет использовать полноценную
HTML-разметку.
{
text: 'JavaScript',
value: 'js',
html: '<strong>JavaScript</strong>'
}
Пример с иконкой:
{
text: 'Node.js',
value: 'node',
html: `
<div class="item">
<i class="icon-node"></i>
<span>Node.js</span>
</div>
`
}
При использовании html поле text всё равно
желательно указывать, поскольку оно участвует в поиске и внутренней
логике библиотеки.
Slim Select поддерживает передачу произвольных data-атрибутов.
{
text: 'Frontend',
value: 'frontend',
data: {
level: 'middle',
category: 'web'
}
}
Результат:
<option
data-level="middle"
data-category="web"
>
Свойство mandatory запрещает удаление выбранного
элемента.
{
text: 'Администратор',
value: 'admin',
selected: true,
mandatory: true
}
Slim Select поддерживает структуру optgroup через вложенные массивы.
const data = [
{
label: 'Frontend',
options: [
{
text: 'React',
value: 'react'
},
{
text: 'Vue',
value: 'vue'
}
]
},
{
label: 'Backend',
options: [
{
text: 'Node.js',
value: 'node'
}
]
}
]
| Поле | Назначение |
|---|---|
label |
Заголовок группы |
options |
Массив элементов |
selectAll |
Возможность выбрать всю группу |
{
label: 'Databases',
options: []
}
Соответствует:
<optgroup label="Databases">
Внутри options располагаются стандартные объекты Slim
Select.
{
label: 'Languages',
options: [
{
text: 'Go',
value: 'go'
}
]
}
Некоторые конфигурации используют selectAll.
{
label: 'Frameworks',
selectAll: true,
options: [
{
text: 'Angular',
value: 'angular'
}
]
}
Slim Select позволяет комбинировать группы и одиночные элементы.
const data = [
{
text: 'Без группы',
value: 'single'
},
{
label: 'Languages',
options: [
{
text: 'Rust',
value: 'rust'
}
]
}
]
Для multiple-режима структура не меняется.
new SlimSelect({
select: '#multiple',
settings: {
multiple: true
},
data: [
{
text: 'HTML',
value: 'html'
},
{
text: 'CSS',
value: 'css'
}
]
})
Slim Select поддерживает замену данных через API.
const slim = new SlimSelect({
select: '#users'
})
slim.setData([
{
text: 'Admin',
value: '1'
},
{
text: 'Editor',
value: '2'
}
])
Часто данные приходят с сервера в неподходящем формате.
Например:
[
{
"id": 1,
"name": "JavaScript"
},
{
"id": 2,
"name": "Python"
}
]
Для Slim Select требуется преобразование.
const formatted = response.map(item => ({
text: item.name,
value: item.id
}))
Использование:
slim.setData(formatted)
При асинхронной загрузке структура остается идентичной.
fetch('/api/tags')
.then(res => res.json())
.then(data => {
slim.setData(
data.map(tag => ({
text: tag.title,
value: tag.id
}))
)
})
Нередко сервер возвращает сложные структуры.
Пример:
[
{
"category": "Frontend",
"items": [
{
"id": 1,
"title": "React"
}
]
}
]
Преобразование:
const formatted = data.map(group => ({
label: group.category,
options: group.items.map(item => ({
text: item.title,
value: item.id
}))
}))
Slim Select способен автоматически читать структуру существующего select.
HTML:
<select id="skills">
<option value="js">JavaScript</option>
<option value="python">Python</option>
</select>
Jav * aScript:
new SlimSelect({
select: '#skills'
})
Библиотека самостоятельно:
После инициализации Slim Select хранит данные во внутреннем состоянии.
Типичная структура:
[
{
id: 'option-1',
value: 'js',
text: 'JavaScript',
selected: false
}
]
Библиотека может автоматически добавлять:
Поле text напрямую влияет на встроенный поиск.
{
text: 'JavaScript',
value: 'js'
}
Поиск выполняется именно по text, даже если используется
html.
При больших массивах структура данных становится особенно важной.
Сложная HTML-разметка:
html: `
<div>
<img src="...">
<span>Item</span>
</div>
`
замедляет:
value: '1'
лучше, чем:
value: 'very-long-unique-string-value'
при large datasets.
Плохо:
{
text: 'Vue',
value: 'vue',
temp1: '...',
temp2: '...',
temp3: '...'
}
Лучше:
{
text: 'Vue',
value: 'vue'
}
Частые ошибки:
{
value: 'js'
}
Результат — пустой пункт.
{
text: 'JavaScript'
}
Может приводить к некорректному выбору.
Ошибка:
{
label: 'Group',
options: {}
}
Правильно:
{
label: 'Group',
options: []
}
[
{
text: 'React',
value: '1'
},
{
text: 'Vue',
value: '1'
}
]
Приводит к конфликтам выбора.
const data = [
{
text: 'Выберите технологию',
value: '',
placeholder: true
},
{
label: 'Frontend',
options: [
{
text: 'React',
value: 'react',
data: {
type: 'frontend'
}
},
{
text: 'Vue',
value: 'vue',
selected: true
}
]
},
{
label: 'Backend',
options: [
{
text: 'Node.js',
value: 'node',
disabled: true
},
{
text: 'Laravel',
value: 'laravel'
}
]
}
]
Использование:
new SlimSelect({
select: '#stack',
data: data
})
Формат Slim Select полностью совместим с JSON.
Это позволяет:
Пример JSON:
[
{
"text": "JavaScript",
"value": "js"
}
]
При использовании TypeScript структура обычно описывается интерфейсами.
interface SlimOption {
text: string
value: string | number
selected?: boolean
disabled?: boolean
html?: string
}
interface SlimGroup {
label: string
options: SlimOption[]
}
Для крупных приложений часто применяется разделение:
const selectData = {
countries: [],
cities: [],
users: [],
roles: []
}
После загрузки:
slim.setData(selectData.countries)
Такой подход упрощает: