下拉菜单

查看源代码

向用户显示由按钮触发的菜单,例如一组操作或功能。

导入

import {
  DropdownMenu,
  DropdownMenuTrigger,
  DropdownMenuContent,
  DropdownMenuArrow,
  DropdownMenuGroup,
  DropdownMenuLabel,
  DropdownMenuSeparator,
  DropdownMenuItem,
  DropdownMenuItemIndicator,
  DropdownMenuCheckboxItem,
  DropdownMenuRadioGroup,
  DropdownMenuRadioItem,
  DropdownMenuSubTrigger,
} from "@resolid/react-ui";
  • DropdownMenu: 包含菜单的所有部分。
  • DropdownMenuTrigger: 包装将打开下拉菜单的控件。
  • DropdownMenuContent: 打开菜单时弹出的组件。
  • DropdownMenuArrow: 可选的箭头元素,可与菜单内容一起渲染。
  • DropdownMenuGroup: 用于对多个 DropdownMenuItem 进行分组。
  • DropdownMenuLabel: 用于渲染标签。使用方向键无法聚焦。
  • DropdownMenuSeparator: 菜单项和组之间的可视分隔符。
  • DropdownMenuItem: 包含菜单项的组件。
  • DropdownMenuRadioGroup: 用于对多个 DropdownMenuRadioItem 进行分组。
  • DropdownMenuRadioItem: 一个可以像单选按钮一样进行控制和渲染的项目。
  • DropdownMenuCheckboxItem: 一个可以像复选框一样进行控制和渲染的项目。
  • DropdownMenuItemIndicator: 在父级 DropdownMenuCheckboxItemDropdownMenuRadioItem 被选中项目时呈现的视觉指示器。
  • DropdownMenuSubTrigger: 包装将打开子菜单的控件。

演示

了解如何在项目中使用菜单组件,让我们看一个最基本的例子:

import {
  Button,
  DropdownMenu,
  DropdownMenuTrigger,
  DropdownMenuContent,
  DropdownMenuItem,
  DropdownMenuSeparator,
} from "@resolid/react-ui";

export default function App() {
  return (
    <div className={"flex flex-row gap-3"}>
      <DropdownMenu>
        <DropdownMenuTrigger
          render={(props) => <Button color={"neutral"} variant={"outline"} {...props} />}
        >
          下拉菜单
        </DropdownMenuTrigger>
        <DropdownMenuContent className={"text-sm"}>
          <DropdownMenuItem>
            新标签页
            <span className={"text-fg-subtle ml-auto pl-5 text-xs tracking-widest"}>⌘+T</span>
          </DropdownMenuItem>
          <DropdownMenuItem>
            打开新窗口
            <span className={"text-fg-subtle ml-auto pl-5 text-xs tracking-widest"}>⌘+N</span>
          </DropdownMenuItem>
          <DropdownMenuItem disabled>
            打开新的无痕式窗口
            <span className={"ml-auto pl-5 text-xs tracking-widest"}>⇧+⌘+N</span>
          </DropdownMenuItem>
          <DropdownMenuSeparator />
          <DropdownMenuItem>
            关闭窗口
            <span className={"text-fg-subtle ml-auto pl-5 text-xs tracking-widest"}>⇧+⌘+W</span>
          </DropdownMenuItem>
          <DropdownMenuItem>
            关闭标签页
            <span className={"text-fg-subtle ml-auto pl-5 text-xs tracking-widest"}>⌘+W</span>
          </DropdownMenuItem>
        </DropdownMenuContent>
      </DropdownMenu>
    </div>
  );
}

举例

多级菜单

要显示多级菜单,请渲染另一个 DropdownMenu 组件并使用 DropdownMenuSubTrigger 组件打开子菜单。

import {
  Button,
  DropdownMenu,
  DropdownMenuTrigger,
  DropdownMenuContent,
  DropdownMenuItem,
  DropdownMenuArrow,
  DropdownMenuSeparator,
  DropdownMenuSubTrigger,
} from "@resolid/react-ui";

export default function App() {
  return (
    <div className={"flex flex-row gap-3"}>
      <DropdownMenu>
        <DropdownMenuTrigger
          render={(props) => <Button color={"neutral"} variant={"outline"} {...props} />}
        >
          多级菜单
        </DropdownMenuTrigger>
        <DropdownMenuContent className={"text-sm"}>
          <DropdownMenuArrow />
          <DropdownMenuItem label={"New Tab"}>新建标签页</DropdownMenuItem>
          <DropdownMenuItem label={"New Window"}>打开新窗口</DropdownMenuItem>
          <DropdownMenuItem>打开新的无痕式窗口</DropdownMenuItem>
          <DropdownMenuSeparator />
          <DropdownMenu>
            <DropdownMenuSubTrigger label={"Share"}>分享</DropdownMenuSubTrigger>
            <DropdownMenuContent className={"text-sm"}>
              <DropdownMenuItem label={"Email"}>邮件</DropdownMenuItem>
              <DropdownMenuItem label={"SMS"}>短信</DropdownMenuItem>
              <DropdownMenu>
                <DropdownMenuSubTrigger>社交媒体</DropdownMenuSubTrigger>
                <DropdownMenuContent className={"text-sm"}>
                  <DropdownMenu>
                    <DropdownMenuSubTrigger>微信</DropdownMenuSubTrigger>
                    <DropdownMenuContent className={"text-sm"}>
                      <DropdownMenuItem>聊天</DropdownMenuItem>
                      <DropdownMenuItem>朋友圈</DropdownMenuItem>
                    </DropdownMenuContent>
                  </DropdownMenu>
                  <DropdownMenuItem>微博</DropdownMenuItem>
                  <DropdownMenuItem>抖音</DropdownMenuItem>
                  <DropdownMenuItem>知乎</DropdownMenuItem>
                </DropdownMenuContent>
              </DropdownMenu>
            </DropdownMenuContent>
          </DropdownMenu>
          <DropdownMenuSeparator />
          <DropdownMenu>
            <DropdownMenuSubTrigger label={"Tools"}>更多工具</DropdownMenuSubTrigger>
            <DropdownMenuContent className={"text-sm"}>
              <DropdownMenuItem>保存页面为...</DropdownMenuItem>
              <DropdownMenuItem>创建快捷方式</DropdownMenuItem>
              <DropdownMenuSeparator />
              <DropdownMenuItem>开发者工具</DropdownMenuItem>
            </DropdownMenuContent>
          </DropdownMenu>
        </DropdownMenuContent>
      </DropdownMenu>
    </div>
  );
}

分组菜单

使用 DropdownMenuGroup 组件对相关菜单项进行分组。

import {
  Button,
  DropdownMenu,
  DropdownMenuTrigger,
  DropdownMenuContent,
  DropdownMenuItem,
  DropdownMenuArrow,
  DropdownMenuGroup,
  DropdownMenuLabel,
  DropdownMenuSeparator,
} from "@resolid/react-ui";

export default function App() {
  return (
    <div className={"flex flex-row gap-3"}>
      <DropdownMenu>
        <DropdownMenuTrigger
          render={(props) => <Button color={"neutral"} variant={"outline"} {...props} />}
        >
          View
        </DropdownMenuTrigger>
        <DropdownMenuContent className={"text-sm"}>
          <DropdownMenuArrow />
          <DropdownMenuGroup>
            <DropdownMenuLabel>Sort</DropdownMenuLabel>
            <DropdownMenuItem>Date</DropdownMenuItem>
            <DropdownMenuItem>Name</DropdownMenuItem>
            <DropdownMenuItem>Type</DropdownMenuItem>
          </DropdownMenuGroup>
          <DropdownMenuSeparator />
          <DropdownMenuGroup>
            <DropdownMenuLabel>Workspace</DropdownMenuLabel>
            <DropdownMenuItem>Minimap</DropdownMenuItem>
            <DropdownMenuItem>Search</DropdownMenuItem>
            <DropdownMenuItem>Sidebar</DropdownMenuItem>
          </DropdownMenuGroup>
        </DropdownMenuContent>
      </DropdownMenu>
    </div>
  );
}

链接菜单

as 属性传递给 DropdownMenuItem 组件以呈现链接。

import {
  Button,
  DropdownMenu,
  DropdownMenuArrow,
  DropdownMenuContent,
  DropdownMenuItem,
  DropdownMenuTrigger,
} from "@resolid/react-ui";

export default function App() {
  return (
    <div className={"flex flex-row gap-3"}>
      <DropdownMenu>
        <DropdownMenuTrigger
          render={(props) => <Button color={"neutral"} variant={"outline"} {...props} />}
        >
          Favourite
        </DropdownMenuTrigger>
        <DropdownMenuContent className={"text-sm"}>
          <DropdownMenuArrow />
          <DropdownMenuItem
            render={(props) => (
              <a target={"_blank"} rel="noreferrer" href={"https://www.github.com"} {...props}>
                Github
              </a>
            )}
          />
          <DropdownMenuItem
            disabled
            render={(props) => (
              <a target={"_blank"} rel="noreferrer" href={"https://www.github.com"} {...props}>
                Disabled
              </a>
            )}
          />
          <DropdownMenuItem
            render={(props) => (
              <a target={"_blank"} rel="noreferrer" href={"https://www.vercel.com"} {...props}>
                Vercel
              </a>
            )}
          />
          <DropdownMenuItem
            render={(props) => (
              <a target={"_blank"} rel="noreferrer" href={"https://www.resolid.tech"} {...props}>
                Resolid
              </a>
            )}
          />
        </DropdownMenuContent>
      </DropdownMenu>
    </div>
  );
}

单选组菜单

要单选组菜单项目,请使用 DropdownMenuRadioGroup 组件。

import {
  Button,
  DropdownMenu,
  DropdownMenuArrow,
  DropdownMenuContent,
  DropdownMenuItemIndicator,
  DropdownMenuRadioGroup,
  DropdownMenuRadioItem,
  DropdownMenuTrigger,
} from "@resolid/react-ui";
import { useState } from "react";
import { SpriteIcon } from "~/components/sprite-icon";

export default function App() {
  const [value, setValue] = useState("date");

  return (
    <div className={"flex flex-row gap-3"}>
      <DropdownMenu>
        <DropdownMenuTrigger
          render={(props) => <Button color={"neutral"} variant={"outline"} {...props} />}
        >
          Sort
        </DropdownMenuTrigger>
        <DropdownMenuContent className={"text-sm"}>
          <DropdownMenuArrow />
          <DropdownMenuRadioGroup value={value} onChange={setValue}>
            <DropdownMenuRadioItem value={"date"}>
              <DropdownMenuItemIndicator>
                <SpriteIcon size={"1rem"} name={"dot"} />
              </DropdownMenuItemIndicator>
              Date
            </DropdownMenuRadioItem>
            <DropdownMenuRadioItem value={"name"}>
              <DropdownMenuItemIndicator>
                <SpriteIcon size={"1rem"} name={"dot"} />
              </DropdownMenuItemIndicator>
              Name
            </DropdownMenuRadioItem>
            <DropdownMenuRadioItem value={"type"}>
              <DropdownMenuItemIndicator>
                <SpriteIcon size={"1rem"} name={"dot"} />
              </DropdownMenuItemIndicator>
              Type
            </DropdownMenuRadioItem>
          </DropdownMenuRadioGroup>
        </DropdownMenuContent>
      </DropdownMenu>
    </div>
  );
}

多选组菜单

要将复选框添加到菜单项中,请使用 DropdownMenuCheckboxItem 组件。

import {
  Button,
  DropdownMenu,
  DropdownMenuArrow,
  DropdownMenuCheckboxItem,
  DropdownMenuContent,
  DropdownMenuItemIndicator,
  DropdownMenuTrigger,
} from "@resolid/react-ui";
import { useState } from "react";
import { SpriteIcon } from "~/components/sprite-icon";

export default function App() {
  const [showMinimap, setShowMinimap] = useState(true);
  const [showSearch, setShowSearch] = useState(true);
  const [showSidebar, setShowSidebar] = useState(false);

  return (
    <div className={"flex flex-row gap-3"}>
      <DropdownMenu closeOnSelect={false}>
        <DropdownMenuTrigger
          render={(props) => <Button color={"neutral"} variant={"outline"} {...props} />}
        >
          Workspace
        </DropdownMenuTrigger>
        <DropdownMenuContent className={"text-sm"}>
          <DropdownMenuArrow />
          <DropdownMenuCheckboxItem
            label={"Minimap"}
            checked={showMinimap}
            onChange={setShowMinimap}
          >
            <DropdownMenuItemIndicator>
              <SpriteIcon size={"1rem"} name={"check"} />
            </DropdownMenuItemIndicator>
            Minimap
          </DropdownMenuCheckboxItem>
          <DropdownMenuCheckboxItem label={"Search"} checked={showSearch} onChange={setShowSearch}>
            <DropdownMenuItemIndicator>
              <SpriteIcon size={"1rem"} name={"check"} />
            </DropdownMenuItemIndicator>
            Search
          </DropdownMenuCheckboxItem>
          <DropdownMenuCheckboxItem
            label={"Sidebar"}
            checked={showSidebar}
            onChange={setShowSidebar}
          >
            <DropdownMenuItemIndicator>
              <SpriteIcon size={"1rem"} name={"check"} />
            </DropdownMenuItemIndicator>
            Sidebar
          </DropdownMenuCheckboxItem>
        </DropdownMenuContent>
      </DropdownMenu>
    </div>
  );
}

属性

DropdownMenu

属性open简介

受控打开状态

类型boolean默认值-必须false
属性defaultOpen简介

初始渲染时的默认打开状态

类型boolean默认值false必须false
属性onOpenChange简介

打开状态改变时调用

类型(open: boolean) => void默认值-必须false
属性closeOnSelect简介

选择项目后, 菜单将关闭

类型boolean默认值true必须false
属性preventScroll简介

打开时阻止背景页面滚动

类型boolean默认值false必须false
属性placement简介

放置位置

类型"top" | "right" | "bottom" | "left" | "top-start" | "top-end" | "right-start" | "right-end" | "bottom-start" | "bottom-end" | "left-start" | "left-end"默认值"bottom-start"必须false
属性duration简介

动画持续时间

类型number默认值250必须false

Item

属性label简介

用于菜单的提前导航文本。如果未提供,将使用菜单项的文本内容

类型string默认值-必须false
属性disabled简介

该项目是否被禁用

类型boolean默认值false必须false
属性closeOnSelect简介

选择项目后, 菜单将关闭

类型boolean默认值-必须false
属性onSelect简介

当用户选择一个项目(通过鼠标或键盘)时调用事件处理程序

类型() => void默认值-必须false

CheckboxItem

属性label简介

用于菜单的提前导航文本。如果未提供,将使用菜单项的文本内容

类型string默认值-必须false
属性disabled简介

该项目是否被禁用

类型boolean默认值false必须false
属性closeOnSelect简介

选择项目后, 菜单将关闭

类型boolean默认值-必须false
属性onSelect简介

当用户选择一个项目(通过鼠标或键盘)时调用事件处理程序

类型() => void默认值-必须false
属性checked简介

项目的受控选中状态

类型false | true | "indeterminate"默认值-必须false
属性onChange简介

项目选中状态更改时调用的事件处理程序

类型(checked: CheckedState) => void默认值-必须false

RadioGroup

属性value简介

要选中的菜单单选项目的控制值

类型string | number默认值-必须false
属性onChange简介

值更改时调用的事件处理程序

类型((value: string | number) => void)默认值-必须false

RadioItem

属性value简介

菜单单选项的价值

类型string | number默认值-必须true
属性label简介

用于菜单的提前导航文本。如果未提供,将使用菜单项的文本内容

类型string默认值-必须false
属性disabled简介

该项目是否被禁用

类型boolean默认值false必须false
属性closeOnSelect简介

选择项目后, 菜单将关闭

类型boolean默认值-必须false
属性onSelect简介

当用户选择一个项目(通过鼠标或键盘)时调用事件处理程序

类型() => void默认值-必须false

建议更改此页面