В библиотеке Element Plus для реализации
множественного выбора используется компонент
<el-select> с атрибутом
multiple. Этот компонент позволяет пользователю выбрать
сразу несколько значений из заданного списка и управлять их отображением
и поведением.
<template>
<el-select v-model="selectedValues" multiple placeholder="Выберите значения">
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</template>
<script>
export default {
data() {
return {
selectedValues: [],
options: [
{ value: 'apple', label: 'Яблоко' },
{ value: 'orange', label: 'Апельсин' },
{ value: 'banana', label: 'Банан' },
{ value: 'grape', label: 'Виноград' }
]
};
}
};
</script>
Ключевые моменты:
v-model связывает выбранные значения с реактивной
переменной.multiple позволяет выбирать несколько
значений.<el-option> с параметрами value и
label.По умолчанию выбранные значения отображаются внутри поля ввода через
запятую. Для удобства пользовательского интерфейса можно включить
теги (collapse-tags) или использовать
слоты для кастомизации.
<el-select
v-model="selectedValues"
multiple
collapse-tags
placeholder="Выберите фрукты">
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
Особенности:
collapse-tags сворачивает длинный список выбранных
значений в одну метку с количеством выбранных элементов.filterable позволяет включить поиск по значениям.allow-create позволяет пользователю добавлять новые
значения прямо в список.Для больших списков часто используется фильтрация по вводимому
тексту. Element Plus поддерживает это через filterable и
кастомную функцию фильтрации через filter-method.
<el-select
v-model="selectedValues"
multiple
filterable
:filter-method="customFilter"
placeholder="Выберите фрукты">
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
<script>
export default {
data() {
return {
selectedValues: [],
options: [
{ value: 'apple', label: 'Яблоко' },
{ value: 'orange', label: 'Апельсин' },
{ value: 'banana', label: 'Банан' },
{ value: 'grape', label: 'Виноград' }
]
};
},
methods: {
customFilter(query, item) {
return item.label.toLowerCase().includes(query.toLowerCase());
}
}
};
</script>
Пояснения:
filterable делает поле ввода интерактивным для
поиска.filter-method позволяет полностью контролировать
процесс фильтрации, включая нечувствительность к регистру, сложные
алгоритмы поиска или сопоставление по нескольким полям объекта.Для случаев, когда необходимо ограничить количество выбранных
элементов, используется атрибут
:max-tag-count.
<el-select
v-model="selectedValues"
multiple
collapse-tags
:max-tag-count="2"
placeholder="Выберите фрукты">
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
Эффект:
Компонент <el-select> предоставляет ряд событий
для обработки выбора:
change — срабатывает при изменении выбранных
значений.visible-change — срабатывает при открытии или закрытии
выпадающего списка.remove-tag — срабатывает при удалении отдельного
значения в режиме множественного выбора.<el-select
v-model="selectedValues"
multiple
placeholder="Выберите фрукты"
@change="handleChange"
@remove-tag="handleRemoveTag">
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
<script>
export default {
data() {
return {
selectedValues: [],
options: [
{ value: 'apple', label: 'Яблоко' },
{ value: 'orange', label: 'Апельсин' },
{ value: 'banana', label: 'Банан' },
{ value: 'grape', label: 'Виноград' }
]
};
},
methods: {
handleChange(value) {
console.log('Выбранные значения:', value);
},
handleRemoveTag(removedValue) {
console.log('Удалённое значение:', removedValue);
}
}
};
</script>
Element Plus позволяет полностью настраивать отображение элементов через слоты. Например, можно добавить иконки или подсказки к каждому элементу списка:
<el-select v-model="selectedValues" multiple placeholder="Выберите фрукты">
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value">
<template #default>
<span>{{ item.label }}</span>
<i class="el-icon-check" v-if="selectedValues.includes(item.value)"></i>
</template>
</el-option>
</el-select>
Особенности:
#default позволяет добавлять кастомные элементы в
каждом пункте.Компонент множественного выбора интегрируется с
<el-form> для валидации данных:
<el-form :model="form" :rules="rules" ref="formRef">
<el-form-item label="Фрукты" prop="fruits">
<el-select v-model="form.fruits" multiple placeholder="Выберите фрукты">
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
<el-button type="primary" @click="submitForm">Отправить</el-button>
</el-form>
<script>
export default {
data() {
return {
form: { fruits: [] },
options: [
{ value: 'apple', label: 'Яблоко' },
{ value: 'orange', label: 'Апельсин' },
{ value: 'banana', label: 'Банан' }
],
rules: {
fruits: [
{ type: 'array', required: true, message: 'Выберите хотя бы один фрукт', trigger: 'change' }
]
}
};
},
methods: {
submitForm() {
this.$refs.formRef.validate(valid => {
if (valid) {
console.log('Форма успешно отправлена', this.form);
} else {
console.log('Ошибка валидации');
}
});
}
}
};
</script>
Преимущества:
Эти возможности делают компонент
<el-select multiple> универсальным
инструментом для реализации сложных интерфейсов выбора, удобных для
пользователя и легко интегрируемых с Vue 3.