Slim.js предоставляет лёгкий и производительный способ управления DOM
через декларативный синтаксис. Одной из ключевых задач в интерфейсах
является работа с элементами <select> и поддержка
множественного выбора. Slim.js облегчает синхронизацию данных с UI и
позволяет управлять списками опций динамически.
Для создания стандартного <select> в Slim.js
используется привязка к массиву данных с помощью атрибута
each. Например:
class SimpleSelect extends Slim {
constructor() {
super();
this.options = [
{ id: 1, name: 'Красный' },
{ id: 2, name: 'Зелёный' },
{ id: 3, name: 'Синий' }
];
this.selected = null;
}
onSelectChange(e) {
this.selected = e.target.value;
console.log('Выбран:', this.selected);
}
}
Slim.tag('simple-select', SimpleSelect);
<simple-select>
<SELECT on-change="onSelectChange">
<option each="option in options" value="{{option.id}}">
{{option.name}}
</option>
</select>
</simple-select>
Ключевые моменты:
each="option in options" создаёт опции автоматически по
массиву объектов.{{option.name}} — связывание текста опции с полем
объекта.on-change позволяет отлавливать изменения
выбора и обновлять состояние компонента.Для включения множественного выбора необходимо добавить атрибут
multiple к <select> и использовать
массив для хранения выбранных значений.
class MultiSelect extends Slim {
constructor() {
super();
this.options = [
{ id: 1, name: 'Python' },
{ id: 2, name: 'JavaScript' },
{ id: 3, name: 'Java' }
];
this.selected = [];
}
onSelectChange(e) {
const selectedOptions = Array.FROM(e.target.selectedOptions).map(o => o.value);
this.selected = selectedOptions;
console.log('Выбрано:', this.selected);
}
}
Slim.tag('multi-select', MultiSelect);
<multi-select>
<SELECT multiple on-change="onSelectChange">
<option each="option in options" value="{{option.id}}">
{{option.name}}
</option>
</select>
</multi-select>
Особенности множественного выбора:
selected становится массивом, а не одиночным
значением.Array.FROM(e.target.selectedOptions) позволяет
получить все выбранные элементы.options Slim.js
автоматически пересоздаёт DOM, сохраняя выбранные элементы, если они
присутствуют в новом массиве.Slim.js позволяет не только рендерить статические опции, но и динамически изменять их содержимое.
class DynamicSelect extends Slim {
constructor() {
super();
this.options = [];
this.selected = null;
}
connectedCallback() {
setTimeout(() => {
this.options = [
{ id: 'a', name: 'Опция A' },
{ id: 'b', name: 'Опция B' },
{ id: 'c', name: 'Опция C' }
];
}, 1000);
}
onSelectChange(e) {
this.selected = e.target.value;
}
}
Slim.tag('dynamic-select', DynamicSelect);
options автоматически обновляет
DOM.<option>.Можно использовать сложные объекты в качестве значений опций и связывать их напрямую с компонентом:
class ObjectSelect extends Slim {
constructor() {
super();
this.options = [
{ id: 1, name: 'Alice', age: 25 },
{ id: 2, name: 'Bob', age: 30 }
];
this.selected = null;
}
onSelectChange(e) {
const selectedId = parseInt(e.target.value, 10);
this.selected = this.options.find(opt => opt.id === selectedId);
}
}
Slim.tag('object-select', ObjectSelect);
options хранятся объекты, а не только
строки.change позволяет найти выбранный объект и
сохранить его полностью, а не только значение поля.Slim.js поддерживает двустороннюю привязку через bind.
Для множественного выбора можно использовать следующее решение:
<select multiple bind="selected">
<option each="option in options" value="{{option.id}}">
{{option.name}}
</option>
</select>
selected автоматически обновляет
UI.selected
обновляется автоматически.<optgroup>): можно
динамически рендерить группы, используя вложенный
each.if внутри <option>, позволяя фильтровать
опции на лету.class="{{…}}" для выделения выбранных
опций.Эта гибкость делает Slim.js мощным инструментом для управления
<select> элементами с множественным выбором,
динамическими данными и сложными объектами.