Skip to content

Dropdown 下拉菜单 ​

向下弹出的菜单列表,支持多种触发方式、单选/多选、子菜单、分组等功能。

基础用法 ​

通过默认插槽传入触发按钮,#dropdown 插槽传入菜单内容。

vue
<my-dropdown>
  <my-button>下拉菜单</my-button>
  <template #dropdown>
    <div @click.stop>选项一</div>
    <div @click.stop>选项二</div>
  </template>
</my-dropdown>

带单选 ​

v-model 绑定选中值,选中项带高亮和勾选标记。

当前值: 未选
vue
<my-dropdown v-model="selected" :options="options">
  <my-button>{{ selected || '请选择' }} ▾</my-button>
</my-dropdown>

单选且自定义指示器 ​

通过 #item 插槽自定义选项渲染,搭配自定义选中标记。

vue
<my-dropdown v-model="selected" :options="options">
  <template #item="{ item }">
    <span>{{ selected === item.value ? '●' : '○' }}</span>
    <span>{{ item.label }}</span>
  </template>
  <my-button>选择</my-button>
</my-dropdown>

带多选 ​

:multiple="true" 开启多选模式,选中项显示勾选框。

vue
<my-dropdown v-model="selected" :options="options" multiple>
  <my-button>选择</my-button>
</my-dropdown>

带分组级选择 ​

通过 group 字段对选项分组,支持全选/部分选。

vue
<my-dropdown v-model="selected" :options="groupOptions" multiple>
  <my-button>选择</my-button>
</my-dropdown>

带图标 ​

选项通过 icon 字段传入 SVG 图标。

vue
<my-dropdown v-model="selected" :options="iconOptions">
  <my-button>操作菜单</my-button>
</my-dropdown>

长按触发 ​

trigger="longpress" 长按 0.6s 后弹出菜单。

长按试试
vue
<my-dropdown v-model="selected" :options="options" trigger="longpress">
  <my-button>长按</my-button>
</my-dropdown>

带描述 ​

选项通过 description 字段添加辅助说明文字。

vue
<my-dropdown v-model="selected" :options="[
  { label: '静音', value: 'mute', description: '关闭所有通知声音' },
  { label: '震动', value: 'vibrate', description: '来电时设备震动' },
]">
  <my-button>选择</my-button>
</my-dropdown>

带分组 ​

通过 group 字段对选项分组,组与组之间有标题。

vue
<my-dropdown v-model="selected" :options="groupedOptions">
  <my-button>选择城市</my-button>
</my-dropdown>

带禁用项 ​

选项通过 disabled: true 禁用。

vue
<my-dropdown v-model="selected" :options="[
  { label: '选项一', value: '1' },
  { label: '选项二(禁用)', value: '2', disabled: true },
]">
  <my-button>选择</my-button>
</my-dropdown>

带子菜单 ​

通过 children 字段定义子菜单,悬停展开。

未选择
vue
<my-dropdown v-model="selected" :options="[
  { label: '导航一', value: 'nav1' },
  { label: '导航二', children: [
    { label: '选项 2-1', value: '2-1' },
    { label: '选项 2-2', value: '2-2' },
  ]},
]">
  <my-button>导航</my-button>
</my-dropdown>

带自定义菜单指示器 ​

#item 插槽完全控制选项渲染,可自定义勾选指示器样式。

vue
<my-dropdown v-model="selected" :options="options">
  <template #item="{ item }">
    <span>{{ item.label }}</span>
    <span v-if="selected === item.value">✓</span>
  </template>
  <my-button>选择</my-button>
</my-dropdown>

受控 ​

v-model 完全控制当前选中值,可用于语言切换等场景。

vue
<my-dropdown v-model="lang" :options="options">
  <my-button>{{ lang }} ▾</my-button>
</my-dropdown>

受控展开状态 ​

v-model:visible 控制菜单展开/收起。

未选
vue
<my-dropdown v-model:visible="visible" v-model="selected" :options="options">
  <my-button>下拉</my-button>
</my-dropdown>
<my-button @click="visible = !visible">切换</my-button>

自定义触发器 ​

#trigger 插槽自定义触发元素,适用于头像下拉等场景。

用户▾
vue
<my-dropdown trigger="click">
  <template #trigger="{ visible }">
    <div style="display:flex;align-items:center;gap:8px;cursor:pointer">
      <img src="/images/icon.png" style="width:36px;height:36px;border-radius:50%;object-fit:cover" />
      <span>用户名</span>
    </div>
  </template>
  <template #dropdown>
    <!-- 头像 + 名称 + 邮箱 -->
    <!-- 个人资料 / 设置 / 创建团队 / 退出登录 -->
  </template>
</my-dropdown>

组件结构 ​

<div> 根元素包含触发插槽(#trigger)和过渡动画包裹的下拉菜单(my-dropdown__menu)。菜单内部根据 options 渲染分组标题、分割线和选项列表,或通过 #dropdown 插槽自定义内容。

CSS 类名 ​

类名说明
.my-dropdown根元素
.is-large大尺寸
.is-small小尺寸
.my-dropdown__menu下拉菜单
.is-bottom-start下方左对齐
.is-bottom-end下方右对齐
.is-top-start上方左对齐
.is-top-end上方右对齐
.my-dropdown__item菜单项
.is-disabled禁用状态
.is-active激活状态
.is-danger危险样式
.my-dropdown__icon选项图标
.my-dropdown__check选中勾选标记
.my-dropdown__content选项内容容器
.my-dropdown__label选项标签
.my-dropdown__desc选项描述
.my-dropdown__divider分割线
.my-dropdown__group-title分组标题
.-fade-*菜单过渡动画

API ​

Props ​

属性说明类型默认值
options菜单选项列表DropdownOption[]—
modelValue绑定值 (v-model)any | any[]—
visible展开状态 (v-model:visible)booleanfalse
trigger触发方式'click' | 'hover' | 'contextmenu' | 'longpress' | 'manual''click'
placement弹出位置'bottom-start' | 'bottom-end' | 'top-start' | 'top-end''bottom-start'
disabled禁用booleanfalse
multiple多选模式booleanfalse
hideOnClick点击选项后关闭菜单booleantrue
size尺寸'large' | 'default' | 'small''default'
属性说明类型默认值
label选项文本string—
value选项值any—
disabled禁用选项booleanfalse
divided上方显示分割线booleanfalse
icon图标 (SVG字符串)string—
description描述文字string—
danger危险样式booleanfalse
children子菜单选项DropdownOption[]—
group分组名string—

Events ​

事件说明回调
update:modelValuev-model 更新(value: any)
update:visible展开状态更新(visible: boolean)
select选项点击(item: DropdownOption)
visibleChange展开状态变更(visible: boolean)

Slots ​

名称说明作用域
trigger自定义触发元素{ visible, toggle, open, close }
dropdown自定义菜单内容(不使用 options 时)—
item自定义选项渲染{ item }