WCascader 组件
级联选择器组件,基于 WinDesignNext Cascader 封装,用于在多级数据中进行选择(如省市区、科室层级等),支持数据绑定和事件响应。
默认返回完整路径:
props.emitPath默认为true,modelValue绑定值为选中路径数组(如["zhejiang", "hangzhou", "xihu"])。若只需末级 value,设置props: { "emitPath": false }。
基础用法
Props API
| 属性名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
id | string | - | 组件唯一标识(必填) |
component | string | WCascader | 组件类型(必填) |
modelValue | object | - | 绑定值(A2UI 数据绑定,支持 path) |
options | array | [] | 静态选项列表,与 dataSource 二选一 |
dataSource | string | - | 数据源路径,从 dataModel 动态加载选项 |
props | object | - | 级联面板配置(支持 path),见下方说明 |
separator | string/object | / | 各级选中项之间的分隔符(支持 path) |
size | string | default | 输入框尺寸 |
disabled | boolean | false | 是否禁用 |
clearable | boolean | false | 是否可清空 |
filterable | boolean | false | 是否可搜索 |
placeholder | string | - | 占位文本 |
showAllLevels | boolean | true | 输入框是否显示完整路径 |
collapseTags | boolean | false | 多选时是否折叠标签 |
maxCollapseTags | number | 1 | 折叠标签最大显示数量 |
collapseTagsTooltip | boolean | false | 折叠标签是否显示 tooltip |
debounce | number | 300 | 搜索防抖延迟(毫秒) |
placement | string | bottom-start | 下拉弹出位置 |
teleported | boolean | true | 下拉层是否挂载到 body |
popperClass | string | - | 下拉层自定义 CSS 类名 |
effect | string | light | Tooltip 主题 |
tagType | string | info | 多选标签类型 |
tagEffect | string | light | 多选标签主题 |
validateEvent | boolean | true | 是否触发表单验证 |
persistent | boolean | true | 面板关闭后是否保留 DOM |
checkAll | boolean | false | 多选时是否显示全选 |
showCheckedStrategy | string | parent | 多选标签显示策略 |
checkOnClickNode | boolean | false | 点击节点是否选中 |
showPrefix | boolean | true | 多选时是否显示前缀图标 |
action | object | - | A2UI v0.9 事件定义 |
path 支持说明
通用绑定格式见 path 数据绑定速查。
| 属性 | 支持 path | 说明 |
|---|---|---|
modelValue | ✅ | 双向绑定选中值(路径数组或末级 value) |
props | ✅ | 动态控制面板行为(multiple、emitPath 等) |
separator | ✅ | 动态控制显示分隔符 |
dataSource | ✅ | 字符串路径,从 dataModel 加载选项树 |
action.event.context[].value | ✅ | 事件上下文可引用 dataModel |
action.event.api.constParams[].value | ✅ | API 固定参数可引用 dataModel |
options / placeholder / filterable 等 | ❌ | 静态配置;选项动态加载请用 dataSource |
options 选项配置
options 为树形数组,每项包含:
json
{
"value": "zhejiang",
"label": "浙江",
"children": [
{
"value": "hangzhou",
"label": "杭州",
"children": [
{ "value": "xihu", "label": "西湖区" }
]
}
]
}| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
value | string/number/object | 是 | 当前节点唯一标识 |
label | string | 是 | 显示文本 |
children | array | 否 | 子级选项数组 |
disabled | boolean | 否 | 是否禁用该节点 |
leaf | boolean | 否 | 是否为叶子节点(懒加载场景) |
props 面板配置
对应 WinDesignNext Cascader 的 props 属性,控制级联面板行为:
json
{
"props": {
"expandTrigger": "click",
"multiple": false,
"checkStrictly": false,
"emitPath": true,
"value": "value",
"label": "label",
"children": "children"
}
}| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
expandTrigger | click/hover | click | 次级菜单展开方式 |
multiple | boolean | false | 是否多选 |
checkStrictly | boolean | false | 是否可选择任意一级(父子不关联) |
emitPath | boolean | true | 绑定值是否返回完整路径数组 |
value | string | value | options 中 value 字段名 |
label | string | label | options 中 label 字段名 |
children | string | children | options 中 children 字段名 |
checkOnClickNode | boolean | false | 点击节点是否选中(多选) |
checkOnClickLeaf | boolean | true | 点击叶子节点是否选中 |
props path 绑定示例:
json
{
"props": { "path": "/cascaderPanelProps" },
"modelValue": { "path": "/region" }
}通过 updateDataModel 动态切换多选模式:
json
{
"version": "v0.9",
"updateDataModel": {
"surfaceId": "main",
"path": "/cascaderPanelProps",
"value": { "multiple": true, "emitPath": true, "checkStrictly": true }
}
}modelValue 数据绑定
modelValue 将选中值绑定到 dataModel,选中结果写回对应 path。
json
// 默认 emitPath: true,绑定值为路径数组
{ "modelValue": { "path": "/region" } }
// emitPath: false,绑定值为末级 value
{
"props": { "emitPath": false },
"modelValue": { "path": "/districtCode" }
}
// 多选,绑定值为路径数组的数组
{
"props": { "multiple": true },
"modelValue": { "path": "/selectedRegions" }
}modelValue 绑定规则:
- 默认
emitPath: true时,绑定值为 字符串/数字数组(完整路径) emitPath: false时,绑定值为 末级节点的 value- 多选时,绑定值为 数组的数组(每个选中项一条路径)
- 可通过
literalArray设置初始值:{ "literalArray": ["zhejiang", "hangzhou", "xihu"] }
dataSource 动态选项
与 WSelect 类似,通过 dataSource 从 dataModel 加载选项树:
json
{
"id": "cascader_dept",
"component": "WCascader",
"dataSource": "/deptOptions",
"placeholder": "请选择科室",
"clearable": true,
"modelValue": { "path": "/selectedDeptPath" },
"action": {
"event": {
"name": "onDeptChange",
"context": [{ "key": "deptPath", "value": { "path": "/selectedDeptPath" } }]
}
}
}配合 updateDataModel 初始化数据和选项:
json
{
"version": "v0.9",
"updateDataModel": {
"surfaceId": "main",
"path": "/",
"value": {
"selectedDeptPath": ["hospital", "internal", "cardiology"],
"deptOptions": [
{
"value": "hospital",
"label": "总院",
"children": [
{
"value": "internal",
"label": "内科",
"children": [
{ "value": "cardiology", "label": "心内科" }
]
}
]
}
]
}
}
}action 定义
选中项变化时触发 change 事件(可通过 action.event.type 覆盖):
json
{
"action": {
"event": {
"name": "onRegionChange",
"type": "change",
"context": [
{ "key": "region", "value": { "path": "/region" } }
]
}
}
}数据同步机制
WCascader 在用户确认选择后会自动将值同步到 dataModel,流程与 WInput、WSelect 一致:
- Agent 发送
updateComponents定义组件,modelValue.path指向 dataModel 路径 - Agent 发送
updateDataModel初始化选项和选中值 - 用户选择后,渲染器自动调用
setData更新 dataModel - 若配置了
action,同时触发 A2UI 事件
使用场景
| 场景 | 推荐配置 |
|---|---|
| 省市区选择 | 静态 options + modelValue.path |
| 科室/组织层级 | dataSource 动态加载 + modelValue.path |
| 多选标签 | props: { "multiple": true } |
| 任意级可选 | props: { "checkStrictly": true } |
| 仅存储末级 code | props: { "emitPath": false } |
| 可搜索 | filterable: true |
注意事项
- A2UI JSON 不支持函数类型属性,
lazyLoad、filterMethod、beforeFilter等回调无法在 JSON 中配置 props在 A2UI 协议中表示级联面板配置,与 Vue 组件 props 概念相同但独立于modelValue- 选项字段名默认
value/label/children,若后端数据结构不同,通过props配置字段映射