跳转到正文

Select 选择器

用于单选类数据录入场景,支持键盘导航、可搜索、清空、Teleport 浮层定位和大数据量阈值虚拟滚动。

基础用法

常见场景

可搜索与清空

大数据量场景

当选项数量超过 virtualThreshold 时,组件会自动切换到轻量虚拟窗口,只渲染可视区域附近的 option。

禁用选项与空状态

接口说明

属性

名称类型默认值说明
modelValueSelectValuenull当前选中值。
optionsRecord<string, unknown>[][]选项数据源。
fieldNamesSelectFieldNames{}自定义 label/value/disabled 字段映射。
placeholderstring'请选择'占位内容。
clearablebooleanfalse是否允许清空。
filterablebooleanfalse是否允许输入关键字过滤。
disabledbooleanfalse是否禁用。
loadingbooleanfalse是否显示加载态。
emptyTextstring'暂无可选项'无数据文案。
teleportstring | HTMLElement | false'body'下拉层 Teleport 目标。
placement'bottom-start' | 'bottom-end' | 'top-start' | 'top-end''bottom-start'下拉层定位方向。
maxPanelHeightnumber256下拉面板最大高度。
virtualThresholdnumber80超过该阈值后启用虚拟滚动。

事件

名称类型说明
update:modelValue(value: SelectValue) => void选中值变化时触发。
change(value: SelectValue) => void用户选择新值或清空时触发。
visible-change(visible: boolean) => void下拉层显隐变化时触发。
clear(event: MouseEvent) => void点击清空按钮时触发。
search(keyword: string) => void可搜索模式下输入变化时触发。

插槽

名称类型说明
option({ option, active, selected, index }) => VNode[]自定义 option 内容。
empty() => VNode[]自定义空状态。

暴露方法

名称类型说明
focus() => void聚焦选择器。
blur() => void让选择器失焦。
open() => Promise<void>打开下拉层。
close() => void关闭下拉层。

设计说明

  • Select 内部分为触发器和下拉面板两个部分,关闭时不挂载面板,减少大列表和定位订阅的额外开销。
  • 下拉层定位基于 @floating-ui/vue,避免手写视口碰撞与边界修正逻辑,组件行为更稳定。
  • 键盘导航、禁用选项跳过、空状态和阈值虚拟滚动共同组成完整的数据录入体验。

基于 MIT 协议开源发布。