Основная задача миграции на Slim Select заключается в переводе существующей логики работы с выпадающими списками из других решений — таких как Select2, Choices.js или Chosen — в более легковесную, модульную и предсказуемую модель управления состоянием без зависимости от jQuery и сложных DOM-манипуляций.
Различные библиотеки решают одну задачу разными подходами:
<select>Ключевое отличие миграции заключается в переходе:
Slim Select не требует постоянного синхронизирования состояния
вручную — состояние всегда выводится из <select>.
В старых решениях данные часто формируются через кастомные структуры:
{ id, text }{ value, label, selected, disabled }<option>Slim Select использует упрощённую модель:
<option>{ text, value } при программной
инициализацииSelect2:
$('#select').select2({
data: [
{ id: 1, text: 'Apple' },
{ id: 2, text: 'Orange' }
]
});
Slim Select:
new SlimSelect({
select: '#select',
data: [
{ text: 'Apple', value: '1' },
{ text: 'Orange', value: '2' }
]
});
Основное преобразование:
id → valuetext остаётся text$('#select').select2();
или
$('#select').chosen();
new SlimSelect({
select: '#select'
});
$()new-инициализацияВ Select2 и Choices.js часто используется собственный AJAX-слой.
$('#select').select2({
ajax: {
url: '/api/search',
processResults: function (data) {
return {
results: data.items
};
}
}
});
Slim Select не включает встроенный AJAX-слой в классическом виде, поэтому миграция выполняется через внешний fetch:
const slim = new SlimSelect({
select: '#select',
data: []
});
fetch('/api/search')
.then(res => res.json())
.then(data => {
slim.setData(
data.items.map(item => ({
text: item.name,
value: item.id
}))
);
});
Ключевая трансформация:
setData$('#select').on('change', function (e) {
console.log(e.target.value);
});
new SlimSelect({
select: '#select',
events: {
afterChange: (newVal) => {
console.log(newVal);
}
}
});
| Select2 / Chosen | Slim Select |
|---|---|
| change | afterChange |
| select2:open | open |
| select2:close | close |
Основное изменение — переход от jQuery event bus к конфигурационным callback-функциям.
Select2:
$('#select').val();
Slim Select:
slim.getSelected();
Select2:
$('#select').val('1').trigger('change');
Slim Select:
slim.setSelected('1');
В Select2 и Choices.js множественный выбор часто требует отдельной конфигурации.
$('#select').select2({
multiple: true
});
new SlimSelect({
select: '#select'
});
HTML:
<select multiple>
<option value="1">A</option>
<option value="2">B</option>
</select>
Особенность миграции:
multiple остаётся единственным источником
правдыВ старых библиотеках часто используются:
Slim Select полностью инкапсулирует DOM-логику.
$('#select').chosen();
$('#select').trigger('chosen:updated');
const slim = new SlimSelect({
select: '#select'
});
slim.setData([
{ text: 'A', value: 'a' }
]);
Обновление DOM происходит автоматически.
.select2-container.ss-main {}
.ss-single {}
.ss-multi {}
.ss-option {}
В старых библиотеках состояние часто дублируется:
Slim Select использует единую точку состояния —
<select>.
Частая ошибка:
id вместо valueРешение — явная нормализация:
data.map(item => ({
text: item.title,
value: String(item.id)
}));
Код вида:
$('#select').val('1').trigger('change');
не имеет прямого аналога и заменяется:
slim.setSelected('1');
В Select2 используется встроенный search engine с кастомными matcher-функциями:
matcher: function (params, data) {
return data.text.includes(params.term);
}
В Slim Select подобная логика переносится в preprocessing данных:
const filtered = data.filter(item =>
item.text.toLowerCase().includes(query.toLowerCase())
);
slim.setData(filtered);
Таким образом:
Структурные изменения сводятся к следующим переходам: