Fluent-интерфейс в Choices.js строится вокруг принципа, при котором большинство методов экземпляра возвращают сам объект выбора. Это позволяет последовательно вызывать несколько операций без промежуточных переменных и повторного обращения к инстансу.
Основная идея цепочек заключается в том, что каждый вызов изменяет внутреннее состояние компонента и возвращает ссылку на текущий экземпляр, сохраняя контекст выполнения.
В основе цепочек лежит возврат this из методов класса. В
Choices.js экземпляр после инициализации предоставляет набор
API-методов, значительная часть которых спроектирована как модификаторы
состояния.
const choices = new Choices('#select');
choices
.setValue(['1'])
.disable();
Каждый метод в цепочке выполняется последовательно, а результатом
всей последовательности остается тот же объект choices.
Методы библиотеки условно делятся на две группы:
К ним относятся операции управления состоянием интерфейса и выбором:
setValueclearStoreclearChoicesenabledisableshowDropdownhideDropdownremoveActiveItemssetChoiceByValueЭти методы изменяют внутренние структуры данных и возвращают
this.
Часть API предназначена для получения информации:
getValuegetChoicespassedElementОни возвращают данные, а не экземпляр, поэтому цепочка на них завершается.
Хотя конструктор Choices.js не является частью цепочки, дальнейшая конфигурация часто строится как единый поток операций.
const instance = new Choices('#select', {
removeItemButton: true,
searchEnabled: true
});
instance
.clearChoices()
.setChoiceByValue('2')
.hideDropdown();
Такой подход позволяет минимизировать количество точек управления состоянием и упрощает сценарии инициализации.
Операции с выбранными значениями часто комбинируются для создания предсказуемых состояний UI.
choices
.setValue(['10', '20'])
.removeActiveItems()
.setChoiceByValue('30');
Каждый шаг изменяет состояние внутреннего массива выбранных элементов:
setValue задает начальный наборremoveActiveItems очищает активные элементы UIsetChoiceByValue добавляет конкретное значение из
списка доступных опцийТакая последовательность полезна при синхронизации состояния с внешними источниками данных.
Choices.js позволяет динамически управлять набором доступных вариантов. Эти операции часто объединяются в единый поток.
choices
.clearChoices()
.setChoices([
{ value: '1', label: 'Первый' },
{ value: '2', label: 'Второй' }
], 'value', 'label', true);
Хотя setChoices обычно используется отдельно, в цепочках
он применяется для полной перезагрузки состояния списка.
Типичный сценарий:
Состояние компонента (активность, доступность, отображение) часто изменяется последовательно.
choices
.disable()
.enable();
Хотя пример выглядит противоречиво, такие цепочки встречаются при переключении состояния в зависимости от внешней логики.
choices
.showDropdown()
.hideDropdown()
.showDropdown();
Подобные последовательности используются для принудительного обновления UI после изменения данных.
На практике цепочки часто объединяют разные типы методов: управление значениями, списком и интерфейсом.
choices
.clearStore()
.clearChoices()
.setChoices([
{ value: 'a', label: 'A' },
{ value: 'b', label: 'B' }
])
.setValue(['a'])
.hideDropdown();
Такая конструкция описывает полный цикл:
Цепочки в Choices.js возможны благодаря нескольким архитектурным принципам:
this в методах-мутацияхВажно, что цепочка не означает асинхронность. Все методы выполняются синхронно, если явно не задействованы внешние источники данных.
Несмотря на удобство, цепочки имеют ограничения:
choices
.clearChoices()
.clearStore()
.disable()
.setChoices([...])
.setValue(['x'])
.showDropdown();
С увеличением количества шагов возрастает сложность восприятия логики.
const value = choices.getValue().setValue(['1']);
Такой код некорректен, поскольку getValue() возвращает
данные, а не экземпляр.
В реальных сценариях цепочки чаще структурируются по смысловым блокам:
choices
.clearChoices()
.setChoices(data);
choices
.setValue(selectedValues)
.removeActiveItems();
choices
.disable()
.hideDropdown();
Разделение логики на блоки снижает риск появления неочевидных побочных эффектов.
Экземпляр Choices.js сохраняет состояние между цепочками, поэтому последовательные вызовы влияют на один и тот же объект.
choices.setValue(['1']);
choices.clearChoices();
choices.setValue(['2']);
Каждый вызов модифицирует текущее состояние, и порядок выполнения становится критически важным.
При изменении данных извне цепочки часто используются для синхронизации UI:
fetch('/api/options')
.then(r => r.json())
.then(data => {
choices
.clearChoices()
.setChoices(data)
.setValue([data[0].value]);
});
Здесь цепочка выступает как механизм атомарного обновления интерфейса после загрузки данных.
Цепочки могут вызывать триггеры внутренних событий библиотеки:
При последовательных вызовах важно учитывать, что каждый шаг может инициировать перерисовку UI и запуск обработчиков, влияя на последующие операции в цепочке.