QSelect — это компонент для создания выпадающих списков
с множеством возможностей кастомизации. Он поддерживает одиночный и
множественный выбор, поиск по элементам, асинхронную загрузку данных,
динамическое отображение и различные стили.
Ключевые атрибуты:
v-model — связывает выбранное значение с переменной в
состоянии компонента.:options — массив объектов или строк для отображения в
списке.label — подпись поля ввода.Массив options может быть простым:
options: ['Красный', 'Зелёный', 'Синий']
или объектным с ключами label и value:
options: [
{ label: 'Красный', value: 'red' },
{ label: 'Зелёный', value: 'green' },
{ label: 'Синий', value: 'blue' }
]
Для выбора нескольких элементов используется атрибут
multiple:
При множественном выборе v-model хранит массив выбранных
значений. Поддерживаются следующие дополнительные опции:
emit-value — при активации v-model будет
содержать только value элементов, а не объекты.map-options — позволяет автоматически преобразовать
объекты в нужный формат для хранения в v-model.Компонент поддерживает встроенный поиск через атрибут
use-input и событие filter:
methods: {
filterOptions(val, update) {
update(() => {
this.options = this.optionsAll.filter(o => o.label.toLowerCase().includes(val.toLowerCase()));
});
}
}
use-input добавляет текстовое поле, позволяя
пользователю фильтровать список. Функция filterOptions
обрабатывает ввод и обновляет массив отображаемых опций.
QSelect может работать с асинхронными источниками.
Например, при запросе к API:
methods: {
async fetchOptions(val, update) {
const response = await fetch(`https://api.example.com/items?q=${val}`);
const data = await response.json();
update(() => {
this.options = data.map(item => ({ label: item.name, value: item.id }));
});
}
}
Асинхронная фильтрация обеспечивает динамическую подгрузку элементов и минимизирует нагрузку на клиент.
Можно изменять шаблон отображения элементов через слоты:
{{ scope.opt.label }} (ID: {{ scope.opt.value }})
{{ scope.opt.label }}
selected-item — отображение выбранного элемента.option — отображение каждого элемента в списке.QSelect поддерживает валидацию через
rules:
Можно комбинировать несколько правил, включая кастомные проверки для массивов при множественном выборе.
outlined — рамка вокруг поля.filled — заполненное поле с цветной подложкой.dense — уменьшенный размер поля.popup-content-class — кастомизация стиля выпадающего
списка.hide-dropdown-icon — скрыть стрелку выпадающего
списка.
@input — срабатывает при выборе значения.@focus и @blur — отслеживание фокуса.@clear — срабатывает при очистке значения.@new-value — позволяет добавлять новые значения
динамически.
methods: {
addNewOption(val, done) {
const newOption = { label: val, value: val.toLowerCase() };
this.options.push(newOption);
done(newOption);
}
}
@new-value используется для создания опций на лету,
например, при добавлении тегов.