Skip to content

Select 选择器

下拉选择器组件,用于从一组选项中选择一个值。

名称分类说明类型默认值
ghost? 风格幽灵样式,无边框和阴影booleanfalse
color? 风格选择器颜色,支持预设主题色或自定义十六进制色值'primary' | 'success' | 'warning' | 'danger' | 'info' | string
size? 尺寸选择器尺寸'large' | 'small'
disabled? 状态是否禁用booleanfalse
Optiondisabled? 状态是否禁用booleanfalse
clearable? 行为是否可清空booleanfalse
filterable? 行为是否可搜索booleanfalse
filter-method? 行为自定义筛选方法(query: string) => SelectOptionProps[]
remote? 行为是否启用远程搜索booleanfalse
remote-method? 行为远程搜索方法(query: string) => Promise<SelectOptionProps[]>
id? 行为输入框的原生 id 属性string
model-value / v-model? 内容绑定值string | number
options? 内容选项数组,与插槽方式二选一SelectOptionProps[][]
placeholder? 内容占位符string'Select'
render-label? 内容自定义选项渲染函数(option: SelectOptionProps) => VNode | string
Optionvalue? 内容选项值string | number
Optionlabel? 内容选项标签string
change? 事件选中值改变时触发(value: string | number) => void
visible-change? 事件下拉框显示/隐藏时触发(visible: boolean) => void
clear? 事件清空选中值时触发() => void
focus? 事件获取焦点时触发(event: FocusEvent) => void
blur? 事件失去焦点时触发(event: FocusEvent) => void
focus? 暴露聚焦选择器() => void
blur? 暴露失焦选择器() => void

基础用法

使用 <px-option> 插槽子组件定义选项。

<template>
  <div class="demo-select">
    <px-select v-model="value" placeholder="请选择">
      <px-option label="选项一" value="1" />
      <px-option label="选项二" value="2" />
      <px-option label="选项三" value="3" />
      <px-option label="选项四" value="4" />
    </px-select>
  </div>
</template>

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

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

<style scoped>
.demo-select {
  max-width: 300px;
}
</style>

禁用选项

在选项中使用 disabled 属性来禁用某个选项。

<template>
  <div class="demo-select">
    <px-select v-model="value" placeholder="有禁用选项">
      <px-option label="选项一" value="1" />
      <px-option label="选项二(禁用)" value="2" disabled />
      <px-option label="选项三" value="3" />
    </px-select>
  </div>
</template>

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

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

<style scoped>
.demo-select {
  max-width: 300px;
}
</style>

禁用选择器

在选择器上设置 disabled 来禁用整个下拉菜单。

<template>
  <div class="demo-select">
    <px-select v-model="value" disabled placeholder="Disabled select">
      <px-option label="选项一" value="1" />
      <px-option label="选项二" value="2" />
      <px-option label="选项三" value="3" />
    </px-select>
  </div>
</template>

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

const value = ref('1');
</script>

<style scoped>
.demo-select {
  max-width: 300px;
}
</style>

可清空

设置 clearable 允许用户清除已选值。鼠标悬浮时显示清除图标。

<template>
  <div class="demo-select">
    <px-select v-model="value" clearable placeholder="Clearable select">
      <px-option label="选项一" value="1" />
      <px-option label="选项二" value="2" />
      <px-option label="选项三" value="3" />
    </px-select>
  </div>
</template>

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

const value = ref('2');
</script>

<style scoped>
.demo-select {
  max-width: 300px;
}
</style>

可搜索

设置 filterable 启用输入筛选选项。支持自定义 filter-methodremote-method 实现高级搜索。

<template>
  <div class="demo-select">
    <px-select v-model="value" filterable placeholder="Type to search">
      <px-option label="Apple" value="apple" />
      <px-option label="Banana" value="banana" />
      <px-option label="Cherry" value="cherry" />
      <px-option label="Grape" value="grape" />
      <px-option label="Orange" value="orange" />
    </px-select>
  </div>
</template>

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

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

<style scoped>
.demo-select {
  max-width: 300px;
}
</style>

幽灵样式

设置 ghost 呈现无边框、透明的输入框,仅在悬浮或聚焦时显示边框 — 与 PxInput 幽灵样式一致。

<template>
  <div class="demo-select">
    <px-select v-model="value" ghost placeholder="Ghost select">
      <px-option label="选项一" value="1" />
      <px-option label="选项二" value="2" />
      <px-option label="选项三" value="3" />
    </px-select>
  </div>
</template>

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

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

<style scoped>
.demo-select {
  max-width: 300px;
}
</style>

选择器颜色

通过 color 设置预设主题色(primarysuccesswarningdangerinfo),为输入框边框、选中指示器和高亮项着色。

<template>
  <div class="demo-select">
    <px-select v-model="v1" color="primary" placeholder="Primary" :options="options" />
    <px-select v-model="v2" color="success" placeholder="Success" :options="options" />
    <px-select v-model="v3" color="warning" placeholder="Warning" :options="options" />
    <px-select v-model="v4" color="danger" placeholder="Danger" :options="options" />
    <px-select v-model="v5" color="info" placeholder="Info" :options="options" />
  </div>
</template>

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

const options = [
  { value: '1', label: 'Option A' },
  { value: '2', label: 'Option B' },
  { value: '3', label: 'Option C' },
];

const v1 = ref('');
const v2 = ref('');
const v3 = ref('');
const v4 = ref('');
const v5 = ref('');
</script>

<style scoped>
.demo-select {
  display: flex;
  flex-direction: column;
  gap: 16px;
  max-width: 300px;
}
</style>

自定义颜色

传入任意十六进制色值实现完全自定义主题,支持默认和 ghost 两种样式。

<template>
  <div class="demo-select">
    <h4>Default</h4>
    <px-select v-model="v1" color="#626aef" placeholder="Indigo #626aef" :options="options" />
    <px-select v-model="v2" color="#ff6b9d" placeholder="Pink #ff6b9d" :options="options" />
    <px-select v-model="v3" color="#36cfc9" placeholder="Teal #36cfc9" :options="options" />

    <h4>Ghost</h4>
    <px-select v-model="v4" color="#626aef" ghost placeholder="Indigo ghost" :options="options" />
    <px-select v-model="v5" color="#ff6b9d" ghost placeholder="Pink ghost" :options="options" />
    <px-select v-model="v6" color="#36cfc9" ghost placeholder="Teal ghost" :options="options" />
  </div>
</template>

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

const options = [
  { value: '1', label: 'Option A' },
  { value: '2', label: 'Option B' },
  { value: '3', label: 'Option C' },
];

const v1 = ref('');
const v2 = ref('');
const v3 = ref('');
const v4 = ref('');
const v5 = ref('');
const v6 = ref('');
</script>

<style scoped>
.demo-select {
  display: flex;
  flex-direction: column;
  gap: 16px;
  max-width: 300px;
}
.demo-select h4 {
  margin: 8px 0 0;
}
</style>

不同尺寸

通过 size 控制选择器高度和菜单项尺寸。支持 largesmall

<template>
  <div class="demo-select">
    <px-select v-model="v1" size="large" placeholder="Large">
      <px-option label="选项一" value="1" />
      <px-option label="选项二" value="2" />
      <px-option label="选项三" value="3" />
    </px-select>
    <px-select v-model="v2" placeholder="Default">
      <px-option label="选项一" value="1" />
      <px-option label="选项二" value="2" />
      <px-option label="选项三" value="3" />
    </px-select>
    <px-select v-model="v3" size="small" placeholder="Small">
      <px-option label="选项一" value="1" />
      <px-option label="选项二" value="2" />
      <px-option label="选项三" value="3" />
    </px-select>
  </div>
</template>

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

const v1 = ref('');
const v2 = ref('');
const v3 = ref('');
</script>

<style scoped>
.demo-select {
  display: flex;
  flex-direction: column;
  gap: 16px;
  max-width: 300px;
}
</style>