开发预览 更新于 2026-05-10

Dropdown 下拉菜单

下拉菜单 —— Popover + 列表 + 键盘导航。支持分组标题、分隔线、危险操作语义。

基础用法

items 数组式配置,按顺序渲染菜单项;divider: true 渲染分隔线,header: true 渲染分组标题。键盘 ↑↓ 切换、Enter / 空格 选中、Esc 关闭、Home / End 跳到首/末项。

<script setup lang="ts">
import { CfButton, CfDropdown } from '@chufix-design/vue';
import type { DropdownItem } from '@chufix-design/vue';

const items: DropdownItem[] = [
{ key: 'profile', label: '个人资料' },
{ key: 'settings', label: '设置' },
{ divider: true, label: '' },
{ header: true, label: '操作' },
{ key: 'rename', label: '重命名' },
{ key: 'archive', label: '归档', disabled: true },
{ key: 'delete', label: '删除', tone: 'danger' },
];

function onSelect(item: DropdownItem) {
console.log('selected:', item.key);
}
</script>

<template>
<CfDropdown :items="items" placement="bottom" @select="onSelect">
  <CfButton variant="secondary">操作菜单 ▾</CfButton>
</CfDropdown>
</template>
import { CfButton, CfDropdown } from '@chufix-design/react';
import type { DropdownItem } from '@chufix-design/react';

const items: DropdownItem[] = [
{ key: 'profile', label: '个人资料' },
{ key: 'settings', label: '设置' },
{ divider: true, label: '' },
{ header: true, label: '操作' },
{ key: 'rename', label: '重命名' },
{ key: 'archive', label: '归档', disabled: true },
{ key: 'delete', label: '删除', tone: 'danger' },
];

export default function Demo() {
return (
  <CfDropdown
    items={items}
    placement="bottom"
    onSelect={(item) => console.log('selected:', item.key)}
  >
    <CfButton variant="secondary">操作菜单 ▾</CfButton>
  </CfDropdown>
);
}

API · Props

属性类型默认值说明
itemsDropdownItem[][]菜单项配置数组
placement'top' | 'bottom' | 'left' | 'right''bottom'首选位置
offsetnumber6与触发元素的间距(px)
closeOnSelectbooleantrue选中后关闭
disabledbooleanfalse禁用触发
widthnumber | string固定宽度,省略则自适应
openboolean受控时使用

API · DropdownItem

属性类型说明
keystring唯一标识(建议提供,便于 select 事件分流)
labelstring显示文本
iconstring可选前置图标(emoji 或符号)
disabledboolean禁用项
dividerboolean渲染为分隔线
headerboolean渲染为分组标题(不可点)
tone'default' | 'danger'语义色,danger 用于不可逆操作

API · Events

事件参数说明
select (Vue) / onSelect (React)(item, index)选中某一项时触发
update:open (Vue) / onOpenChange (React)(open: boolean)展开状态变化

反馈与讨论

Dropdown 下拉菜单 的讨论

0
0 / 600
一键发送
正在加载评论...