Метод addData в Slim Select используется для
динамического добавления новых элементов в уже инициализированный
список. В отличие от полной замены данных через setData,
данный метод выполняет инкрементальное расширение существующего набора
опций без разрушения текущего состояния выбранных значений и без
повторной инициализации компонента.
Ключевая особенность заключается в том, что addData
работает поверх уже существующей структуры данных, сохраняя:
Метод предназначен для сценариев, где данные подгружаются постепенно: пагинация, lazy loading, результаты поиска по API.
Формально метод вызывается на экземпляре Slim Select:
select.addData(data);
где data — массив объектов, соответствующих формату Slim
Select:
{
text: 'Отображаемый текст',
value: 'уникальное_значение',
selected: false,
disabled: false,
innerHTML: '<span>HTML содержимое</span>',
data: { ...любые пользовательские данные }
}
Каждый элемент массива, передаваемого в addData, должен
соответствовать внутреннему контракту библиотеки.
text Отображаемое значение в списке. Используется для визуализации опции.
value Уникальный идентификатор. Именно он участвует в выборе и сравнении значений.
selected Булево значение. Определяет, будет ли элемент автоматически выбран после добавления.
disabled Отключает возможность выбора элемента.
innerHTML Позволяет заменить стандартный
рендеринг кастомным HTML. При наличии этого поля text может
игнорироваться при отображении.
data Пользовательский объект для хранения метаданных. Не участвует в логике UI напрямую, но доступен через API.
При вызове addData происходит несколько внутренних
этапов:
Валидация входного массива Проверяется наличие
обязательных полей (text, value).
Фильтрация дубликатов Элементы с уже
существующими value игнорируются. Slim Select использует
value как уникальный ключ.
Генерация внутренних моделей Каждый объект преобразуется в внутренний формат библиотеки.
Обновление состояния компонента Новые элементы добавляются в:
Сохранение выбранных значений Текущее состояние selection не сбрасывается.
const select = new SlimSelect({
select: '#example'
});
select.addData([
{ text: 'JavaScript', value: 'js' },
{ text: 'TypeScript', value: 'ts' }
]);
После выполнения к списку добавляются две новые опции без перерисовки всей структуры.
Если требуется сразу выбрать добавляемые элементы, используется поле
selected:
select.addData([
{ text: 'React', value: 'react', selected: true },
{ text: 'Vue', value: 'vue', selected: false }
]);
В этом случае Slim Select автоматически обновит состояние выбранных значений и синхронизирует UI.
Slim Select допускает использование HTML внутри опций через
innerHTML:
select.addData([
{
text: 'GitHub',
value: 'github',
innerHTML: '<strong>GitHub</strong> — репозиторий'
}
]);
При наличии innerHTML библиотека использует его вместо
стандартного текстового рендера, что позволяет создавать сложные
визуальные элементы списка.
Типичный сценарий применения addData — подгрузка данных
с API:
fetch('/api/languages')
.then(res => res.json())
.then(data => {
select.addData(
data.map(item => ({
text: item.name,
value: item.code
}))
);
});
Такой подход позволяет реализовать ленивую загрузку без пересоздания компонента.
Slim Select использует строгую проверку по value. Если в
addData передан элемент с уже существующим значением:
{ text: 'JavaScript', value: 'js' }
и такой value уже есть в списке, элемент будет
проигнорирован.
Это предотвращает:
Добавление данных не сбрасывает текущие выбранные элементы. Однако
при совпадении value с уже выбранным элементом возможны два
сценария:
selected: true) — происходит синхронизация выбора.Если добавляемый объект содержит:
disabled: true
он отображается в списке, но не может быть выбран. Такие элементы полезны для:
| Поведение | addData | setData |
|---|---|---|
| Очистка текущих данных | нет | да |
| Сохранение выбора | да | нет |
| Перерисовка списка | частичная | полная |
| Использование | инкремент | полная замена |
addData применяется в ситуациях, где важно сохранить
состояние компонента и расширить его без разрушения текущей
структуры.
При активном поиске новые элементы автоматически попадают в индекс поиска. Однако они могут не отображаться сразу, если не соответствуют текущему фильтру.
После добавления данных Slim Select обновляет внутренний search index, что позволяет сразу находить новые элементы через встроенный поиск.
При массовом добавлении данных следует учитывать:
addData подряд могут вызывать избыточные
перерасчёты.Рекомендуется агрегировать данные и передавать их одним массивом.
Наиболее характерные случаи применения:
Если addData([]) вызывается с пустым массивом, состояние
компонента не изменяется. Ошибки не возникает, операция считается
безопасной и идемпотентной.
При передаче объектов без обязательных полей:
{ text: 'Test' } // отсутствует value
элемент игнорируется. Slim Select не выбрасывает исключение, а просто пропускает некорректные записи, сохраняя стабильность работы компонента.
Основные факторы, влияющие на скорость работы
addData:
innerHTML;При больших объёмах данных предпочтительно использовать батчевую загрузку.
Последовательные вызовы:
select.addData([...]);
select.addData([...]);
select.addData([...]);
обрабатываются как независимые операции. Каждый вызов инициирует обновление индексов и DOM, что может привести к избыточным перерасчётам при частом использовании.