Choices.js строит работу вокруг двух ключевых сущностей:
choices (варианты выбора) и items
(выбранные значения). Независимо от источника данных — HTML
<select>, массива объектов или удалённого API —
библиотека нормализует данные в единый внутренний формат.
Каждый элемент choices обычно представлен структурой:
value — уникальный идентификаторlabel — отображаемый текстselected — состояние выбораdisabled — доступностьcustomProperties,
placeholder, group)Такой подход позволяет унифицировать операции добавления, удаления и обновления данных без привязки к DOM.
При создании экземпляра Choices.js данные могут поступать из нескольких источников:
const element = document.querySelector('#select');
const choices = new Choices(element);
В этом случае библиотека парсит <option> и
<optgroup> и строит внутреннюю коллекцию.
const choices = new Choices('#select', {
choices: [
{ value: 'js', label: 'JavaScript' },
{ value: 'py', label: 'Python' }
]
});
Этот способ полностью заменяет исходный DOM-набор.
choices.setChoices([
{
label: 'Frontend',
choices: [
{ value: 'react', label: 'React' },
{ value: 'vue', label: 'Vue' }
]
}
]);
Группы позволяют структурировать данные без изменения логики выбора.
setChoices используется для загрузки или перезагрузки
списка доступных вариантов. Он может:
setChoices(choicesArray, valueKey, labelKey, replaceChoices)
choicesArray — массив данныхvalueKey — ключ значения (по умолчанию
value)labelKey — ключ отображаемого текста (по умолчанию
label)replaceChoices — флаг замены текущего спискаchoices.setChoices(
[
{ value: 'html', label: 'HTML' },
{ value: 'css', label: 'CSS' }
],
'value',
'label',
true
);
При replaceChoices = true старые данные полностью
удаляются из внутреннего store.
choices.setChoices([
{ value: 'node', label: 'Node.js' }
], 'value', 'label', false);
Используется при догрузке данных, например, при пагинации.
Позволяет установить выбранные элементы на основе их значения.
setChoiceByValue(value)
или массив значений:
setChoiceByValue(['js', 'py'])
choices.setChoiceByValue('react');
или множественный выбор:
choices.setChoiceByValue(['react', 'vue']);
Метод автоматически синхронизирует:
Полностью очищает внутренние данные Choices.js, включая:
clearStore()
choices.clearStore();
После выполнения экземпляр становится «пустым», как при инициализации без данных.
Очищает только доступные варианты, но сохраняет выбранные значения.
clearChoices()
choices.clearChoices();
Используется при динамической подмене данных без сброса пользовательского выбора.
Сбрасывает введённый пользователем текст в поисковом поле dropdown.
clearInput()
choices.clearInput();
Полезно после программного изменения списка или выбора значения.
Метод возвращает текущие выбранные элементы.
getValue()
Возвращает массив объектов:
[
{ value: 'js', label: 'JavaScript', selected: true }
]
В некоторых конфигурациях можно получить упрощённый массив:
choices.getValue(true);
Результат:
['js', 'py']
Если Choices.js используется как single select,
getValue() возвращает один объект:
{
value: 'react',
label: 'React',
selected: true
}
addChoice(choices, value, label, select = false, customProperties)
choices.addChoice(
{ value: 'svelte', label: 'Svelte' },
'value',
'label',
false
);
choices.addChoice(
{ value: 'solid', label: 'SolidJS' },
'value',
'label',
true
);
Удаляет вариант по значению.
choices.removeChoice('react');
При удалении:
Choices.js поддерживает динамическую загрузку данных через
setChoices, что позволяет интегрироваться с API.
fetch('/api/languages')
.then(res => res.json())
.then(data => {
choices.setChoices(data, 'id', 'name', true);
});
fetch('/api/languages?page=2')
.then(res => res.json())
.then(data => {
choices.setChoices(data, 'id', 'name', false);
});
Choices.js не предоставляет прямого updateChoice, но
обновление реализуется через комбинацию методов:
choices.removeChoice('react');
choices.addChoice({
value: 'react',
label: 'React 19'
});
choices.setChoices(newData, 'value', 'label', true);
Используется при массовом обновлении данных.
Choices.js поддерживает вложенные структуры.
[
{
label: 'Languages',
choices: [
{ value: 'js', label: 'JavaScript' },
{ value: 'ts', label: 'TypeScript' }
]
}
]
choices.setChoices(groupedData);
Группы обрабатываются как отдельные контейнеры внутри store, но сохраняют ту же модель value/label.
При динамической загрузке важно учитывать:
valuelabelnull значенийChoices.js не выполняет строгую валидацию, поэтому некорректные данные могут привести к:
Каждый метод, работающий с данными, синхронизирует три слоя:
Например, setChoiceByValue одновременно:
const selected = choices.getValue(true);
choices.setChoices(newData, 'value', 'label', true);
choices.setChoiceByValue(selected);
choices.clearStore();
fetch('/api/new-data')
.then(res => res.json())
.then(data => {
choices.setChoices(data, 'value', 'label', true);
});
const exists = choices.getValue(true).includes('react');
if (!exists) {
choices.addChoice({
value: 'react',
label: 'React'
});
}
Choices.js не поддерживает:
Все операции выполняются императивно через API методов.