Компонент Cascader в библиотеке Element Plus предназначен для выбора значений из иерархических структур данных. Он часто используется для выбора категорий, регионов, или других объектов, имеющих вложенные уровни. Компонент реализует раскрывающиеся списки, где каждый следующий уровень зависит от выбранного значения на предыдущем уровне.
Ключевые свойства, влияющие на работу компонента:
options — массив объектов с данными для отображения.
Каждый объект обычно имеет поля value, label и
children для вложенных элементов.props — объект, задающий ключи для полей данных,
например:
{ value: 'id', label: 'name', children: 'nodes' }.model-value — текущее выбранное значение или массив
значений для многоуровневого выбора.clearable — позволяет очистить выбранное значение.disabled — блокирует компонент.filterable — включает возможность поиска по
значению.change-on-select — определяет, обновляется ли значение
при каждом выборе уровня или только на последнем.<template>
<el-cascader
v-model="selectedRegion"
:options="regionOptions"
placeholder="Выберите регион"
clearable
/>
</template>
<script>
import { ref } from 'vue';
export default {
setup() {
const selectedRegion = ref([]);
const regionOptions = [
{
value: 'asia',
label: 'Азия',
children: [
{ value: 'china', label: 'Китай' },
{ value: 'japan', label: 'Япония' }
]
},
{
value: 'europe',
label: 'Европа',
children: [
{ value: 'france', label: 'Франция' },
{ value: 'germany', label: 'Германия' }
]
}
];
return { selectedRegion, regionOptions };
}
};
</script>
Cascader позволяет использовать кастомные ключи для
работы с данными, если структура отличается от стандартной. Свойство
props позволяет задать поля для value,
label и children:
<el-cascader
v-model="selectedItem"
:options="customOptions"
:props="{ value: 'id', label: 'title', children: 'subItems' }"
/>
Это удобно при интеграции с API, где структура данных не совпадает с ожидаемой по умолчанию.
Cascader поддерживает произвольное количество уровней вложенности.
Важным параметром является change-on-select. При значении
true выбор на любом уровне сразу обновляет
v-model, при значении false — только выбор
конечного уровня фиксирует значение.
<el-cascader
v-model="selectedItem"
:options="multiLevelOptions"
change-on-select
/>
С помощью свойства filterable компонент позволяет искать
значения в иерархии:
<el-cascader
v-model="selectedItem"
:options="regionOptions"
filterable
placeholder="Поиск региона"
/>
По умолчанию поиск ищет по полю label, но с помощью
метода filter-method можно задать кастомную логику
фильтрации.
<el-cascader
v-model="selectedItem"
:options="regionOptions"
filterable
:filter-method="customFilter"
/>
<script>
const customFilter = (node, keyword) => {
return node.label.toLowerCase().includes(keyword.toLowerCase());
};
</script>
Cascader поддерживает ленивую загрузку вложенных
данных через lazy и lazy-load. Это позволяет
загружать данные по мере раскрытия уровней, что особенно полезно при
работе с большим деревом:
<el-cascader
v-model="selectedItem"
:props="{ lazy: true, lazyLoad: loadData }"
/>
<script>
const loadData = (node, resolve) => {
setTimeout(() => {
const data = node.level === 0
? [{ value: 'asia', label: 'Азия', leaf: false }]
: [{ value: 'china', label: 'Китай', leaf: true }];
resolve(data);
}, 500);
};
</script>
lazy — включает ленивую загрузку.lazyLoad — функция для загрузки данных, принимает
текущий узел и функцию resolve для передачи дочерних
элементов.leaf — указывает, является ли элемент конечным.Компонент позволяет настраивать шаблон отображения выбранного
значения через слот display. Например, можно
добавить иконки, подсказки или форматирование текста:
<el-cascader v-model="selectedItem" :options="regionOptions">
<template #display="{ value, selectedData }">
<span>Вы выбрали: {{ selectedData.map(d => d.label).join(' / ') }}</span>
</template>
</el-cascader>
Основные события компонента:
change — срабатывает при изменении значения.expand-change — при раскрытии нового уровня.visible-change — при открытии или закрытии выпадающего
меню.remove-tag — при удалении выбранного тега (для
мультивыборов).Пример обработки события change:
<el-cascader
v-model="selectedItem"
:options="regionOptions"
@change="handleChange"
/>
<script>
const handleChange = (value) => {
console.log('Выбранное значение:', value);
};
</script>
Cascader поддерживает множественный выбор через
multiple и check-strictly.
multiple — включает возможность выбирать несколько
элементов.check-strictly — позволяет выбирать дочерние элементы
независимо от родителя.<el-cascader
v-model="selectedItems"
:options="regionOptions"
multiple
check-strictly
/>
Cascader можно стилизовать через классы и CSS-переменные:
el-cascader — основной контейнер.el-cascader-panel — панель выбора.el-cascader-node — отдельный элемент дерева.el-cascader-node__label — текст узла.Для изменения цвета или шрифта можно использовать CSS-переменные:
.el-cascader {
--el-color-primary: #409eff;
--el-font-size-base: 14px;
}
Эти возможности делают Cascader гибким инструментом для работы с иерархическими структурами, обеспечивая удобный пользовательский интерфейс и широкие возможности кастомизации.