1e41f4b71Sopenharmony_ci# Menu
2e41f4b71Sopenharmony_ci
3e41f4b71Sopenharmony_ci
4e41f4b71Sopenharmony_ciYou can use menu APIs to display a context menu – a vertical list of items displayed by long pressing, clicking, or right-clicking a component. For details, see [Menu Control](../reference/apis-arkui/arkui-ts/ts-universal-attributes-menu.md).
5e41f4b71Sopenharmony_ci
6e41f4b71Sopenharmony_ci
7e41f4b71Sopenharmony_ci## Creating a Menu in the Default Style
8e41f4b71Sopenharmony_ci
9e41f4b71Sopenharmony_ciUse the **bindMenu** API to implement a menu. **bindMenu** responds to the click event of the bound component. When the bound component is clicked, the menu is displayed.
10e41f4b71Sopenharmony_ci
11e41f4b71Sopenharmony_ci```ts
12e41f4b71Sopenharmony_ciButton('click for Menu')
13e41f4b71Sopenharmony_ci  .bindMenu([
14e41f4b71Sopenharmony_ci    {
15e41f4b71Sopenharmony_ci      value: 'Menu1',
16e41f4b71Sopenharmony_ci      action: () => {
17e41f4b71Sopenharmony_ci        console.info('handle Menu1 select')
18e41f4b71Sopenharmony_ci      }
19e41f4b71Sopenharmony_ci    }
20e41f4b71Sopenharmony_ci  ])
21e41f4b71Sopenharmony_ci```
22e41f4b71Sopenharmony_ci
23e41f4b71Sopenharmony_ci
24e41f4b71Sopenharmony_ci![en-us_image_0000001562940565](figures/en-us_image_0000001562940565.png)
25e41f4b71Sopenharmony_ci
26e41f4b71Sopenharmony_ci
27e41f4b71Sopenharmony_ci## Creating a Menu in a Custom Style
28e41f4b71Sopenharmony_ci
29e41f4b71Sopenharmony_ciIf the default style does not meet requirements, you can use [\@Builder](../quick-start/arkts-builder.md) to customize menu content and use the **bindMenu** API to bind the custom menu to a component.
30e41f4b71Sopenharmony_ci
31e41f4b71Sopenharmony_ci
32e41f4b71Sopenharmony_ci### \@Builder: Customizing Menu Content
33e41f4b71Sopenharmony_ci
34e41f4b71Sopenharmony_ci
35e41f4b71Sopenharmony_ci```ts
36e41f4b71Sopenharmony_ciclass Tmp {
37e41f4b71Sopenharmony_ci  iconStr2: ResourceStr = $r("app.media.view_list_filled")
38e41f4b71Sopenharmony_ci
39e41f4b71Sopenharmony_ci  set(val: Resource) {
40e41f4b71Sopenharmony_ci    this.iconStr2 = val
41e41f4b71Sopenharmony_ci  }
42e41f4b71Sopenharmony_ci}
43e41f4b71Sopenharmony_ci
44e41f4b71Sopenharmony_ci@Entry
45e41f4b71Sopenharmony_ci@Component
46e41f4b71Sopenharmony_cistruct menuExample {
47e41f4b71Sopenharmony_ci  @State select: boolean = true
48e41f4b71Sopenharmony_ci  private iconStr: ResourceStr = $r("app.media.view_list_filled")
49e41f4b71Sopenharmony_ci  private iconStr2: ResourceStr = $r("app.media.view_list_filled")
50e41f4b71Sopenharmony_ci
51e41f4b71Sopenharmony_ci  @Builder
52e41f4b71Sopenharmony_ci  SubMenu() {
53e41f4b71Sopenharmony_ci    Menu() {
54e41f4b71Sopenharmony_ci      MenuItem({ content: "Copy", labelInfo: "Ctrl+C" })
55e41f4b71Sopenharmony_ci      MenuItem({ content: "Paste", labelInfo: "Ctrl+V" })
56e41f4b71Sopenharmony_ci    }
57e41f4b71Sopenharmony_ci  }
58e41f4b71Sopenharmony_ci
59e41f4b71Sopenharmony_ci  @Builder
60e41f4b71Sopenharmony_ci  MyMenu() {
61e41f4b71Sopenharmony_ci    Menu() {
62e41f4b71Sopenharmony_ci      MenuItem({ startIcon: $r("app.media.icon"), content: "Menu option" })
63e41f4b71Sopenharmony_ci      MenuItem({ startIcon: $r("app.media.icon"), content: "Menu option" }).enabled(false)
64e41f4b71Sopenharmony_ci      MenuItem({
65e41f4b71Sopenharmony_ci        startIcon: this.iconStr,
66e41f4b71Sopenharmony_ci        content: "Menu option",
67e41f4b71Sopenharmony_ci        endIcon: $r("app.media.arrow_right_filled"),
68e41f4b71Sopenharmony_ci        // When the builder parameter is set, it indicates that a submenu is bound to a menu item. When the user hovers the cursor over the menu item, the submenu is displayed.
69e41f4b71Sopenharmony_ci        builder: this.SubMenu
70e41f4b71Sopenharmony_ci      })
71e41f4b71Sopenharmony_ci      MenuItemGroup ({ header: 'Subtitle' }) {
72e41f4b71Sopenharmony_ci        MenuItem ({ content: "Menu option" })
73e41f4b71Sopenharmony_ci          .selectIcon(true)
74e41f4b71Sopenharmony_ci          .selected(this.select)
75e41f4b71Sopenharmony_ci          .onChange((selected) => {
76e41f4b71Sopenharmony_ci            console.info("menuItem select" + selected);
77e41f4b71Sopenharmony_ci            let Str: Tmp = new Tmp()
78e41f4b71Sopenharmony_ci            Str.set($r("app.media.icon"))
79e41f4b71Sopenharmony_ci          })
80e41f4b71Sopenharmony_ci        MenuItem({
81e41f4b71Sopenharmony_ci          startIcon: $r("app.media.view_list_filled"),
82e41f4b71Sopenharmony_ci          content: "Menu option",
83e41f4b71Sopenharmony_ci          endIcon: $r("app.media.arrow_right_filled"),
84e41f4b71Sopenharmony_ci          builder: this.SubMenu
85e41f4b71Sopenharmony_ci        })
86e41f4b71Sopenharmony_ci      }
87e41f4b71Sopenharmony_ci
88e41f4b71Sopenharmony_ci      MenuItem({
89e41f4b71Sopenharmony_ci        startIcon: this.iconStr2,
90e41f4b71Sopenharmony_ci        content: "Menu option",
91e41f4b71Sopenharmony_ci        endIcon: $r("app.media.arrow_right_filled")
92e41f4b71Sopenharmony_ci      })
93e41f4b71Sopenharmony_ci    }
94e41f4b71Sopenharmony_ci  }
95e41f4b71Sopenharmony_ci
96e41f4b71Sopenharmony_ci  build() {
97e41f4b71Sopenharmony_ci    // ...
98e41f4b71Sopenharmony_ci  }
99e41f4b71Sopenharmony_ci}
100e41f4b71Sopenharmony_ci
101e41f4b71Sopenharmony_ci```
102e41f4b71Sopenharmony_ci
103e41f4b71Sopenharmony_ci
104e41f4b71Sopenharmony_ci### Using the bindMenu Attribute to Bind a Component
105e41f4b71Sopenharmony_ci
106e41f4b71Sopenharmony_ci
107e41f4b71Sopenharmony_ci```ts
108e41f4b71Sopenharmony_ciButton('click for Menu')
109e41f4b71Sopenharmony_ci  .bindMenu(this.MyMenu)
110e41f4b71Sopenharmony_ci```
111e41f4b71Sopenharmony_ci
112e41f4b71Sopenharmony_ci
113e41f4b71Sopenharmony_ci![en-us_image_0000001511580924](figures/en-us_image_0000001511580924.png)
114e41f4b71Sopenharmony_ci
115e41f4b71Sopenharmony_ci
116e41f4b71Sopenharmony_ci## Creating a Context Menu Displayed Upon Right-clicking or Long Pressing
117e41f4b71Sopenharmony_ci
118e41f4b71Sopenharmony_ciUse the **bindContextMenu** API to customize the menu content and menu popup mode: right-click or long press. The menu items that are displayed using **bindContextMenu** are in an independent child window and can be displayed outside the application window.
119e41f4b71Sopenharmony_ci
120e41f4b71Sopenharmony_ci
121e41f4b71Sopenharmony_ci- The content in the @Builder is the same as that in the preceding section.
122e41f4b71Sopenharmony_ci
123e41f4b71Sopenharmony_ci- Check the menu popup mode and bind the component through the **bindContextMenu** attribute. In the example, the menu is displayed upon right-clicking.
124e41f4b71Sopenharmony_ci
125e41f4b71Sopenharmony_ci  ```ts
126e41f4b71Sopenharmony_ci  Button('click for Menu')
127e41f4b71Sopenharmony_ci    .bindContextMenu(this.MyMenu, ResponseType.RightClick)
128e41f4b71Sopenharmony_ci  ```
129