В библиотеке Slim Select каждая строка выпадающего списка
представляется объектом option. Именно этот объект
определяет:
Библиотека преобразует обычные HTML-элементы
<option> в собственную внутреннюю структуру данных.
При программной инициализации список может полностью строиться из
массива объектов option.
Минимальный объект выглядит следующим образом:
{
text: 'JavaScript',
value: 'js'
}
Здесь:
text — отображаемый текст;value — значение пункта.Пример полной инициализации:
new SlimSelect({
select: '#skills',
data: [
{
text: 'JavaScript',
value: 'js'
},
{
text: 'TypeScript',
value: 'ts'
},
{
text: 'Python',
value: 'python'
}
]
})
Свойство text задаёт текст, отображаемый внутри
списка.
{
text: 'Frontend Developer',
value: 'frontend'
}
Именно это значение видит пользователь в dropdown-списке.
Пример:
{
text: 'C++ / Embedded Systems',
value: 'cpp'
}
Свойство value содержит внутреннее значение option.
{
text: 'JavaScript',
value: 'js'
}
Именно value:
Чаще всего используют:
Пример:
{
text: 'Germany',
value: 'de'
}
Свойство selected определяет, выбран ли пункт по
умолчанию.
{
text: 'JavaScript',
value: 'js',
selected: true
}
После инициализации элемент окажется выбран автоматически.
data: [
{
text: 'JavaScript',
value: 'js',
selected: true
},
{
text: 'TypeScript',
value: 'ts',
selected: true
}
]
Свойство disabled отключает option.
{
text: 'Premium Feature',
value: 'premium',
disabled: true
}
Такой элемент:
Некоторые версии Slim Select поддерживают специальный placeholder-option.
Пример:
{
text: 'Select a country',
placeholder: true
}
Такой элемент:
Свойство html позволяет выводить HTML вместо обычного
текста.
{
text: 'JavaScript',
value: 'js',
html: '<strong>JavaScript</strong>'
}
Если используется html:
text всё равно остаётся важным;text.Пример:
{
text: 'Urgent',
value: 'urgent',
html: '<span class="red-label">Urgent</span>'
}
Свойство class добавляет CSS-класс option-элементу.
{
text: 'Admin',
value: 'admin',
class: 'role-admin'
}
Это позволяет:
Некоторые реализации поддерживают inline-стили.
{
text: 'Danger',
value: 'danger',
style: 'color:red; font-weight:bold;'
}
Свойство data используется для хранения произвольной
информации.
{
text: 'John Doe',
value: '15',
data: {
department: 'IT',
level: 'Senior'
}
}
Поле удобно для:
Пример получения объекта:
const slim = new SlimSelect({
select: '#users',
data: [
{
text: 'John Doe',
value: '15',
data: {
department: 'IT'
}
}
]
})
Получение выбранного значения:
const selected = slim.getSelected()
console.log(selected)
Slim Select поддерживает группы (optgroup).
Внутри группы используются те же объекты option.
Пример:
data: [
{
label: 'Frontend',
options: [
{
text: 'JavaScript',
value: 'js'
},
{
text: 'TypeScript',
value: 'ts'
}
]
}
]
Полный вариант option может выглядеть так:
{
text: 'JavaScript',
value: 'js',
html: '<strong>JavaScript</strong>',
selected: true,
disabled: false,
class: 'lang-js',
style: 'color: #f7df1e;',
data: {
type: 'frontend',
popularity: 'high'
}
}
{
text: 'JavaScript',
value: 'js'
}
Результат:
{
text: 'JavaScript',
value: 'js',
html: '<span class="badge">JavaScript</span>'
}
Результат:
Следующий HTML:
<option value="js">JavaScript</option>
Во внутренней структуре Slim Select превращается примерно в:
{
text: 'JavaScript',
value: 'js'
}
HTML:
<option value="js" selected>
JavaScript
</option>
<option value="php" disabled>
PHP
</option>
После преобразования:
{
text: 'JavaScript',
value: 'js',
selected: true
}
{
text: 'PHP',
value: 'php',
disabled: true
}
slim.setData([
{
text: 'Vue',
value: 'vue'
},
{
text: 'React',
value: 'react'
}
])
const users = apiResponse.map(user => ({
text: user.name,
value: user.id,
data: user
}))
{
text: 'John Doe',
value: '25',
data: {
id: 25,
role: 'admin',
permissions: ['read', 'write']
}
}
{
text: 'Germany',
value: 'de',
html: `
<div class="country-item">
<img src="de.png">
Germany
</div>
`
}
Slim Select использует text при поиске.
{
text: 'JavaScript',
value: 'js',
html: '<strong>JavaScript</strong>'
}
Поиск будет ориентироваться именно на text.
Значения value желательно делать уникальными.
Плохой пример:
[
{
text: 'JavaScript',
value: '1'
},
{
text: 'TypeScript',
value: '1'
}
]
Это может привести к:
Для multiple select структура option не меняется.
{
text: 'Vue',
value: 'vue'
}
Меняется только логика хранения selected-значений.
{
text: 'JavaScript',
value: 'js'
}
{
text: 123,
value: {}
}
Подобные конструкции могут вызывать:
Некоторые версии и плагины поддерживают передачу атрибутов.
Пример:
{
text: 'Download',
value: 'download',
attributes: {
'data-id': '15',
'data-type': 'file'
}
}
Наиболее распространённый формат:
{
text: 'Option name',
value: 'option_value'
}
Расширенный производственный вариант:
{
text: 'John Doe',
value: '15',
selected: false,
disabled: false,
class: 'user-option',
data: {
role: 'manager',
department: 'sales'
}
}
Slim Select хранит option как объекты Javascript, что даёт ряд преимуществ:
data: [
{
text: 'JavaScript',
value: 'js'
},
{
text: 'TypeScript',
value: 'ts'
},
{
text: 'Python',
value: 'python'
}
]
data: [
{
label: 'Frontend',
options: [
{
text: 'React',
value: 'react'
},
{
text: 'Vue',
value: 'vue'
}
]
},
{
label: 'Backend',
options: [
{
text: 'Node.js',
value: 'node'
},
{
text: 'Laravel',
value: 'laravel'
}
]
}
]
new SlimSelect({
select: '#employees',
data: [
{
label: 'Management',
options: [
{
text: 'John Smith',
value: '1',
selected: true,
class: 'manager',
data: {
role: 'CEO'
}
}
]
},
{
label: 'Developers',
options: [
{
text: 'Alice Brown',
value: '2',
html: `
<div class="employee">
<strong>Alice Brown</strong>
<small>Frontend Developer</small>
</div>
`,
data: {
stack: ['React', 'TypeScript']
}
}
]
}
]
})