1# 不依赖UI组件的全局菜单 (openMenu) 2 3[菜单控制 (Menu)](arkts-popup-and-menu-components-menu.md)在使用时依赖绑定UI组件,否则无法使用。从API version 18开始,可以通过使用全局接口[openMenu](../reference/apis-arkui/js-apis-arkui-UIContext.md#openmenu18)的方式,在无UI组件的场景下直接或封装使用,例如在事件回调中使用或封装后对外提供能力。 4 5## 弹出菜单 6 7通过[openMenu](../reference/apis-arkui/js-apis-arkui-UIContext.md#openmenu18)可以弹出菜单。 8 9 ```ts 10 promptAction.openMenu(contentNode, { id: targetId }, { 11 enableArrow: true 12 }) 13 .then(() => { 14 console.info('openMenu success'); 15 }) 16 .catch((err: BusinessError) => { 17 console.info('openMenu error: ' + err.code + ' ' + err.message); 18 }) 19 ``` 20 21### 创建ComponentContent 22 23 通过调用openMenu接口弹出菜单,需要提供用于定义自定义弹出框的内容[ComponentContent](../reference/apis-arkui/js-apis-arkui-ComponentContent.md)。其中,wrapBuilder(buildText)封装自定义组件,new Params(this.message)是自定义组件的入参,可以缺省,也可以传入基础数据类型。 24 25 ```ts 26 private contentNode: ComponentContent<Object> = new ComponentContent(uiContext, wrapBuilder(buildText), this.message); 27 ``` 28 29 如果在wrapBuilder中包含其他组件(例如:[Popup](../reference/apis-arkui/arkui-ts/ohos-arkui-advanced-Popup.md#popup)、[Chip](../reference/apis-arkui/arkui-ts/ohos-arkui-advanced-Chip.md#chip)组件),则[ComponentContent](../reference/apis-arkui/js-apis-arkui-ComponentContent.md#componentcontent-1)应采用带有四个参数的构造函数constructor,其中options参数应传递{ nestingBuilderSupported: true }。 30 31 ```ts 32 @Builder 33 export function buildText(params: Params) { 34 Menu({ 35 // 类型设置图标内容 36 icon: { 37 image: $r('app.media.app_icon'), 38 width: 32, 39 height: 32, 40 fillColor: Color.White, 41 borderRadius: 10 42 } as MenuIconOptions, 43 // 设置文字内容 44 title: { 45 text: `This is a Menu title 1`, 46 fontSize: 20, 47 fontColor: Color.Black, 48 fontWeight: FontWeight.Normal 49 } as MenuTextOptions, 50 // 设置文字内容 51 message: { 52 text: `This is a Menu message 1`, 53 fontSize: 15, 54 fontColor: Color.Black 55 } as MenuTextOptions, 56 // 设置按钮内容 57 buttons: [{ 58 text: 'confirm', 59 action: () => { 60 console.info('confirm button click') 61 }, 62 fontSize: 15, 63 fontColor: Color.Black, 64 }, 65 { 66 text: 'cancel', 67 action: () => { 68 console.info('cancel button click') 69 }, 70 fontSize: 15, 71 fontColor: Color.Black 72 },] as [MenuButtonOptions?, MenuButtonOptions?] 73 }) 74 } 75 76 let contentNode: ComponentContent<Object> = new ComponentContent(uiContext, wrapBuilder(buildText), this.message, { nestingBuilderSupported: true }); 77 ``` 78 79 80### 绑定组件信息 81 82 通过调用openPopup接口弹出气泡,需要提供绑定组件的信息[TargetInfo](../reference/apis-arkui/js-apis-arkui-UIContext.md#targetinfo18)。若未传入有效的target,则无法弹出气泡。 83 84 ```ts 85 let frameNode: FrameNode | null = this.ctx.getFrameNodeByUniqueId(this.getUniqueId()); 86 let targetId = frameNode?.getChild(0)?.getUniqueId(); 87 ``` 88 89### 设置弹出菜单样式 90 91 通过调用openMenu接口弹出菜单,可以设置[MenuOptions](../reference/apis-arkui/arkui-ts/ts-universal-attributes-menu.md#menuoptions10)属性调整菜单样式。title属性不生效。preview参数仅支持设置MenuPreviewMode类型。 92 93 ```ts 94 private options: MenuOptions = { enableArrow: true, placement: Placement.Bottom }; 95 ``` 96 97## 更新菜单样式 98 99通过[updateMenu](../reference/apis-arkui/js-apis-arkui-UIContext.md#updatemenu18)可以更新菜单的样式。支持全量更新和增量更新其菜单样式,不支持更新showInSubWindow、preview、previewAnimationOptions、transition、onAppear、aboutToAppear、onDisappear和aboutToDisappear。 100 101 ```ts 102 promptAction.updateMenu(contentNode, { 103 enableArrow: false 104 }, true) 105 .then(() => { 106 console.info('updateMenu success'); 107 }) 108 .catch((err: BusinessError) => { 109 console.info('updateMenu error: ' + err.code + ' ' + err.message); 110 }) 111 ``` 112 113## 关闭菜单 114 115通过[closeMenu](../reference/apis-arkui/js-apis-arkui-UIContext.md#closemenu18)可以关闭菜单。 116 117 ```ts 118 promptAction.closeMenu(contentNode) 119 .then(() => { 120 console.info('openMenu success'); 121 }) 122 .catch((err: BusinessError) => { 123 console.info('openMenu error: ' + err.code + ' ' + err.message); 124 }) 125 ``` 126 127> **说明:** 128> 129> 由于[updateMenu](../reference/apis-arkui/js-apis-arkui-UIContext.md#updatemenu18)和[closeMenu](../reference/apis-arkui/js-apis-arkui-UIContext.md#closemenu18)依赖content来更新或者关闭指定的菜单,开发者需自行维护传入的content。 130 131## 在HAR包中使用全局菜单 132 133可以通过[HAR](../quick-start/har-package.md)包封装一个Menu,从而对外提供菜单的弹出、更新和关闭能力。 134 135具体调用方式参考[在HAR包中使用全局气泡提示](./arkts-popup-and-menu-components-uicontext-popup.md#在har包中使用全局气泡提示)。 136