Skip to content

Cascader 级联选择

多级联动选择控件。每一列展示一级选项,点击非叶子节点自动展开下一级。v-model 是路径数组 [v1, v2, v3],输入框默认按 separator 拼接每级 label。

基本使用

options 是递归 children 的树结构,叶子节点点击后提交完整路径。

中间节点也可选 (changeOnSelect)

change-on-select 让任何一级都能触发提交,面板继续保持打开直到点击叶子或点击外部关闭。

自定义字段名 (fieldNames)

如果数据源字段不叫 label / value / children / disabled,用 fieldNames 映射。

禁用某项

在选项上设 disabled: true,整个节点不可点击;其子树仍可通过其他路径到达。

自定义路径展示

display-render 接收 (labels: string[], selectedOptions: CascaderOption[]),返回想要的展示文本。

三种尺寸

表单联动

放进 c-form-item 内时,status 会自动跟随 FormItem 的校验状态。

弹层容器

把面板挂到 document.body 或自定义容器,避开 overflow 滚动裁切。

hover 触发

expand-trigger="hover" 时,鼠标移到非叶子节点即展开下一列;hover 不触发 emit。

showSearch 搜索

show-search 时 input 可输入,面板换成扁平匹配列表;默认按 label includes 匹配,传 { filter } 可自定义。

搜索结果上限与排序 showSearch.limit / sort

show-search 还支持 limit(命中数上限,默认 50,超出后只渲染前 N 条)和 sort(命中结果排序器,签名同 Array.sort 比较器但多接 input)。例如「按命中节点 label 长度优先短的」帮助用户先看到精确匹配。

loadData 异步加载

非叶子节点用 isLeaf: false 显式标记,配合 loadData 在展开时拉取 children;加载中显示

空数据占位 notFoundContent

options 为空时显示自定义文案;不传则取 ConfigProvider locale(默认中文「暂无数据」)。

校验状态 status

status 支持 'error' / 'warning' / 'success' / 'validating',置于 <c-form-item> 时会自动继承。

不可清除 clearable=false

锁定已选路径,避免误清除。常用于「填了就不能撤」的关键字段(如归属部门)。

浮层方位 placement

placement 控制浮层四向起点,配合 popup-append-to-body 解决滚动容器内裁切。

自定义展开图标 expandIcon + 自动聚焦

expandIcon 替换默认 autoFocus 让组件挂载后立即聚焦输入框,常用于「打开弹窗后第一个表单项」场景。

multiple 多选

multiple 时叶子节点渲染 checkbox,勾选聚合写入;input wrap 展示 tag,点 × 移除。modelValueCascaderValuePath[]

tag 折叠 maxTagCount / max-tag-placeholder

多选超出 max-tag-count 时,多余 tag 折叠为「+N」摘要;#max-tag-placeholder slot 接 { omittedValues } 可自定义折叠文案。常用于一行 input 容纳不下的勾选列表场景(如「批量推送地区」表单字段)。

tag 文本截断 maxTagTextLength

max-tag-text-length 限制单个 tag 显示的最大字符数,超出末尾以 截断。适合「行政区全名过长」「角色名缩写」等场景。

键盘导航

输入框聚焦时可全键盘操作:

  • 关闭状态下:Enter / Space / 打开面板
  • 打开状态下:Esc / Tab 关闭面板
  • 列模式:↑ ↓ 在当前列移动 focus / 在非叶子上展开下一列 / 回到上一列 / Enter 选中
  • 搜索模式:↑ ↓ 在结果列表移动 / Enter 选中

自定义选项渲染 #option slot

#option slot 接 { option, path, index },替换列内每个 option 的 label 渲染区,可加图标、徽标、说明文字等。适合「显示部门 + 在编人数」「带状态点的地区列表」。

自定义面板容器 #popup slot

#popup slot 包裹整个 popup 内容,scope 暴露 default() 用于渲染默认面板(列 / 搜索结果)。常用于在面板顶部追加标题 / 操作条、底部追加说明。

自定义搜索结果 #search-option slot

#search-option{ option, path, query },控制搜索面板内每条结果的渲染。常配合 query 做命中关键字高亮。

Variants

录入组件统一 variant 形态。四档:outlined(默认)/ filled / borderless / underlined

API

Props

参数类型默认值说明
modelValue(string | number)[] | (string | number)[][] | null--单选:路径数组;多选:路径数组的数组
optionsCascaderOption[][]数据源(递归 children)
fieldNames{ label?, value?, children?, disabled? }{}字段名映射
placeholderstring请选择占位文案
separatorstring/默认 displayRender 的拼接符
displayRender(labels, selectedOptions) => string--自定义路径展示
changeOnSelectbooleanfalse中间节点也可选并提交
disabledbooleanfalse是否禁用
clearablebooleantrue是否显示清除按钮
size'small' | 'default' | 'large''default'输入框尺寸
status'' | 'error' | 'warning' | ...''校验状态;置于 FormItem 时自动继承
placement'bottomLeft' | 'bottomRight' | 'topLeft' | 'topRight''bottomLeft'浮层方位
popupClassNamestring--浮层根元素自定义 class
popupAppendToBodybooleanfalse是否把浮层 Teleport 到 document.body
getPopupContainer(trigger: HTMLElement | null) => HTMLElement | null--自定义浮层挂载点
autoFocusbooleanfalse挂载后自动 focus 输入框
inputReadOnlybooleantrue输入框只读
transitionNamestringccui-cascader-fade浮层过渡名
expandIconstring非叶子节点的展开图标
notFoundContentstring暂无数据空数据文案
expandTrigger'click' | 'hover''click'列展开触发方式
multiplebooleanfalse多选模式,modelValue 类型变为路径数组的数组
maxTagCountnumber0多选时 tag 最多显示数,超出折叠为「+N」摘要;0 表示不折叠
maxTagTextLengthnumber0单个 tag 显示的最大字符数,超出末尾以 截断;0 不截断
showSearchboolean | { filter?, sort?, limit? }false启用搜索;对象形态支持 filter / sort / limit(默认 50)
loadData(path: CascaderOption[]) => Promise<void> | void--异步加载非叶子 children;option 用 isLeaf:false 显式标记

Events

事件名回调签名触发时机
update:modelValue(value: (string | number)[] | null)路径提交或清除时
change(value, selectedOptions: CascaderOption[])路径提交或清除时(带原始节点路径)
popup-visible-change(open: boolean)浮层打开 / 关闭时
focus--输入框聚焦
blur--输入框失焦

Slots

名称scope说明
option{ option, path, index }自定义列内 option 渲染
popup{ default: () => VNode }包裹整个浮层内容;调用 default() 渲染默认面板
search-option{ option, path, query }自定义搜索结果项渲染
max-tag-placeholder{ omittedValues: CascaderValuePath[] }多选 maxTagCount 折叠摘要 tag 内容
expandIcon{ item, level }非叶子节点展开箭头
suffixIcon--输入框后缀图标
clearIcon--清除按钮图标
removeIcon--多选 tag 删除图标

顶层常量

showCheckedStrategy 的取值常量:不挂命名空间,从 @vaebe/ccui 顶层 export。

ts
import { CASCADER_SHOW_CHILD, CASCADER_SHOW_PARENT } from '@vaebe/ccui'

// CASCADER_SHOW_CHILD === 'SHOW_CHILD'
// CASCADER_SHOW_PARENT === 'SHOW_PARENT'
常量说明
CASCADER_SHOW_CHILDshowCheckedStrategy 取值:只输出最末级叶子节点(默认)
CASCADER_SHOW_PARENTshowCheckedStrategy 取值:父节点全部子节点都选中时只输出父节点

当前 Cascader 尚未接入 showCheckedStrategy 这条 API;常量先 export 出去,方便外部代码提前引用,待后续接入实际逻辑时直接对接。

已知限制(未交付)

  • showCheckedStrategy:multiple 模式下当前为「all」语义(每条勾选路径独立提交),未提供 parent / child 折叠策略。常量符号已顶层 export,未来接入实际逻辑后即可直接使用。

Released under the MIT License.