Skip to content

Combobox 组合框

输入关键词过滤并选择候选项。异步请求由业务层处理。

命令行安装

bash
npx @loongship-kit/ui add combobox

组件结构

角色组件职责使用条件
根组件Combobox管理选中值、搜索词和展开状态必需
输入与锚点ComboboxAnchorComboboxInput输入搜索词并确定浮层锚点常规用法需要
内容容器ComboboxContentComboboxViewport定位内容并承载结果列表常规用法需要
结果内容ComboboxItemComboboxEmpty渲染可选项和空状态选项必需,空状态按需

基础用法

查看代码
vue
<Combobox v-model="port">
  <ComboboxAnchor>
    <ComboboxInput placeholder="Search port" />
  </ComboboxAnchor>
  <ComboboxContent>
    <ComboboxViewport>
      <ComboboxEmpty>No port found.</ComboboxEmpty>
      <ComboboxItem v-for="item in ports" :key="item" :value="item">
        {{ item }}
      </ComboboxItem>
    </ComboboxViewport>
  </ComboboxContent>
</Combobox>

多选

已选择:无

查看代码
vue
<template>
  <div class="vp-demo-control">
    <Combobox v-model="selectedPorts" multiple>
      <ComboboxAnchor><ComboboxInput placeholder="Select ports" /></ComboboxAnchor>
      <ComboboxContent>
        <ComboboxViewport>
          <ComboboxEmpty>No port found.</ComboboxEmpty>
          <ComboboxItem v-for="item in ports" :key="item" :value="item">{{ item }}</ComboboxItem>
        </ComboboxViewport>
      </ComboboxContent>
    </Combobox>
    <p>已选择:{{ selectedPorts.join(', ') || '无' }}</p>
  </div>
</template>

远程搜索

处理远程请求竞态

远程搜索时设置 ignore-filter,由业务代码请求并渲染结果。下面用延时模拟接口;生产环境还应取消或忽略过期请求。ShipSearch 已封装船舶搜索场景。

查看代码
vue
<template>
  <div class="vp-demo-control">
    <Combobox v-model="remotePort" ignore-filter>
      <ComboboxAnchor>
        <ComboboxInput placeholder="Search remote ports" @update:model-value="searchPorts" />
      </ComboboxAnchor>
      <ComboboxContent>
        <ComboboxViewport>
          <div v-if="remoteLoading">Loading...</div>
          <template v-else>
            <ComboboxEmpty>No port found.</ComboboxEmpty>
            <ComboboxItem v-for="item in remoteItems" :key="item" :value="item">{{
              item
            }}</ComboboxItem>
          </template>
        </ComboboxViewport>
      </ComboboxContent>
    </Combobox>
  </div>
</template>

API

Combobox(主组件)

属性

属性类型默认值说明
v-modelT | T[]-当前值
defaultValueT | T[]-非受控模式的初始值
v-model:openboolean-展开状态
defaultOpenbooleanfalse非受控模式的初始展开状态
multiplebooleanfalse是否允许多选
disabledbooleanfalse是否禁用
namestring-表单字段名
requiredbooleanfalse是否为必填表单字段
bystring | ((a, b) => boolean)-对象选项的比较字段或比较函数
dir'ltr' | 'rtl''ltr'阅读方向
ignoreFilterbooleanfalse禁用内置过滤,常用于远程搜索
openOnFocusbooleanfalse输入框聚焦时展开
openOnClickbooleanfalse点击输入框时展开
resetSearchTermOnBlurbooleantrue输入框失焦时重置搜索词
resetSearchTermOnSelectbooleantrue选择选项后重置搜索词
resetModelValueOnClearbooleanfalse清空搜索词时同时清空选中值
highlightOnHoverbooleantrue指针悬停选项时是否高亮

事件

事件参数说明
update:modelValuevalue: T | T[]选中值变化
update:openvalue: boolean展开状态变化
highlight{ ref: HTMLElement, value: T } | undefined高亮选项变化

插槽

插槽参数说明
default{ open: boolean, modelValue: T | T[] }放置输入框和选项内容

子组件

ComboboxInput — 搜索输入框

属性

属性类型默认值说明
v-modelstring-搜索词
displayValue(value: T) => string-单选对象值在输入框中的显示文本
autoFocusbooleanfalse挂载后自动聚焦
disabledbooleanfalse是否禁用
asstring | Component'input'渲染元素
asChildbooleanfalse将行为绑定到唯一子元素

事件

事件参数说明
update:modelValuevalue: string搜索词变化

插槽

插槽参数说明
defaultasChild 时放置唯一的自定义输入元素
ComboboxContent — 结果浮层容器

属性

属性类型默认值说明
position'inline' | 'popper''inline'定位模式
bodyLockbooleanfalse展开时是否锁定页面滚动
hideWhenEmptybooleanfalse没有匹配项时是否隐藏内容
disableOutsidePointerEventsbooleanfalse是否阻止浮层外的指针交互
side'top' | 'right' | 'bottom' | 'left''bottom'popper 模式的方向
sideOffsetnumber0与锚点的距离
align'start' | 'center' | 'end''center'与锚点的对齐方式
alignOffsetnumber0对齐偏移

事件

事件参数说明
escapeKeyDownKeyboardEvent按下 Escape
pointerDownOutsidePointerDownOutsideEvent在内容外按下指针;可阻止默认行为
focusOutsideFocusOutsideEvent焦点移到内容外;可阻止默认行为
interactOutsidePointerDownOutsideEvent | FocusOutsideEvent在内容外发生交互

插槽

插槽参数说明
default放置 ComboboxViewport 和结果内容
ComboboxItem — 可选择结果项

属性

属性类型默认值说明
valueT-选择该项时写入的值,必填
disabledbooleanfalse是否禁用该项
textValuestring-非纯文本内容用于过滤的文本表示
asstring | Component'div'渲染元素
asChildbooleanfalse将行为绑定到唯一子元素

事件

事件参数说明
selectCustomEvent选中前触发;可调用 preventDefault()

插槽

插槽参数说明
default渲染选项内容
ComboboxAnchor / ComboboxViewport / ComboboxEmpty — 锚点、视口与空状态
组件常用属性默认插槽
ComboboxAnchorasasChildreference放置 ComboboxInput
ComboboxViewportasasChildnonce放置选项和空状态
ComboboxEmptyasasChild没有匹配项时显示的内容