Skip to content

Select 选择器

从弹出列表中选择一个或多个值。

命令行安装

bash
npx @loongship-kit/ui add select

组件结构

角色组件职责使用条件
根组件Select管理选中值和展开状态必需
触发区域SelectTriggerSelectValue打开选项列表并展示当前值常规用法需要
内容容器SelectContent承载并定位选项列表必需
选项结构SelectGroupSelectLabelSelectItem组织分组、标签和可选项SelectItem 必需
辅助组件SelectSeparatorSelectScrollUpButtonSelectScrollDownButton分隔选项并提供滚动控制按需

基础用法

查看代码
vue
<script setup lang="ts">
import { ref } from 'vue'
import {
  Select,
  SelectContent,
  SelectItem,
  SelectTrigger,
  SelectValue
} from '@/components/loongship/select'

const port = ref<string>()
</script>

<template>
  <Select v-model="port">
    <SelectTrigger aria-label="Port">
      <SelectValue placeholder="Select a port" />
    </SelectTrigger>
    <SelectContent>
      <SelectItem value="cnsgh">Shanghai</SelectItem>
      <SelectItem value="sgsin">Singapore</SelectItem>
      <SelectItem value="jpyok">Yokohama</SelectItem>
    </SelectContent>
  </Select>
</template>

分组和禁用项

Selected: cnsgh

查看代码
vue
<template>
  <Select v-model="port">
    <SelectTrigger><SelectValue /></SelectTrigger>
    <SelectContent>
      <SelectGroup>
        <SelectLabel>Asia</SelectLabel>
        <SelectItem value="cnsgh">Shanghai</SelectItem>
        <SelectItem value="sgsin">Singapore</SelectItem>
      </SelectGroup>
      <SelectSeparator />
      <SelectGroup>
        <SelectLabel>Europe</SelectLabel>
        <SelectItem value="nlrtm">Rotterdam</SelectItem>
        <SelectItem value="deham" disabled>Hamburg (unavailable)</SelectItem>
      </SelectGroup>
    </SelectContent>
  </Select>
</template>

多选

多选值与展示

设置 multiple 后,v-model 使用数组。触发器默认用逗号连接已选项文本。

Selected: underway
查看代码
vue
<script setup lang="ts">
import { ref } from 'vue'
import { Button } from '@/components/loongship/button'
import {
  Select,
  SelectContent,
  SelectItem,
  SelectTrigger,
  SelectValue
} from '@/components/loongship/select'

const statuses = ref<string[]>(['underway'])
</script>

<template>
  <div class="vp-demo-showcase-column">
    <div class="vp-demo-control">
      <Select v-model="statuses" multiple>
        <SelectTrigger aria-label="Vessel statuses">
          <SelectValue placeholder="Select statuses" />
        </SelectTrigger>
        <SelectContent>
          <SelectItem value="underway">Underway</SelectItem>
          <SelectItem value="moored">Moored</SelectItem>
          <SelectItem value="anchor">At anchor</SelectItem>
          <SelectItem value="unknown" disabled>Unknown (unavailable)</SelectItem>
        </SelectContent>
      </Select>
    </div>
    <span>Selected: {{ statuses.join(', ') || 'None' }}</span>
    <Button size="sm" variant="outline" @click="statuses = []">Clear</Button>
  </div>
</template>

禁用

查看代码
vue
<template>
  <Select disabled default-value="cnsgh">
    <SelectTrigger aria-label="Disabled port">
      <SelectValue />
    </SelectTrigger>
    <SelectContent>
      <SelectItem value="cnsgh">Shanghai</SelectItem>
    </SelectContent>
  </Select>
</template>

受控展开

受控状态行为

使用 v-model:open 读取或控制展开状态。默认不会锁定页面滚动。

Open: false
查看代码
vue
<script setup lang="ts">
import { ref } from 'vue'
import { Button } from '@/components/loongship/button'
import {
  Select,
  SelectContent,
  SelectItem,
  SelectTrigger,
  SelectValue
} from '@/components/loongship/select'

const open = ref(false)
</script>

<template>
  <Button size="sm" variant="outline" @click="open = true">Open select</Button>
  <Select v-model:open="open">
    <SelectTrigger aria-label="Controlled select">
      <SelectValue placeholder="Select a status" />
    </SelectTrigger>
    <SelectContent>
      <SelectItem value="underway">Underway</SelectItem>
      <SelectItem value="moored">Moored</SelectItem>
      <SelectItem value="anchor">At anchor</SelectItem>
    </SelectContent>
  </Select>
  <span>Open: {{ open }}</span>
</template>

API

Select(主组件)

属性

属性类型默认值说明
v-modelAcceptableValue | AcceptableValue[]-当前选中值
defaultValueAcceptableValue | AcceptableValue[]-非受控模式的初始值
v-model:openboolean-展开状态
defaultOpenbooleanfalse非受控模式的初始展开状态
multiplebooleanfalse是否允许多选;开启后 modelValue 为数组
nullableValuestring-空值时原生隐藏选项的值
bystring | ((a, b) => boolean)-对象值的比较字段或比较函数
dir'ltr' | 'rtl''ltr'阅读方向
autocompletestring-表单自动完成提示
disabledbooleanfalse是否禁用
namestring-表单字段名
requiredbooleanfalse是否必填

事件

事件参数说明
update:modelValuevalue: AcceptableValue | AcceptableValue[]选中值改变时触发
update:openopen: boolean展开状态改变时触发

插槽

插槽参数说明
default放置 SelectTriggerSelectContent

子组件

SelectTrigger — 选择器触发区域

属性

属性类型默认值说明
disabledbooleanfalse单独禁用触发器
referenceElement | VirtualElement当前元素自定义浮层定位锚点
asstring | Component'button'渲染元素
asChildbooleanfalse合并到唯一子元素
classClassValue-自定义类名

插槽

插槽参数说明
default放置 SelectValue
SelectValue — 当前选中值

属性

属性类型默认值说明
placeholderstring-未选择时显示的占位文本
asstring | Component'span'渲染元素
asChildbooleanfalse合并到唯一子元素
classClassValue-自定义类名

插槽

插槽参数说明
default{ selectedLabel: string[], modelValue: AcceptableValue | AcceptableValue[] | undefined }自定义选中值内容
SelectContent — 选项浮层容器

属性

属性类型默认值说明
position'item-aligned' | 'popper''popper'浮层定位模式
bodyLockbooleanfalse展开时是否锁定页面滚动;设为 true 时页面滚动条会隐藏
forceMountbooleanfalse关闭时仍保留内容节点
disableOutsidePointerEventsbooleanfalse是否阻止浮层外的指针事件
side'top' | 'right' | 'bottom' | 'left''bottom'首选展开方向
sideOffsetnumber0与触发器的距离
sideFlipbooleantrue空间不足时是否翻转方向
align'start' | 'center' | 'end''center'与触发器的对齐方式
alignOffsetnumber0对齐偏移量
alignFlipbooleantrue碰撞时是否翻转对齐方式
avoidCollisionsbooleantrue是否避免超出边界
collisionBoundaryElement | null | Array<Element | null>[]碰撞检测边界
collisionPaddingnumber | Partial<Record<Side, number>>0碰撞边界内边距
arrowPaddingnumber0箭头与内容边缘的间距
hideShiftedArrowbooleantrue箭头无法居中时是否隐藏
sticky'partial' | 'always''partial'对齐轴上的粘附策略
hideWhenDetachedbooleanfalse锚点不可见时是否隐藏
positionStrategy'absolute' | 'fixed''fixed'CSS 定位策略
updatePositionStrategy'optimized' | 'always''optimized'浮层位置更新策略
disableUpdateOnLayoutShiftbooleanfalse布局变化时停止更新位置
prioritizePositionbooleanfalse优先保证浮层位于视口内
referenceElement | VirtualElement触发器自定义定位锚点
dir'ltr' | 'rtl''ltr'阅读方向
memoDependenciesunknown[]-触发内容子树更新的依赖
asstring | Component'div'渲染元素
asChildbooleanfalse合并到唯一子元素
classClassValue-自定义类名

事件

事件参数说明
escapeKeyDownKeyboardEvent按下 Escape 时触发,可阻止默认行为
pointerDownOutsidePointerDownOutsideEvent在浮层外按下指针时触发,可阻止默认行为
closeAutoFocusEvent关闭后恢复焦点前触发,可阻止默认行为

插槽

插槽参数说明
default放置分组、选项和分割线
SelectGroup / SelectLabel / SelectItem — 分组、标签与选项

属性

组件属性类型默认值说明
SelectGroupasstring | Component'div'渲染元素
SelectGroupasChildbooleanfalse合并到唯一子元素
SelectGroupclassClassValue-自定义类名
SelectLabelforstring-关联分组的元素 id
SelectLabelasstring | Component'div'渲染元素
SelectLabelasChildbooleanfalse合并到唯一子元素
SelectLabelclassClassValue-自定义类名
SelectItemvalueAcceptableValue-选项值,必填
SelectItemdisabledbooleanfalse是否禁用
SelectItemtextValuestring文本内容键盘字符检索使用的文本
SelectItemasstring | Component'div'渲染元素
SelectItemasChildbooleanfalse合并到唯一子元素
SelectItemclassClassValue-自定义类名

事件

组件事件参数说明
SelectItemselectSelectEvent选择前触发;调用 event.preventDefault() 可阻止选择

插槽

组件插槽参数说明
SelectGroupdefault分组内容
SelectLabeldefault分组标签
SelectItemdefault选项内容
SelectSeparator / SelectScrollUpButton / SelectScrollDownButton — 分隔与滚动辅助

属性

组件属性类型默认值说明
SelectSeparatorasstring | Component'div'渲染元素
SelectSeparatorasChildbooleanfalse合并到唯一子元素
SelectSeparatorclassClassValue-自定义类名
SelectScrollUpButtonasstring | Component'div'渲染元素
SelectScrollUpButtonasChildbooleanfalse合并到唯一子元素
SelectScrollUpButtonclassClassValue-自定义类名
SelectScrollDownButtonasstring | Component'div'渲染元素
SelectScrollDownButtonasChildbooleanfalse合并到唯一子元素
SelectScrollDownButtonclassClassValue-自定义类名