Skip to content

DropdownMenu 下拉菜单

向下弹出的菜单列表,用于承载一组操作命令。

基础用法

tsx
import { DropdownMenu, MenuItem, MenuDivider, MenuGroup } from '@airo-ui/react'

function Demo() {
  return (
    <DropdownMenu triggerContent={<button>打开菜单</button>}>
      <MenuItem onClick={() => console.log('操作1')}>操作 1</MenuItem>
      <MenuItem onClick={() => console.log('操作2')}>操作 2</MenuItem>
      <MenuDivider />
      <MenuItem onClick={() => console.log('操作3')}>操作 3</MenuItem>
    </DropdownMenu>
  )
}

受控模式

tsx
import { useState } from 'react'
import { DropdownMenu, MenuItem } from '@airo-ui/react'

function Demo() {
  const [open, setOpen] = useState(false)

  return (
    <DropdownMenu
      open={open}
      onOpenChange={setOpen}
      triggerContent={<button>{open ? '已打开' : '点击打开'}</button>}
    >
      <MenuItem onClick={() => { setOpen(false); console.log('操作1') }}>
        操作 1
      </MenuItem>
    </DropdownMenu>
  )
}

触发方式

tsx
import { DropdownMenu, MenuItem } from '@airo-ui/react'

function Demo() {
  return (
    <>
      <DropdownMenu trigger="click" triggerContent={<button>点击</button>}>
        <MenuItem>点击触发</MenuItem>
      </DropdownMenu>
      <DropdownMenu trigger="hover" triggerContent={<button>悬停</button>}>
        <MenuItem>悬停触发</MenuItem>
      </DropdownMenu>
      <DropdownMenu trigger="contextmenu" triggerContent={<button>右键</button>}>
        <MenuItem>右键触发</MenuItem>
      </DropdownMenu>
    </>
  )
}

弹出位置

tsx
import { DropdownMenu, MenuItem } from '@airo-ui/react'

function Demo() {
  return (
    <>
      <DropdownMenu placement="bottom-start" triggerContent={<button>左下</button>}>
        <MenuItem>选项 1</MenuItem>
      </DropdownMenu>
      <DropdownMenu placement="bottom-end" triggerContent={<button>右下</button>}>
        <MenuItem>选项 1</MenuItem>
      </DropdownMenu>
      <DropdownMenu placement="top-start" triggerContent={<button>左上</button>}>
        <MenuItem>选项 1</MenuItem>
      </DropdownMenu>
    </>
  )
}

危险操作

tsx
import { DropdownMenu, MenuItem, MenuDivider } from '@airo-ui/react'

function Demo() {
  return (
    <DropdownMenu triggerContent={<button>操作</button>}>
      <MenuItem>编辑</MenuItem>
      <MenuItem>复制</MenuItem>
      <MenuDivider />
      <MenuItem danger onClick={() => console.log('删除')}>
        删除
      </MenuItem>
    </DropdownMenu>
  )
}

分组

tsx
import { DropdownMenu, MenuItem, MenuGroup } from '@airo-ui/react'

function Demo() {
  return (
    <DropdownMenu triggerContent={<button>文件</button>}>
      <MenuGroup label="编辑">
        <MenuItem>剪切</MenuItem>
        <MenuItem>复制</MenuItem>
      </MenuGroup>
      <MenuGroup label="视图">
        <MenuItem>放大</MenuItem>
        <MenuItem>缩小</MenuItem>
      </MenuGroup>
    </DropdownMenu>
  )
}

禁用项

tsx
import { DropdownMenu, MenuItem } from '@airo-ui/react'

function Demo() {
  return (
    <DropdownMenu triggerContent={<button>操作</button>}>
      <MenuItem onClick={() => console.log('ok')}>可用项</MenuItem>
      <MenuItem disabled>禁用项</MenuItem>
    </DropdownMenu>
  )
}

API

名称类型默认值说明
openboolean受控模式是否打开
onOpenChange(open: boolean) => void打开状态变化时触发
trigger'click' | 'contextmenu' | 'hover''click'触发方式
placement'bottom-start' | 'bottom' | 'bottom-end' | 'top-start' | 'top' | 'top-end''bottom-start'弹出位置
disabledbooleanfalse是否禁用
autoClosebooleantrue点击菜单项后是否自动关闭
triggerContentReactNode触发元素的内容
childrenReactNode菜单项子元素
onOpen() => void打开时触发
onClose() => void关闭时触发
名称类型默认值说明
labelstring菜单项文本
disabledbooleanfalse是否禁用
dangerbooleanfalse是否为危险操作
iconstring图标
acceleratorstring快捷键提示
childrenReactNode菜单项内容
onClick(e: MouseEvent) => void点击时触发
名称类型默认值说明
labelstring分组标题
childrenReactNode分组内容

菜单分割线组件,无 Props。

MIT License