v0.1.9

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)。

加载中…

选中即返回 #

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" /> 渲染,并在其外层插入自定义头部与底部:头部显示面板标题,底部展示当前选择并提供清空按钮。

Powered by Vue 3 + ViteApollo Design · Vue NativeGitHub