Cascader
Базовый выбор
Значение: —. Поле с name="geo" отдаёт в нативную форму скрытый input: у каскада в форму попадает выбранный уровень, а не весь путь.
Пресет значения
При открытии панели ветка выбранного значения уже раскрыта: видны все уровни до листа.
Поиск и множественный выбор
Поиск ищет по всем уровням сразу и показывает полный путь найденного узла. В множественном режиме панель не закрывается после выбора, повторный выбор пути убирает его.
Состояния
Узел «Стоп-лист» отключён: по нему нельзя перейти и выбрать город внутри.
События
Выберите значение в первом блоке — здесь появится событие select.
Входные параметры
| Имя | Тип | По умолчанию | Описание |
|---|---|---|---|
options | CascaderOption[] | [] | Корневые узлы каскада. Вложенность задаётся полем children. |
modelValue | CascaderPath | CascaderPath[] | null | null | Выбранный путь — массив значений от корня к листу, например ['ru', 'ru-szfo', 'ru-spb']. В режиме multiple — массив таких путей. Путь, которого нет в options, считается пустым выбором. |
placeholder | string | 'Выберите значение' | Подсказка триггера, когда ничего не выбрано. |
searchPlaceholder | string | 'Поиск...' | Подсказка в поле поиска. |
size | 'sm' | 'md' | 'lg' | размер из C3FormField, иначе 'md' | Высота поля. Приоритет у собственного пропа, затем у контекста формы. |
multiple | boolean | false | Множественный выбор: панель не закрывается, повторный выбор пути убирает его. |
searchable | boolean | false | Показывать поиск по всем уровням сразу. |
clearable | boolean | false | Показывать кнопку очистки выбора. Видна только когда есть выбор. |
disabled | boolean | false | Поле недоступно: панель не открывается, кнопка очистки скрыта. |
error | boolean | false | Флаг ошибки: добавляет стиль и aria-invalid. Учитывается и ошибка C3FormField. |
name | string | undefined | Имя поля. Компонент рендерит скрытый input с этим именем, поэтому значение попадает в нативную форму: у пути в форму идёт выбранный уровень, в режиме multiple — по полю на каждый путь. |
columnWidth | string | '12rem' | Ширина одной колонки. |
maxHeight | string | '18rem' | Максимальная высота панели: при большом дереве появляется прокрутка. |
События
| Имя | Аргументы | Описание |
|---|---|---|
update:modelValue | CascaderPath | CascaderPath[] | Новое значение. Доступно как v-model. |
select | (path, option) | Выбран путь: массив значений и сам узел CascaderOption. |
clear | — | Выбор очищен кнопкой очистки. |
Тип CascaderOption
| Поле | Тип | По умолчанию | Описание |
|---|---|---|---|
label | string | — | Подпись узла. |
value | string | number | label | Значение узла. Если не задано, значением считается подпись. |
disabled | boolean | false | Узел недоступен: по нему нельзя перейти к потомкам и нельзя его выбрать. |
children | CascaderOption[] | undefined | Потомки. Если поле есть, узел считается не листом: клик раскрывает ветку. |
Описание
Каскадный выбор нужен для данных с глубокой иерархией: страна → регион → город, отдел → команда, категория → подкатегория → товар. Пользователь видит сразу несколько уровней рядом, поэтому не нужно возвращаться назад: ширина панели растёт вместе с числом открытых колонок.
Значение компонента — путь, а не идентификатор выбранного узла. Это делает состояние самодостаточным: по нему можно восстановить раскрытые уровни, показать полный путь в триггере и однозначно сопоставить выбор с серверными данными.
Выбирается только лист: узел с потомками раскрывает ветку, а не создаёт путь длиной в один уровень. Это исключает неоднозначность, когда выбранный уровень неизвестен.
Поиск (searchable) заменяет колонки одним списком совпадений по всем уровням сразу и показывает полный путь найденного узла — так, например, по запросу «Санкт» виден путь «Россия / Северо-Западный ФО / Санкт-Петербург», а не просто его последний уровень.
Дополнительная информация
- Хлебные крошки над колонками показывают, какая ветка раскрыта; клик по крошке возвращает фокус на этот уровень. В режиме поиска крошки скрыты.
- Клавиатура:
Enter,Space,↑и↓открывают панель; внутри неё↑/↓перемещают активный узел,←/→переходят между колонками,Home/End— к краю колонки,Enterраскрывает узел или выбирает лист,Escapeзакрывает панель. - Навигация пропускает отключённые узлы и зацикливается по колонке; выбранная ветка подсвечена акцентом.
- В режиме поиска
←/→иHome/Endне перехватываются: список один, колонок нет. - Доступность:
aria-haspopup="tree"иaria-expandedу триггера,role="treeitem"иaria-levelу узлов,aria-selectedотмечает ветку выбранного значения. - Панель позиционируется через
computePopoverPositionи закрывается по клику вне; при открытии фокус уходит в панель, при закрытии возвращается на триггер. - Телепорт рендерится только на клиенте, поэтому SSR-разметка не расходится при нескольких каскадах на странице.
- При смене
optionsна открытой панели колонки пересобираются: оставлять прежние данные было бы расхождением с новым набором. - Смена
modelValueснаружи обновляет раскрытую ветку, поэтому значение можно задавать при инициализации или сбросить из кода.
Пример использования
const path = ref<CascaderPath | null>(null)
<C3Cascader v-model="path" :options="geoOptions" searchable clearable />
После выбора в обработчике @select путь готов к отправке целиком: ['ru', 'ru-szfo', 'ru-spb'].