Skip to content

Select 选择器

当选项较多时,使用下拉菜单承载候选项,帮助用户在有限空间内完成单选、多选、搜索或远程检索。

基础用法

使用 v-model 绑定当前选中值,通过 el-option 配置候选项。label 用于展示文本,value 用于表单提交值。

请选择模块
vue
<template>
  <el-select v-model="value" placeholder="请选择模块" style="width: 240px">
    <el-option
      v-for="item in options"
      :key="item.value"
      :label="item.label"
      :value="item.value"
      :disabled="item.disabled"
    />
  </el-select>
</template>

<script setup lang="ts">
import { ref } from 'vue'

const value = ref('')

const options = [
  { value: 'project', label: '项目管理' },
  { value: 'quote', label: '报价配置' },
  { value: 'material', label: '素材管理' },
  { value: 'archive', label: '归档数据', disabled: true },
]
</script>

禁用状态

el-select 设置 disabled 可以禁用整个选择器;为单个 el-option 设置 disabled 可以禁用某个选项。

禁用选项
禁用选择器
vue
<template>
  <el-select v-model="value" placeholder="禁用选项">
    <el-option label="项目管理" value="project" />
    <el-option label="归档数据" value="archive" disabled />
  </el-select>

  <el-select v-model="value" disabled placeholder="禁用选择器">
    <el-option label="项目管理" value="project" />
  </el-select>
</template>

可清空

设置 clearable 后,选择器会在有值时显示清除按钮。可以通过 clear-icon 替换清除图标。

vue
<template>
  <el-select v-model="value" clearable placeholder="可清空">
    <el-option label="项目管理" value="project" />
    <el-option label="报价配置" value="quote" />
  </el-select>

  <el-select v-model="iconValue" clearable :clear-icon="CircleClose" placeholder="自定义清除图标">
    <el-option label="项目管理" value="project" />
    <el-option label="报价配置" value="quote" />
  </el-select>
</template>

<script setup lang="ts">
import { ref } from 'vue'
import { CircleClose } from '@element-plus/icons-vue'

const value = ref('')
const iconValue = ref('')
</script>

多选

设置 multiple 可以开启多选,此时绑定值应为数组。multiple-limit 可限制最多选择数量。

vue
<template>
  <el-select v-model="value" multiple :multiple-limit="3" placeholder="请选择模块">
    <el-option
      v-for="item in options"
      :key="item.value"
      :label="item.label"
      :value="item.value"
    />
  </el-select>
</template>

<script setup lang="ts">
import { ref } from 'vue'

const value = ref(['project', 'quote'])
</script>

折叠标签

多选时可设置 collapse-tags 折叠已选标签;配合 collapse-tags-tooltipmax-collapse-tags 控制折叠后的提示与展示数量。

vue
<template>
  <el-select
    v-model="value"
    multiple
    collapse-tags
    collapse-tags-tooltip
    :max-collapse-tags="2"
    placeholder="折叠标签"
  >
    <el-option label="项目管理" value="project" />
    <el-option label="报价配置" value="quote" />
    <el-option label="素材管理" value="material" />
  </el-select>
</template>

自定义选项

el-option 默认插槽可自定义下拉项内容,适合展示辅助信息、状态或图标。

自定义选项
vue
<template>
  <el-select v-model="value" placeholder="自定义选项">
    <el-option
      v-for="item in options"
      :key="item.value"
      :label="item.label"
      :value="item.value"
    >
      <span style="float: left">{{ item.label }}</span>
      <span style="float: right; color: var(--vista-text-muted); font-size: 13px">
        {{ item.value }}
      </span>
    </el-option>
  </el-select>
</template>

分组选项

使用 el-option-group 可以将选项按业务维度分组,便于用户快速定位。

请选择功能
vue
<template>
  <el-select v-model="value" placeholder="请选择功能">
    <el-option-group
      v-for="group in groupedOptions"
      :key="group.label"
      :label="group.label"
    >
      <el-option
        v-for="item in group.options"
        :key="item.value"
        :label="item.label"
        :value="item.value"
      />
    </el-option-group>
  </el-select>
</template>

可筛选

设置 filterable 后,选择器支持按输入内容筛选本地选项。可通过 filter-method 自定义筛选逻辑。

搜索模块
vue
<template>
  <el-select v-model="value" filterable clearable placeholder="搜索模块">
    <el-option
      v-for="item in options"
      :key="item.value"
      :label="item.label"
      :value="item.value"
    />
  </el-select>
</template>

远程搜索

设置 filterableremoteremote-method 后,可在输入时请求远程数据。loading 用于展示加载状态。

输入关键字搜索
vue
<template>
  <el-select
    v-model="value"
    filterable
    remote
    reserve-keyword
    clearable
    placeholder="输入关键字搜索"
    :remote-method="remoteMethod"
    :loading="loading"
  >
    <el-option
      v-for="item in remoteOptions"
      :key="item.value"
      :label="item.label"
      :value="item.value"
    />
  </el-select>
</template>

<script setup lang="ts">
import { ref } from 'vue'

const value = ref('')
const loading = ref(false)
const remoteOptions = ref([])

const remoteMethod = (query: string) => {
  if (!query) {
    remoteOptions.value = []
    return
  }
  loading.value = true
  setTimeout(() => {
    loading.value = false
    remoteOptions.value = options.filter((item) =>
      item.label.toLowerCase().includes(query.toLowerCase()),
    )
  }, 250)
}
</script>

创建新条目

allow-create 允许用户输入并创建不存在的选项,通常与 filterable 配合使用。

输入并创建标签
vue
<template>
  <el-select
    v-model="value"
    filterable
    allow-create
    default-first-option
    clearable
    placeholder="输入并创建标签"
  >
    <el-option label="项目管理" value="project" />
    <el-option label="报价配置" value="quote" />
  </el-select>
</template>

前缀内容

通过 prefix 插槽可以在输入区域前侧展示图标或文本,帮助用户理解选择器用途。

搜索业务模块
vue
<template>
  <el-select v-model="value" clearable placeholder="搜索业务模块">
    <template #prefix>
      <el-icon><Search /></el-icon>
    </template>
    <el-option label="项目管理" value="project" />
    <el-option label="报价配置" value="quote" />
  </el-select>
</template>

使用 options

可以通过 options 直接传入数据源,并使用 props 指定字段映射,减少模板中的重复 el-option

options 快捷配置
vue
<template>
  <el-select
    v-model="value"
    :options="options"
    :props="{ label: 'name', value: 'id', disabled: 'disabled' }"
    placeholder="options 快捷配置"
  />
</template>

页眉页脚

通过 headerfooter 插槽可以在下拉面板顶部或底部放置辅助操作。

选择模块
vue
<template>
  <el-select v-model="value" placeholder="选择模块">
    <template #header>
      <div>常用模块</div>
    </template>

    <el-option label="项目管理" value="project" />
    <el-option label="报价配置" value="quote" />

    <template #footer>
      <el-button text type="primary" size="small">新增模块</el-button>
    </template>
  </el-select>
</template>

加载与空状态

loading 可展示加载状态;emptyloading 插槽可以自定义无数据和加载时的面板内容。

加载中
无数据
vue
<template>
  <el-select v-model="loadingValue" loading loading-text="加载模块中" placeholder="加载中" />

  <el-select v-model="emptyValue" placeholder="无数据">
    <template #empty>
      <div>暂无可选模块</div>
    </template>
  </el-select>
</template>

不同尺寸

size 支持 largedefaultsmall 三种尺寸,用于适配不同密度的表单和工具栏场景。

Large
Default
Small
vue
<template>
  <el-select v-model="large" size="large" placeholder="Large" />
  <el-select v-model="defaultValue" placeholder="Default" />
  <el-select v-model="small" size="small" placeholder="Small" />
</template>

Select API

Select 属性

属性名说明类型默认值
model-value / v-model绑定值,单选为基础类型或对象,多选为数组string | number | boolean | object | array''
multiple是否多选booleanfalse
disabled是否禁用booleanfalse
value-key作为 value 唯一标识的键名,绑定值为对象时必填stringvalue
size输入框尺寸enumdefault
clearable是否可以清空选项booleanfalse
collapse-tags多选时是否折叠标签booleanfalse
collapse-tags-tooltip折叠标签时是否通过 tooltip 展示全部标签booleanfalse
max-collapse-tags需要展示的标签最大数量number1
multiple-limit多选时用户最多可以选择的项目数,0 表示不限制number0
name原生 input 的 name 属性string''
effecttooltip 主题enumlight
autocomplete原生 input 的 autocomplete 属性stringoff
placeholder占位文本string请选择
filterable是否可筛选booleanfalse
allow-create是否允许创建新条目,需配合 filterable 使用booleanfalse
filter-method自定义筛选方法function-
remote是否启用远程搜索booleanfalse
remote-method远程搜索方法function-
remote-show-suffix远程搜索时是否显示后缀图标booleanfalse
loading是否正在加载数据booleanfalse
loading-text加载时显示的文本string加载中
no-match-text搜索条件无匹配时显示的文本string无匹配数据
no-data-text无选项时显示的文本string无数据
popper-class下拉菜单的自定义类名string''
reserve-keyword多选且可筛选时,选中后是否保留当前搜索关键词booleantrue
default-first-option输入后按回车是否选择第一个匹配项,需配合 filterableremote 使用booleanfalse
teleported下拉菜单是否插入至 bodybooleantrue
persistent下拉菜单不展示时是否保留 DOMbooleantrue
automatic-dropdown输入框获得焦点后是否自动弹出下拉菜单booleanfalse
clear-icon自定义清除图标组件string | componentCircleClose
fit-input-width下拉框宽度是否与输入框相同booleanfalse
suffix-icon自定义后缀图标组件string | componentArrowDown
tag-type多选标签类型enuminfo
tag-effect多选标签主题enumlight
validate-event输入时是否触发表单校验booleantrue
placement下拉框出现的位置enumbottom-start
fallback-placements下拉框可用的备用位置array['bottom-start', 'top-start', 'right', 'left']
popper-optionspopper.js 参数object{}
aria-label等价于原生 input aria-label 属性string-
empty-values组件的空值配置array-
value-on-clear清空时设置的值string | number | boolean | function-
options选项数据源array[]
propsoptions 字段映射配置object-

Select 事件

事件名说明类型
change选中值变化时触发Function
visible-change下拉框显示状态变化时触发Function
remove-tag多选模式下移除标签时触发Function
clear点击清空按钮时触发Function
blur组件失去焦点时触发Function
focus组件获得焦点时触发Function
popup-scroll下拉滚动时触发Function

Select 插槽

插槽名说明
defaultOption 组件列表
prefix输入框前缀内容
empty无选项时的内容
tag自定义多选标签内容
loading自定义加载中内容
header下拉面板头部内容
footer下拉面板底部内容
label自定义已选中项的展示内容

Select 暴露

名称说明类型
focus使选择器获得焦点Function
blur使选择器失去焦点Function
selectedLabel当前选中的标签文本object

Option API

Option 属性

属性名说明类型默认值
value选项的值string | number | boolean | object-
label选项展示文本,未设置时默认与 value 相同string | number-
disabled是否禁用该选项booleanfalse
created是否为用户创建的选项booleanfalse

Option 插槽

插槽名说明
default自定义选项内容

Option Group API

Option Group 属性

属性名说明类型默认值
label分组名称string-
disabled是否禁用该分组下所有选项booleanfalse

Option Group 插槽

插槽名说明
defaultOption 组件列表

HOMEVISTA 设计规范