Skip to content

Dropdown 下拉菜单

用于围绕一个触发器显示弹出菜单,常用于操作集合、筛选项切换、更多菜单等场景。

何时使用

  • 按钮点击后展示一组轻量操作
  • 页面空间有限,需要收纳轻量操作项
  • 需要通过 v-model 维护当前选中状态

基础用法

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

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

<template>
  <lk-dropdown v-model="value">
    <lk-button>下拉菜单</lk-button>

    <template #menu>
      <lk-dropdown-item name="1">选项一</lk-dropdown-item>
      <lk-dropdown-item name="2">选项二</lk-dropdown-item>
      <lk-dropdown-item name="3">选项三</lk-dropdown-item>
    </template>
  </lk-dropdown>
</template>

位置与触发方式

vue
<template>
  <lk-dropdown placement="bottom" trigger="click">
    <lk-button>点击触发</lk-button>
    <template #menu>
      <lk-dropdown-item name="a">A</lk-dropdown-item>
    </template>
  </lk-dropdown>
</template>

选择后关闭

closeOnSelect 默认开启。若希望菜单选择后保持展开,可关闭它。

vue
<lk-dropdown :close-on-select="false">
  <lk-button>多次操作</lk-button>
  <template #menu>
    <lk-dropdown-item name="edit">编辑</lk-dropdown-item>
    <lk-dropdown-item name="share">分享</lk-dropdown-item>
  </template>
</lk-dropdown>

多场景组合

推荐按场景拆分菜单:操作菜单用于编辑、复制、删除;筛选菜单用 v-model 保存当前条件;需要连续操作时关闭 closeOnSelect

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

const sortValue = ref('latest')
</script>

<template>
  <lk-dropdown v-model="sortValue">
    <lk-button>排序</lk-button>
    <template #menu>
      <lk-dropdown-item name="latest">最新创建</lk-dropdown-item>
      <lk-dropdown-item name="priority">优先级最高</lk-dropdown-item>
      <lk-dropdown-item name="progress">进度最快</lk-dropdown-item>
    </template>
  </lk-dropdown>
</template>

点击外部关闭

点击触发模式下默认会渲染遮罩层,点击外部自动收起。

vue
<lk-dropdown :close-on-click-outside="true">
  <lk-button>打开菜单</lk-button>
</lk-dropdown>

动画配置

可以使用预设动画,也可以自定义动画类型、持续时间、延迟和缓动函数。

vue
<lk-dropdown animation-type="fade-up" :duration="220" easing="ease-out">
  <lk-button type="primary">操作</lk-button>
  <template #menu>
    <lk-dropdown-item name="edit">编辑</lk-dropdown-item>
    <lk-dropdown-item name="delete">删除</lk-dropdown-item>
  </template>
</lk-dropdown>

lk-dropdown-item 用于声明菜单项,可通过 name 指定唯一值,通过 disabled 控制禁用态。

vue
<lk-dropdown-item name="delete" icon="trash-fill" disabled>删除</lk-dropdown-item>

推荐示例

1) 直接复用项目 Demo(推荐)

vue
<script setup lang="ts">
import DropdownDemo from '@/components/demos/dropdown-demo.vue'
</script>

<template>
  <DropdownDemo />
</template>

2) 在业务页中按需组合

vue
<template>
  <view class="page-demo">
    <lk-dropdown />
  </view>
</template>

API

Props

参数说明类型默认值
customClass组件可视根节点自定义类名string | object | array''
customStyle组件可视根节点自定义样式string | object''
modelValue当前选中值string | number''
zIndex弹层层级number500
trigger触发方式click | hoverclick
placement菜单展开位置top | bottom | left | rightbottom
closeOnSelect选择后是否自动关闭booleantrue
closeOnClickOutside点击菜单外部是否关闭booleantrue
animation动画预设名称keyof ANIMATION_PRESETSundefined
animationType自定义动画类型TransitionConfig['name']undefined
duration动画持续时间number180
delay动画延迟number0
easing动画缓动函数TransitionConfig['easing']ease-out

Events

事件名说明参数
update:modelValue选中项变化(value: string | number) => void
change选中项变化后的回调(value: string | number, payload?: DropdownSelectPayload) => void
select选择菜单项时触发(payload: { name, event }) => void
open菜单展开时触发() => void
close菜单收起时触发() => void
click-trigger点击触发器时触发(event?: Event) => void
click-outside点击外部遮罩时触发(event?: Event) => void
after-enter进入动画结束后触发() => void
after-leave离开动画结束后触发() => void

Slots

插槽名说明
default触发器内容
menu菜单内容,通常放置 lk-dropdown-item
参数说明类型默认值
customClass组件可视根节点自定义类名string | object | array''
customStyle组件可视根节点自定义样式string | object''
name菜单项唯一值,必填string | number
disabled是否禁用booleanfalse
icon左侧图标名string''
事件名说明参数
click点击可用菜单项时触发({ name, event }) => void
click-disabled点击禁用菜单项时触发({ name, event }) => void

使用建议

TIP

组件本身不提供 options 数组直传模式,推荐用 menu 插槽声明菜单内容,这样扩展性更好。

WARNING

hover 模式下,适合 H5 桌面交互;移动端优先使用 click 触发。

基于 MIT 协议开源 · 粤ICP备2022114240号-3

Dropdown 下拉菜单

正在连接预览服务...

请先运行 pnpm run dev:h5