Cascader 级联选择
import { SHOW_CHILD, SHOW_PARENT } from '@apollo-design/ui';从具有层级关系的数据中选择完整路径,支持多选、搜索和异步加载。浮层选择器与 CascaderPanel 共用值、字段映射和勾选规则。
import { Cascader, CascaderPanel } from '@apollo-design/ui';
import type { CascaderOutputValue } from '@apollo-design/ui';
Props
ValueCell = (string | number)[]。单选输出 ValueCell,多选输出 ValueCell[];清除时均输出 [],change 的 options 同步输出 []。数字 0、字符串 '0' 和包含分隔符的字符串是不同的合法值。找不到的受控路径仍展示原值,后续补上 options 即使用当前标签。
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| options | 数据源;每层 value 在同级中唯一 | BaseOptionType[] | [] |
| value / defaultValue | 当前值 / 非受控初始值;标量按单段路径处理 | CascaderValue | - |
| multiple / checkable | 多选;仅 checkable: true 启用多选 |
boolean | false |
| fieldNames | label、value、children 字段映射;支持动态更新 | FieldNames | 标准字段名 |
| changeOnSelect | 单选可选择中间层 | boolean | false |
| showCheckedStrategy | 多选输出和标签去重规则,不改变实际勾选传导 | SHOW_PARENT | SHOW_CHILD | SHOW_PARENT |
| showSearch | 启用搜索;配置 filter、sort、limit、matchInputWidth、autoClearSearchValue | boolean | CascaderSearchConfig | 单选 false;多选 true |
| searchValue / autoClearSearchValue | 搜索词 / 选择后清空;配置对象中的 autoClearSearchValue 优先 | string / boolean | '' / true |
| loadData | 加载尚无 children 的非叶子路径;同一未完成路径不重复请求。可返回 Promise,拒绝交给 Vue 错误处理器,加载结束后可重试 | (selectedOptions) => void | Promise<void> | - |
| expandTrigger | 鼠标展开方式;键盘支持方向键、Enter、Escape,多选 Space | 'click' | 'hover' | 'click' |
| open / defaultOpen | 当前浮层开关 / 非受控初始值 | boolean | false |
| size / disabled / loading / status | 尺寸、禁用、加载提示、表单状态 | SizeType / boolean / boolean / 'error' | 'warning' | - |
| variant / bordered | outlined、borderless、filled、underlined;未指定 variant 时 bordered 控制旧的边框选择 | SelectVariant / boolean | outlined / true |
| placeholder / notFoundContent | 占位和空内容;同名插槽优先,空插槽不回退 | VNodeChild | - / 'Not Found' |
| allowClear / clearIcon / removeIcon / suffixIcon | 清除、移除和后缀图标 | boolean | { clearIcon? } / VNodeChild | true |
| expandIcon / loadingIcon | 列展开和异步加载图标;同名作用域插槽优先 | VNodeChild | 方向箭头 / 加载图标 |
| maxTagCount / maxTagTextLength / maxTagPlaceholder | 多选标签数量、文本长度和静态溢出内容;动态内容用插槽 | number / number / VNodeChild | - |
| placement / direction | 浮层位置和文字方向;方向继承当前 ConfigProvider | SelectCommonPlacement / 'ltr' | 'rtl' | bottomLeft / 'ltr' |
| popupClassName / dropdownClassName | 浮层 class;前者优先 | string | - |
| popupStyle / popupMenuColumnStyle | 浮层根 / 每个菜单列 ul 的样式 | CSSProperties | - |
| popupMatchSelectWidth | 浮层匹配触发器宽度 | boolean | number | false |
| getPopupContainer | 浮层容器;未指定时继承当前 ConfigProvider | (node) => HTMLElement | - |
| classNames / styles | 语义目标对象,或 ({ props }) => 对象 |
CascaderSemanticClassNames / CascaderSemanticStyles | - |
| id / prefixCls | 输入 ID / 组件前缀 | string | 自动 ID / apollo-cascader |
原生 class、style 与其他 attrs 落到实际触发器;aria-label、aria-labelledby 落到输入框。语义目标为 root、prefix、suffix、input、placeholder、content、item、itemContent、itemRemove、clear 及 popup.root/list/listItem。Provider 配置、语义样式、原生根样式依次合并,原生根样式优先。
Slots
插槽内容遵守 Vue 的完整 VNodeChild 语义,支持文本、零值、多个节点和条件插槽。
| 插槽 | 作用域 | 用途 |
|---|---|---|
| default | - | 自定义完整触发器内容 |
| displayRender | { labels, selectedOptions } | 选中路径标签;默认单选以 / 连接,多选显示末段 |
| optionRender | { option, pathOptions } | 普通菜单选项内容 |
| searchRender | { inputValue, pathOptions, fieldNames } | 搜索命中路径内容 |
| popupRender | { menu: VNode } | 包装原生菜单;用 <component :is="menu" /> 渲染,保留面板身份与原有事件 |
| expandIcon / loadingIcon | { option } | 每个选项的展开 / 加载图标 |
| suffixIcon / searchIcon | { focused, open, searchValue, showSearch, loading } | 后缀 / 聚焦搜索图标 |
| maxTagPlaceholder | { omittedValues: { value: ValueCell, label, disabled? }[] } | 多选溢出标签内容 |
| placeholder / notFoundContent / clearIcon / removeIcon | - | 对应内容 |
Emits 与 v-model
| 事件 | 参数 |
|---|---|
| update:value | value: CascaderOutputValue |
| change | value: CascaderOutputValue, selectedOptions: CascaderSelectedOptions |
| update:open / openChange | open: boolean |
| update:searchValue / search | text: string |
| focus / blur | FocusEvent |
| clear | 无 |
| popupScroll | Event |
| keydown / keyup / mousedown | 对应原生事件 |
使用 v-model:value、v-model:open、v-model:searchValue;受控时仅提出更新,父级未接收不改变已接受值。传入 undefined 撤控时沿用最后实际收到的值。公开通知由 Vue Emits 派发,支持 Vue 原生监听器数组,不再手工调用 attrs 中的回调。
Ref 与 Panel
组件 ref 提供 nativeElement: HTMLElement | null 属性、focus(options?: FocusOptions)、blur()。
CascaderPanel(或 Cascader.Panel)只有菜单列,无浮层和输入框。支持 options、value/defaultValue、multiple、fieldNames、changeOnSelect、showCheckedStrategy、loadData、expandTrigger、expandIcon、loadingIcon、direction、disabled、notFoundContent、popupMenuColumnStyle、classNames/styles;支持 update:value、change 及 optionRender/searchRender/expandIcon/loadingIcon/notFoundContent 插槽。原生 attrs 直接落在可聚焦面板根,键盘交互与浮层一致。
静态属性 Cascader.SHOW_PARENT / Cascader.SHOW_CHILD 提供策略常量。内部别名 _InternalPanelDoNotUseOrYouWillBeFired 仍指向 Panel(历史边界 D113)。
开发期迁移与主题
移除函数 Props displayRender、optionRender、popupRender,改用同名作用域插槽;showSearch.render 改为 #searchRender,嵌套 searchValue/onSearch 改为顶层模型与 @search。函数式 maxTagPlaceholder 改为插槽,图标函数改为插槽。无效的 trigger、placeholder2 和重复的 popupVisibleChange/dropdownVisibleChange 通知不再作为公共接口。
8 个组件 Token:controlWidth(184)、controlItemWidth(111)、dropdownHeight(180)、optionSelectedBg、optionSelectedFontWeight、optionPadding、menuPadding、optionSelectedColor。当前 Provider 的 Cascader Token 同步作用于触发器、独立浮层和 Panel,Select 组件覆盖不会越过组件职责覆盖 Cascader。
代码演示
基本 #
省市区级联;onChange 的第二个参数是选中项的 options 路径。
多选 #
multiple 开启多选;showCheckedStrategy 控制回填策略(SHOW_PARENT / SHOW_CHILD)。
搜索 #
showSearch 开启路径搜索;命中的叶子以 / 连接展示,关键词高亮。
选中即返回 #
changeOnSelect 让任意层级选择都触发 change(返回当前层级的路径)。
纯面板 #
CascaderPanel(= Cascader.Panel)只渲染级联列本身,常用于自定义容器内。
禁用选项 #
在 options 上设置 disabled: true 禁用父级或叶子节点;下方文本显示 change 事件的值路径。
默认值 #
default-value 传入值路径初始化选中项;点击按钮通过改变 key 重新挂载以恢复默认值。
自定义渲染 #
#optionRender 定制下拉选项内容,#displayRender 定制选中后的展示文案。
自定义字段名 #
field-names 将 name / id / items 映射为 label / value / children,change 的第二个参数可读回完整选项路径。
动态加载 #
isLeaf: false 的节点展开时触发 load-data,模拟异步补全 children 并显示已加载数量。
最大标签数 #
多选下用 max-tag-count 限制展示的标签数量,超出部分折叠为「+ N ...」。
弹出位置 #
用下拉框切换 placement,观察浮层在触发器上方/下方、左侧/右侧对齐的差异。
尺寸 #
size 支持 small / middle / large,选择后下方显示当前值路径。
状态 #
status 提供 error / warning 校验态,disabled 禁用整个选择器。
组件 Token #
通过 ConfigProvider.theme.components.Cascader 同步设置触发器与浮层的当前 Token,调整控件宽度、列宽、下拉高度、选中项配色与内边距;开关可对比默认 Token 与自定义 Token。
自定义下拉 #
通过 popupClassName、popupStyle 与 popupMenuColumnStyle 定制浮层的圆角、阴影、内边距和列背景;开关可切换默认与自定义样式。
自定义触发器 #
默认插槽内容会作为 raw trigger 替代内建输入框;这里用带图标和当前标签的按钮作为触发器,选择结果会实时回写到按钮文字。
勾选策略 #
多选时 showCheckedStrategy 决定回填值:SHOW_PARENT 向上收成父级路径,SHOW_CHILD 保留实际勾选的叶子路径;两组的回填文案会随选择同步变化。
语义化样式 #
用 classNames 给触发器根、后缀、内容、占位符和浮层列表挂语义类名,用 styles 注入内联样式;开关会切换圆角、背景、文字颜色与浮层列表样式。
绿色背景、文字与占位符使用成对的主题变量,在明暗外观下保留强调色与可读性。
后缀图标 #
通过 suffixIcon 替换默认箭头;下拉框可切换笑脸、定位与火箭三种本地图标,触发器的行为保持不变。
变体 #
variant 支持 outlined、borderless 与 filled 三种输入框形态;通过下拉框切换后可以观察边框与背景的即时变化。
悬停展开 #
expandTrigger 控制子级列的展开方式:hover 在指针移入父级选项时展开,click 则需要点击;下拉框可随时切换两种模式。
自定义面板 #
#popupRender="{ menu }" 接收级联面板 VNode,以 <component :is="menu" /> 渲染,并在其外层插入自定义头部与底部:头部显示面板标题,底部展示当前选择并提供清空按钮。