Skip to content

Cascader 级联选择器

当一个数据集合有清晰的层级结构时,可以通过级联选择器逐级查看并选择。VISTA B 直接使用 Element Plus 的 el-cascader,样式沿用组件库,适合项目分类、区域层级、素材目录、户型层级等有父子关系的数据选择。

基础用法

options 指定选项数组即可渲染级联选择器。默认点击展开子级,也可以通过 props.expandTrigger 改为鼠标悬停展开。

vue
<script setup>
import { ref } from 'vue'

const value = ref([])
const options = [
  {
    value: 'project',
    label: '项目管理',
    children: [
      {
        value: 'active',
        label: '进行中项目',
        children: [
          { value: 'detail', label: '项目详情' },
          { value: 'quote', label: '报价配置' }
        ]
      }
    ]
  }
]

const props = {
  expandTrigger: 'hover'
}
</script>

<template>
  <el-cascader v-model="value" :options="options" :props="props" />
</template>

禁用选项

在选项中设置 disabled: true 后,该项及其子级不能被选择。默认字段名为 disabled,也可以通过 props.disabled 改成业务里的其他字段。

vue
<el-cascader :options="options" />

<script setup>
const options = [
  {
    value: 'project',
    label: '项目管理',
    children: [
      { value: 'active', label: '进行中项目' },
      { value: 'archive', label: '归档项目', disabled: true }
    ]
  }
]
</script>

可清空

设置 clearable 后,输入框右侧会显示清空按钮,适合筛选表单和可选条件。

vue
<el-cascader
  v-model="value"
  :options="options"
  clearable
/>

仅显示最后一级

默认情况下,输入框会显示完整路径。设置 show-all-levels="false" 后,只展示最后一级标签。

vue
<el-cascader
  v-model="value"
  :options="options"
  :show-all-levels="false"
/>

多选

设置 props.multiple 后,可以选择多个节点。多选模式可配合 collapse-tags 收起已选标签,避免输入框过长。

vue
<script setup>
const props = {
  multiple: true
}
</script>

<template>
  <el-cascader
    v-model="value"
    :options="options"
    :props="props"
    collapse-tags
    collapse-tags-tooltip
  />
</template>

选择任意一级

设置 props.checkStrictly 后,父子节点不再关联,用户可以选择任意一级节点。它也可以和多选一起使用。

vue
<script setup>
const props = {
  checkStrictly: true
}
</script>

<template>
  <el-cascader v-model="value" :options="options" :props="props" />
</template>

动态加载

设置 props.lazy 后,可以在展开节点时动态加载子级。lazyLoad 接收当前节点和 resolve 回调,调用 resolve(nodes) 后追加子节点。

vue
<script setup>
const props = {
  lazy: true,
  lazyLoad(node, resolve) {
    const { level } = node
    setTimeout(() => {
      const nodes = Array.from({ length: level + 1 }).map((_, index) => ({
        value: `${level}-${index}`,
        label: `选项 ${level}-${index}`,
        leaf: level >= 2
      }))
      resolve(nodes)
    }, 500)
  }
}
</script>

<template>
  <el-cascader :props="props" />
</template>

可搜索

设置 filterable 后,可以搜索选项。默认匹配节点的 label,如需业务自定义匹配逻辑,可使用 filter-method

vue
<el-cascader
  v-model="value"
  :options="options"
  filterable
  clearable
/>

自定义节点内容

通过默认插槽可以拿到 nodedata,用于展示数量、状态或其他业务信息。

vue
<el-cascader :options="options">
  <template #default="{ node, data }">
    <span>{{ data.label }}</span>
    <span v-if="!node.isLeaf">({{ data.children.length }})</span>
  </template>
</el-cascader>

级联面板

如果只需要级联选择面板,不需要输入框触发器,可以直接使用 el-cascader-panel

vue
<el-cascader-panel
  v-model="value"
  :options="options"
/>

API

Cascader 属性

属性说明类型默认值
model-value / v-model选中项绑定值string / number / array
options可选项数据源array[]
props配置选项,见 CascaderPropsobject
size输入框尺寸large / default / small
placeholder输入框占位文本stringSelect
disabled是否禁用booleanfalse
clearable是否支持清空选项booleanfalse
show-all-levels输入框中是否显示完整路径booleantrue
collapse-tags多选模式下是否折叠标签booleanfalse
collapse-tags-tooltip折叠标签时是否显示提示booleanfalse
max-collapse-tags折叠前最多显示的标签数量number1
separator选项分隔符string/
filterable是否可搜索选项booleanfalse
filter-method自定义搜索方法(node, keyword) => boolean
debounce搜索防抖延迟,单位毫秒number300
before-filter搜索前的钩子,返回 false 或 rejected Promise 时取消搜索(keyword) => boolean / Promise
popper-class下拉弹层自定义类名string''
teleported下拉弹层是否挂载到 bodybooleantrue
tag-type标签类型success / info / warning / dangerinfo
tag-effect标签主题light / dark / plainlight
validate-event输入时是否触发表单校验booleantrue
persistent下拉框未显示时是否保留 DOMbooleantrue

CascaderProps

属性说明类型默认值
expandTrigger展开次级菜单的触发方式click / hoverclick
multiple是否多选booleanfalse
checkStrictly是否严格遵守父子节点不互相关联booleanfalse
emitPath选中节点的值是否包含完整路径booleantrue
lazy是否动态加载子节点booleanfalse
lazyLoad动态加载子节点的方法(node, resolve) => void
value指定选项值的字段名stringvalue
label指定选项标签的字段名stringlabel
children指定选项子节点的字段名stringchildren
disabled指定禁用状态的字段名stringdisabled
leaf指定叶子节点状态的字段名stringleaf
hoverThreshold悬停展开的延迟,单位毫秒number500
checkOnClickNode是否点击节点文本时选中节点booleanfalse
checkOnClickLeaf是否点击叶子节点文本时选中节点booleantrue

Cascader 事件

事件名说明类型
change选中节点变化时触发(value) => void
expand-change展开节点变化时触发(value) => void
blur组件失去焦点时触发(event: FocusEvent) => void
focus组件获得焦点时触发(event: FocusEvent) => void
visible-change下拉框显示或隐藏时触发(visible: boolean) => void
remove-tag多选模式下移除标签时触发(value) => void

Cascader 方法

方法名说明类型
getCheckedNodes获取当前选中的节点(leafOnly: boolean) => Node[]
cascaderPanelRef级联面板实例object
togglePopperVisible切换下拉框显示状态(visible?: boolean) => void

Cascader 插槽

插槽说明
default自定义节点内容,参数为 { node, data }
empty无匹配选项时的内容
prefix输入框前缀内容
tag多选模式下自定义标签内容

CascaderPanel 属性

属性说明类型默认值
model-value / v-model选中项绑定值string / number / array
options可选项数据源array[]
props配置选项,同 CascaderPropsobject

CascaderPanel 事件

事件名说明类型
change选中节点变化时触发(value) => void
expand-change展开节点变化时触发(value) => void
close面板关闭时触发() => void

CascaderPanel 方法

方法名说明类型
getCheckedNodes获取当前选中的节点(leafOnly: boolean) => Node[]
clearCheckedNodes清空已选节点() => void

HOMEVISTA 设计规范