菜单

Scripting 提供的 Menu 是一个交互式菜单组件,用于展示一组操作项或子菜单。该组件可以作为操作容器,也支持嵌套结构,适合在工具栏、上下文菜单或紧凑布局中统一管理多个相关操作。

其行为类似于 SwiftUI 中的 Menu,支持纯文本标签和自定义视图标签,并可配置点击时的默认行为。


用途

使用 Menu 可以将多个相关操作整合为一个统一入口,提升界面整洁性与可用性。菜单中可以包含多个 Button 组件,也可以嵌套其他 Menu 实现多级菜单结构。


属性定义

1type MenuProps = {
2  primaryAction?: () => void
3  children?: VirtualNode | (VirtualNode | undefined | null)[]
4} & (
5  | {
6      title: string
7      systemImage?: string
8    }
9  | {
10      label: VirtualNode
11    }
12)

基础属性

属性名 类型 说明
primaryAction () => void(可选) 点击菜单本身时触发的主操作,不展开子菜单。适合设置默认行为。
children VirtualNode 或数组 菜单的内容,通常是 Button 或嵌套的 Menu 组件。

标签配置(二选一)

开发者必须指定以下两种标签方式之一:

方式一:title 与可选的 systemImage

属性名 类型 说明
title string 菜单标题,描述菜单的操作内容。
systemImage string(可选) SF Symbols 图标名称,显示在标题旁。

方式二:label 自定义视图标签

属性名 类型 说明
label VirtualNode 自定义菜单标签视图,可组合图标、文本等。

示例:基础菜单结构

1<Menu title="操作">
2  <Button title="重命名" action={rename} />
3  <Button title="删除" action={delete} />
4  <Menu title="复制">
5    <Button title="复制" action={copy} />
6    <Button title="复制格式" action={copyFormatted} />
7  </Menu>
8</Menu>

在此示例中:

  • 主菜单为 "操作",包含两个按钮和一个嵌套的 "复制" 子菜单;
  • 子菜单中继续包含两个按钮。

示例:使用 primaryAction 和图标

1<Menu
2  title="更多"
3  systemImage="ellipsis"
4  primaryAction={() => console.log("点击菜单")}
5>
6  <Button title="设置" action={openSettings} />
7  <Button title="帮助" action={openHelp} />
8</Menu>
  • 用户点击菜单图标将触发 primaryAction
  • 长按或展开菜单时,会展示其 children 内容。

示例:使用自定义标签

1<Menu
2  label={
3    <HStack>
4      <Image systemName="gear" />
5      <Text>选项</Text>
6    </HStack>
7  }
8>
9  <Button title="配置" action={configure} />
10</Menu>

此示例使用 HStack 组合图标与文本作为菜单标签,适合在复杂场景下灵活布局。


开发提示

  • Menu 常用于 toolbarcontextMenu 等需要组合多个操作的界面中;
  • 可无限嵌套子菜单,构建多层级操作结构;
  • 若操作不多且用户期望直接执行某一默认行为,可设置 primaryAction
  • 自定义 label 可用于图标+文本的混合样式,提升可视性与品牌一致性。