Динамическое управление набором вариантов является одной из ключевых возможностей Choices.js, позволяющей превращать статический select в полноценный управляемый компонент с внешними источниками данных, фильтрацией и реактивным обновлением. В основе этой функциональности лежит работа с внутренним store экземпляра, который хранит список доступных опций и текущее состояние выбранных значений.
Основной механизм обновления списка вариантов — метод
setChoices. Он позволяет полностью или частично заменить
текущий набор данных, а также задать правила интерпретации входных
полей.
choices.setChoices(
[
{ value: 'js', label: 'JavaScript' },
{ value: 'ts', label: 'TypeScript' }
],
'value',
'label',
true
);
Первый аргумент представляет собой массив объектов, описывающих элементы списка. Второй и третий параметры определяют, какие поля использовать как значение и отображаемый текст. Четвёртый параметр управляет поведением замены:
true — полный сброс текущих опций перед добавлением
новыхfalse — добавление к существующему списку без удаления
старых элементовПри полной замене происходит пересборка внутреннего состояния, включая индекс поиска и кеш фильтрации. Это важно учитывать при работе с большими массивами данных, так как операция может быть затратной.
В сценариях, где данные поступают порциями (например, при пагинации или автодополнении), используется добавление без очистки существующего списка.
choices.setChoices(
[
{ value: 'react', label: 'React' }
],
'value',
'label',
false
);
Такой подход позволяет расширять список без потери ранее загруженных
элементов. Внутренний механизм при этом выполняет проверку на дубликаты
по значению value, если включена соответствующая
конфигурация duplicateItems.
Для полного удаления всех доступных вариантов используется метод
clearChoices. Он очищает только список опций, не затрагивая
выбранные элементы.
choices.clearChoices();
Это поведение важно, так как визуально компонент может сохранить выбранные значения, даже если они больше не присутствуют в доступном списке. В таких случаях требуется дополнительная синхронизация состояния.
Если требуется очистить не только список, но и внутреннее состояние
выбора, применяется clearStore.
choices.clearStore();
Данный метод выполняет более глубокую очистку:
Этот механизм используется при полной перезагрузке компонента или при переключении контекста данных.
Choices.js предоставляет отдельные методы для управления выбранными элементами без прямого вмешательства в список опций.
choices.setValue(['js', 'ts']);
Переданные значения сопоставляются с уже существующими элементами
списка. Если совпадения отсутствуют, поведение зависит от конфигурации
addItems и addItemFilter.
Также возможен вариант установки объектов:
choices.setValue([
{ value: 'js', label: 'JavaScript' }
]);
В этом случае создаются новые элементы, если они отсутствуют.
choices.setChoiceByValue('react');
Метод позволяет выбрать уже существующий элемент по его значению. При множественном выборе допускается передача массива значений.
Хотя основной акцент Choices.js смещён на работу с массивами, возможны точечные операции.
Добавление:
choices.setChoices(
[{ value: 'vue', label: 'Vue' }],
'value',
'label',
false
);
Удаление чаще реализуется через пересборку списка, однако в некоторых версиях доступен доступ к внутреннему store:
choices.removeActiveItems();
Этот метод удаляет выбранные элементы, но не затрагивает доступные опции.
При интеграции с API сервером обновление опций обычно происходит в ответ на запрос пользователя или событие ввода.
Типичный поток выглядит следующим образом:
setChoicesfetch('/api/languages')
.then(res => res.json())
.then(data => {
choices.setChoices(data, 'id', 'name', true);
});
При этом важно учитывать асинхронный характер загрузки: пользователь может успеть начать ввод до завершения запроса, что приводит к необходимости дебаунса и отмены устаревших запросов.
После обновления списка Choices.js автоматически пересобирает:
Это означает, что любые изменения сразу отражаются в UI без дополнительного вызова refresh-методов. Однако при сложных сценариях с кастомными рендерами может потребоваться принудительное обновление состояния через повторную инициализацию.
При добавлении новых элементов важно учитывать поведение дубликатов.
Если значение value уже присутствует в списке, Choices.js
может:
Контроль осуществляется через параметры конфигурации экземпляра и структуру входных данных.
При работе с большими массивами данных не рекомендуется полностью пересоздавать список при каждом изменении. Более эффективный подход включает:
setChoicesПример пакетной загрузки:
const batch = [
{ value: 'go', label: 'Go' },
{ value: 'rust', label: 'Rust' }
];
choices.setChoices(batch, 'value', 'label', false);
Такой подход снижает нагрузку на пересборку индексов и улучшает отзывчивость интерфейса.
В современных приложениях Choices.js часто используется совместно с фреймворками, где состояние может меняться независимо от компонента. В таких случаях обновление опций привязывается к реактивным потокам данных.
При изменении внешнего состояния важно соблюдать последовательность:
Нарушение порядка может приводить к рассинхронизации UI и внутреннего store.
При частых обновлениях данных важным становится контроль жизненного
цикла экземпляра. Повторные вызовы setChoices без очистки
могут приводить к:
Для предотвращения подобных эффектов используется явная очистка состояния перед загрузкой новых данных или ограничение частоты обновлений через debounce-механизмы.