赞
踩
鸿蒙定义了很好的下拉组件,对比原生iOS或android需要自定义来说确实简单太多了,而且原生相对自定义来说要稳定太多了。
上图来自官网案例。
Menu作为容器组件,内部使用MenuItem作为每一条的选项。其中,通过MenuItem控制具体的选项信息。
MenuItem可以传递参数
startIcon?: ResourceStr; //起始位置的图标 content?: ResourceStr; //内容,左侧标题 endIcon?: ResourceStr; //末尾位置的图标 labelInfo?: ResourceStr; //末尾的内容(浅灰色) builder?: CustomBuilder; //自定义的组件,可以用作子选项
- Menu() {
- MenuItem({
- content: 'item2',
- labelInfo:'value2',
- builder: xxx,
- startIcon: $rawfile('111.png'),
- endIcon: $r('app.media.icon')
- })
- }
通过MenuItem的builder参数,绑定一个子选项
- @Builder subMenu() {
- MenuItem({content:'item1',labelInfo:'value1'})
- MenuItem({content:'item1',labelInfo:'value1'})
- }
-
-
- @Builder myMenu() {
- Menu() {
- MenuItem({content:'item1',labelInfo:'value1'})
- MenuItem({
- content: 'item2',
- builder: this.subMenu.bind(this),
- startIcon: $rawfile('111.png'),
- endIcon: $r('app.media.icon')
- })
- }
- }
Menu内部可以放MenuItemGroup,对菜单进行分组
- @State menuSelected: boolean = true
- @Builder myMenu() {
- Menu() {
-
- MenuItemGroup({ header: '菜单组' }) {
- MenuItem({ content: "选项一" })
- //选中状态图标显示
- .selectIcon(true)
- //切换是否选中
- .selected(this.menuSelected)
- //切换选中回调
- .onChange((selected) => {
- console.info("menuItem select" + selected);
- this.menuSelected = selected
- })
- MenuItem({
- startIcon: $r("app.media.app_icon"),
- content: "选项二",
- endIcon: $r("app.media.icon"),
- })
- }
- }
- }
- @Entry
- @Component
- struct OfficialMenuPage {
- @State menuSelected: boolean = true
-
- @Builder subMenu() {
- MenuItem({content:'item1',labelInfo:'value1'})
- MenuItem({content:'item1',labelInfo:'value1'})
- }
-
- @Builder myMenu() {
- Menu() {
- MenuItem({content:'item1',labelInfo:'value1'})
- MenuItem({
- content: 'item2',
- builder: this.subMenu.bind(this),
- startIcon: $rawfile('111.png'),
- endIcon: $r('app.media.icon')
- })
-
- MenuItemGroup({ header: '菜单组' }) {
- MenuItem({ content: "选项一" })
- .selectIcon(true)
- .selected(this.menuSelected)
- .onChange((selected) => {
- console.info("menuItem select" + selected);
- this.menuSelected = selected
- })
- MenuItem({
- startIcon: $r("app.media.app_icon"),
- content: "选项二",
- endIcon: $r("app.media.icon"),
- builder: this.subMenu.bind(this)
- })
- }
-
- MenuItem({
- startIcon: $r('app.media.app_icon'),
- content: "选项三",
- endIcon: $r("app.media.app_icon")
- })
- }
- }
-
- build() {
- Row() {
- Column() {
- Text('点击展示')
- .fontSize(50)
- .fontWeight(FontWeight.Bold)
- .bindMenu(this.myMenu)
- }
- .width('100%')
- }
- .height('100%')
- }
- }
Menu组件的builder属性本来是可以用来做子选项的,但是在模拟器和预览中不能展示。一开始以为是代码问题,后来用官方代码也一样不能展示,也算是不支持模拟器和预览了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。