在 OpenHarmony(ArkUI,eTS/ArkTS) 中,“菜单动态更新”通常指 菜单项(MenuItem)根据数据变化实时变化,常见场景包括:
下面按 常见方式 + 示例 说明。
✅ 菜单内容由 @State 或 @Link 等响应式数据驱动
✅ 菜单在每次弹出时重新构建
✅ 只要数据变,菜单就会自动更新
@Entry
@Component
struct Index {
@State menuItems: string[] = ['复制', '粘贴']
build() {
Column() {
Text('长按我')
.fontSize(20)
.padding(20)
.bindMenu(this.menuItems.map(item => {
return {
value: item,
action: () => {
console.log(item)
}
}
}))
}
}
}
aboutToAppear() {
setTimeout(() => {
this.menuItems = ['复制', '粘贴', '删除', '分享']
}, 2000)
}
✅ 2 秒后再次长按,菜单自动变化
@State items: MenuItemOptions[] = []
build() {
Text('区域菜单')
.bindContextMenu(
this.items,
ResponseType.RightClick
)
}
动态修改 this.items 即可。
适合 自定义按钮触发菜单
@State showMenu: boolean = false
@State menus: string[] = ['A', 'B']
build() {
Column() {
Button('菜单')
.onClick(() => {
this.showMenu = true
})
if (this.showMenu) {
Menu() {
ForEach(this.menus, (item) => {
MenuItem({ content: item })
.onClick(() => {
console.log(item)
})
})
}
}
}
}
更新 menus 数组即可动态变化。
@State isLogin: boolean = false
get menuList() {
return this.isLogin
? ['个人中心', '退出登录']
: ['登录', '注册']
}
.bindMenu(
this.menuList.map(i => ({
value: i,
action: () => {}
}))
)
❌ 用 let / 普通变量存菜单 → 不会更新
✅ 必须用 @State / @Link / @Prop
❌ 在 aboutToAppear 之外改数据但不触发 UI
✅ 确保是 响应式数据
| 场景 | 推荐方式 |
|---|---|
| 长按菜单 | bindMenu |
| 右键菜单 | bindContextMenu |
| 按钮菜单 | Menu + 条件渲染 |
| 数据驱动 | @State 数组 |
如果你有 具体版本(API 9 / 10 / 11) 或 特定菜单类型(系统菜单 / 自定义菜单),我可以给你更精确的示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。