Skip to content

Select 选择器 ​

当选项过多时,使用下拉菜单展示并选择内容。

基础用法 ​

请选择
选中: (未选)
vue
<my-select v-model="value" :options="options" placeholder="请选择" />

多选 ​

multiple 属性开启多选模式。

多选城市
0 项
vue
<my-select v-model="value" :options="options" multiple placeholder="多选" />

带描述 ​

每个选项支持 description 副标题。

上海
vue
const options = [
  { label: '北京', value: 'bj', description: '华北' },
  { label: '上海', value: 'sh', description: '华东' },
  { label: '广州', value: 'gz', description: '华南' },
]
<my-select v-model="value" :options="options" />

分区 / 分组 ​

使用 groups 属性实现选项分组。

选择地区城市
(未选)
vue
const groups = [
  { label: '华北地区', options: [
    { label: '北京', value: 'bj' },
    { label: '天津', value: 'tj' },
  ]},
  { label: '华东地区', options: [
    { label: '上海', value: 'sh' },
    { label: '杭州', value: 'hz' },
  ]},
]
<my-select v-model="value" :groups="groups" />

禁用选项 ​

在选项上设置 disabled: true。

有禁用项的列表
vue
const options = [
  { label: '可用', value: 'a' },
  { label: '禁用', value: 'b', disabled: true },
]
<my-select v-model="value" :options="options" />

自定义指示器 ​

通过 #indicator 插槽替换选中标记。

上海
vue
<my-select v-model="value" :options="options">
  <template #indicator>
    <span style="color:#ee5a24;">✓</span>
  </template>
</my-select>

必填 ​

*必填项
vue
<my-select v-model="value" :options="options" required placeholder="必填项" />

全宽 ​

全宽选择器
vue
<my-select v-model="value" :options="options" full-width />

自定义展示 — 用户头像 ​

每项配置 avatarUrl 头像地址,选项前显示真实头像,配合 description 展示邮箱等辅助信息。

请选择用户
选中: (未选)
vue
const options = [
  { label: 'Bob', value: '1', avatarUrl: 'https://...', description: 'bob@heroui.com' },
  { label: 'Fred', value: '2', avatarUrl: 'https://...', description: 'fred@heroui.com' },
]
<my-select v-model="value" :options="options" />

自定义展示 — Apple 渐变圆点 ​

每项配置 gradient 渐变色数组,选项前显示渐变圆点,选中后也同步显示。

选个颜色
vue
// 每个选项自带渐变圆点
const options = [
  { label: '红色', value: 'red', gradient: ['#ff6b6b', '#ee5a24'] },
  { label: '橙色', value: 'orange', gradient: ['#feca57', '#ff9f43'] },
  { label: '绿色', value: 'green', gradient: ['#2ed573', '#7bed9f'] },
  { label: '蓝色', value: 'blue', gradient: ['#54a0ff', '#2e86de'] },
  { label: '紫色', value: 'purple', gradient: ['#a29bfe', '#6c5ce7'] },
  { label: '粉色', value: 'pink', gradient: ['#fd79a8', '#e84393'] },
]
<my-select v-model="value" :options="options" />

受控 / 受控多选 ​

完全受控的 modelValue。

单选受控:
上海
多选受控:
北京 上海
vue
<!-- 完全受控 -->
<my-select v-model="value" :options="options" />
<my-button @click="value = 'gz'">设为广州</my-button>

<!-- 多选受控 -->
<my-select v-model="value" :options="options" multiple />
<my-button @click="value = ['bj', 'sh']">设为京+沪</my-button>

受控展开状态 ​

通过 visible + @update:visible 控制下拉展开。

上海
vue
<my-select
  v-model="value"
  :options="options"
  :visible="open"
  @update:visible="open = $event"
/>
<my-button @click="open = !open">切换</my-button>

异步加载 ​

remote + remoteMethod + loading 实现远程搜索。

输入关键字搜索
vue
<my-select
  v-model="value"
  :options="remoteOptions"
  :loading="loading"
  :remote="true"
  :remote-method="handleSearch"
  filterable
  placeholder="输入关键字搜索"
/>

禁用状态 ​

北京
北京 上海
vue
<my-select v-model="value" :options="options" disabled />

组件结构 ​

根元素 <div class="my-select"> 包含:触发器 __trigger(内部有必填星号 __star、多选标签 __tags 或单选值 __value、占位文字 __placeholder、后缀区 __suffix),以及下拉菜单 __dropdown(可选筛选框 __filter,以及分组 __group 或平铺选项 __option)。

CSS 类名 ​

类名说明
.my-select根元素
.is-full-width全宽模式
.is-large大尺寸
.is-small小尺寸
.is-disabled禁用状态
.is-active展开状态
.is-multiple多选模式
.is-loading加载状态
.is-required必填状态
.my-select__star必填星号
.my-select__trigger触发器容器
.my-select__placeholder占位文字
.my-select__value单选选中值
.my-select__tags多选标签列表
.my-select__tag多选标签项
.my-select__tag-close标签移除按钮
.my-select__suffix后缀图标区
.my-select__arrow下拉箭头
.is-reverse箭头翻转(展开时)
.my-select__clear清空按钮
.my-select__loading加载旋转图标
.my-select__dropdown下拉面板
.my-select__filter筛选输入框容器
.my-select__filter-input筛选输入框
.my-select__group选项分组
.my-select__group-label分组标题
.my-select__option选项
.is-selected已选中
.my-select__option-content选项内容区
.my-select__option-label选项文字
.my-select__option-desc选项描述
.my-select__avatar选项头像
.my-select__dot选项渐变圆点
.my-select__check选中标记对勾
.my-select__empty空数据提示

API ​

属性说明类型默认值
modelValue绑定值string | number | (string | number)[]—
options选项列表SelectOption[][]
groups分组选项SelectGroup[][]
placeholder占位文字string'请选择'
multiple是否多选booleanfalse
disabled是否禁用booleanfalse
clearable是否可清空booleanfalse
filterable是否可筛选booleanfalse
required是否必填booleanfalse
fullWidth是否全宽booleanfalse
loading是否加载中booleanfalse
remote是否远程搜索booleanfalse
remoteMethod远程搜索方法(query: string) => Promise<SelectOption[]>—
visible受控展开状态boolean—
size尺寸'large' | 'default' | 'small''default'
ts
interface SelectOption {
  label: string
  value: string | number
  disabled?: boolean
  description?: string       // 描述副标题
  gradient?: string[]        // 渐变圆点色值 ["#ff6b6b", "#ee5a24"]
  avatarUrl?: string         // 头像图片地址,优先级高于 gradient
  fallback?: string          // 头像加载失败时的备用文字(如首字母)
}

interface SelectGroup {
  label: string
  options: SelectOption[]
}
事件说明
update:modelValue值变更
change选中值变更
visible-change展开状态变更
remove-tag多选标签移除
update:visible受控展开
插槽说明
indicator自定义选中指示器