В Slim Select взаимодействие с состоянием компонента построено вокруг событийного API. Экземпляр селекта предоставляет механизм подписки на изменения, позволяя реагировать на действия пользователя и внутренние изменения состояния без вмешательства в DOM-логику.
Основная модель работы основана на регистрации обработчиков через
метод on(event, handler) и управлении подписками через
off(event, handler) или сброс всех слушателей при
необходимости.
Ключевая особенность заключается в том, что события разделяются на жизненный цикл компонента и пользовательские действия, происходящие внутри выпадающего списка.
После создания экземпляра Slim Select доступен объект управления, через который регистрируются события:
const select = new SlimSelect({
select: '#mySelect'
});
select.on('change', (info) => {
console.log(info);
});
Обработчики получают объект состояния, структура которого зависит от типа события. В большинстве случаев это либо текущее значение, либо расширенная информация о выбранных элементах.
Удаление обработчика выполняется через:
function handler(data) {
console.log(data);
}
select.on('change', handler);
// позже
select.off('change', handler);
Событие change является центральным в работе Slim
Select. Оно вызывается при любом изменении выбранного значения.
select.on('change', (data) => {
console.log('Текущее значение:', data);
});
Особенности:
В некоторых конфигурациях Slim Select поведение может быть разбито на более детализированные события:
select — выбор элементаdeselect — снятие выбораselect.on('select', (item) => {
console.log('Выбран:', item);
});
select.on('deselect', (item) => {
console.log('Снято:', item);
});
Каждое событие передаёт объект элемента, содержащий идентификатор, текст и дополнительные поля, если они были заданы в исходных данных.
Компонент предоставляет события жизненного цикла dropdown-меню.
Вызывается до отображения списка. Используется для подготовки данных или отмены открытия через логику обработки.
select.on('beforeOpen', () => {
console.log('Перед открытием списка');
});
Срабатывает после того, как список стал видимым.
select.on('afterOpen', () => {
console.log('Список открыт');
});
Событие перед закрытием выпадающего списка.
select.on('beforeClose', () => {
console.log('Перед закрытием');
});
Фиксирует момент завершения закрытия интерфейса.
select.on('afterClose', () => {
console.log('Список закрыт');
});
Slim Select поддерживает встроенную фильтрацию списка, и этот процесс также сопровождается событиями.
Событие search вызывается при вводе текста в поле поиска
внутри dropdown.
select.on('search', (query) => {
console.log('Поисковый запрос:', query);
});
Использование:
При асинхронной работе событие может использоваться как триггер запроса к API.
В сложных сценариях Slim Select может работать с динамическими списками. При обновлении данных важно отслеживать состояние компонента.
Типовые ситуации:
select.setData([
{ text: 'Option 1', value: '1' },
{ text: 'Option 2', value: '2' }
]);
select.on('change', (data) => {
console.log('Обновлённое значение:', data);
});
Изменения, вызванные программно, также могут генерировать
change, что важно учитывать при построении реактивной
логики.
При длительной работе интерфейса критично управлять количеством подписок на события.
Рекомендуемые подходы:
function onChange(data) {
console.log(data);
}
select.on('change', onChange);
// очистка при необходимости
select.off('change', onChange);
При повторной инициализации селекта без очистки подписок возможно накопление обработчиков, приводящее к множественному срабатыванию событий.
При интеграции Slim Select в SPA-архитектуры события становятся основным способом синхронизации состояния UI и бизнес-логики.
Типовой сценарий:
select.on('afterOpen', async () => {
const res = await fetch('/api/options');
const data = await res.json();
select.setData(data);
});
Последовательность событий имеет значение при комбинировании логики:
beforeOpenafterOpensearch (при вводе)change (при выборе)beforeCloseafterCloseЭта последовательность позволяет выстраивать предсказуемые цепочки обработки состояния, особенно при асинхронной загрузке данных и кастомной фильтрации.
Программное управление Slim Select часто приводит к генерации событий, аналогичных пользовательским действиям. Это необходимо учитывать при построении реактивных интерфейсов, чтобы избежать циклических обновлений.
Пример защиты от зацикливания:
let internalUpdate = false;
select.on('change', (data) => {
if (internalUpdate) return;
console.log('Пользователь изменил значение', data);
});
internalUpdate = true;
select.set('value', '2');
internalUpdate = false;