Skip to content

Select 选择器

MoSelect 基于 Headless UI Listbox 封装,用于从选项列表中选择单个值。普通值直接使用 v-model;对象值建议传 by 指定比较字段,否则需要保持对象引用一致。

基础用法

Light

当前值:draft

Dark

当前值:draft

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

const value = ref("draft");
const options = [
  { label: "草稿", value: "draft" },
  { label: "已发布", value: "published" },
  { label: "已归档", value: "archived" }
];
</script>

<template>
  <MoSelect v-model="value" :options="options" placeholder="请选择状态" />
</template>

尺寸

Light
Dark
vue
<MoSelect size="small" :options="options" />
<MoSelect :options="options" />
<MoSelect size="large" :options="options" />

禁用状态

Light
Dark
vue
<MoSelect v-model="value" :options="options" />
<MoSelect v-model="value" :options="options" disabled />
ts
const options = [
  { label: "管理员", value: "admin" },
  { label: "访客", value: "guest", disabled: true }
];

自定义展示

使用 label 插槽自定义按钮内展示内容,使用 option 插槽自定义下拉选项内容。

Light
Dark
vue
<MoSelect v-model="role" :options="roleOptions">
  <template #label="{ option, label }">
    {{ option ? `角色:${label}` : label }}
  </template>

  <template #option="{ option, selected }">
    <strong>{{ option.label }}</strong>
    <small>{{ selected ? "当前选择" : "可切换" }}</small>
  </template>
</MoSelect>

对象值与 by

value 是对象时,传 by="id" 可以用对象字段进行比较。

Light

当前节点:华东

Dark

当前节点:华东

vue
<script setup lang="ts">
const options = [
  { label: "华东节点", value: { id: "cn-east", region: "华东" } },
  { label: "华南节点", value: { id: "cn-south", region: "华南" } }
];
const value = ref({ id: "cn-east", region: "华东" });
</script>

<template>
  <MoSelect v-model="value" :options="options" by="id" />
</template>

Change 事件

Light

等待选择

Dark

等待选择

vue
<MoSelect v-model="value" :options="options" @change="handleChange" />
ts
function handleChange(value, option) {
  console.log(value, option);
}

Horizontal

horizontal 会传给 Headless UI Listbox,适合需要横向键盘导航的场景。

vue
<MoSelect v-model="value" :options="options" horizontal />

API

属性说明类型默认值
v-model选中值string | number | boolean | object | nullnull
options选项列表SelectOption[][]
theme主题light | darklight
size尺寸small | default | largedefault
placeholder未选择时的占位文本string请选择
disabled是否整体禁用booleanfalse
horizontal是否启用横向键盘导航booleanfalse
name原生表单字段名string-
by对象值比较字段或比较函数string | ((a, b) => boolean)-

SelectOption

字段说明类型
label展示文本string
value选项值SelectValue
disabled是否禁用当前选项boolean

Events

事件说明参数
change选中值变化时触发value, option

Slots

插槽说明
label自定义按钮内展示内容,参数 { option, label }
option自定义下拉选项内容,参数 { option, active, selected, disabled }