鸿蒙_使用组件导航Navigation搭建应用框架

组件导航封装了页面、标题、菜单栏、工具栏等功能,我们只需要进行简单的设置,就能快速搭建应用的框架,我们直接新建一个独立页面来通过组件导航实现主页、设置页、我的页三个示例页面,并且相互之间可以跳转,并且天然支持宽屏时主页和二级页面自动分栏显示。

TypeScript 复制代码
@Entry
@Component
struct TestNavigationWithSetting {
  @State message: string = 'Hello World';
  //导航页面栈
  navPathStack: NavPathStack = new NavPathStack();

  //导航页
  @Builder
  navPages(name: string) {
    if (name === 'SettingPage') {
      NavDestination() {
        Text('设置页内容')
        Button('返回')
          .onClick(() => {
            this.navPathStack.pop()
          })
      }.title('设置')
    } else if (name === 'MinePage') {
      NavDestination() {
        Text('我的页内容')
        Button('返回')
          .onClick(() => {
            this.navPathStack.pop()
          })
      }.title('我的')
    }
  }

  //自定义菜单栏
  @Builder
  navMenus() {
    Row({ space: 10 }) {
      Button() {
        Row() {
          SymbolGlyph($r('sys.symbol.house'))
            .fontSize(20)
        }
        .alignItems(VerticalAlign.Center) // 垂直居中
      }
      .padding(10)
      .backgroundColor(Color.White)
      .border({ width: 1 })
      .type(ButtonType.Circle)
      .onClick(() => {
        this.navPathStack.pushPath({ name: 'SettingPage' })
      })

      Button() {
        Row() {
          SymbolGlyph($r('sys.symbol.message'))
            .fontSize(20)
        }
        .alignItems(VerticalAlign.Center) // 垂直居中
      }
      .padding(10)
      .backgroundColor(Color.White)
      .border({ width: 1 })
      .type(ButtonType.Circle)
      .onClick(() => {
        this.navPathStack.pushPath({ name: 'SettingPage' })
      })
    }
    .justifyContent(FlexAlign.End)
    .padding(10)
    //.backgroundColor(Color.Gray)
    .width('100%')
    .height('100%')
  }

  build() {
    Navigation(this.navPathStack) {
      Scroll() {
        Column({ space: 10 }) {
          Text('主页内容')
          Button('跳转到设置页')
            .margin(20)
            .onClick(() => {
              this.navPathStack.pushPath({ name: 'SettingPage' })
            })
          Button('跳转到我的页')
            .onClick(() => {
              this.navPathStack.pushPath({ name: 'MinePage' })
            })

          //生成几个占位
          ForEach([1, 2, 3, 4, 5, 6, 7, 8], (item: number) => {
            Button('多加几个')
              .margin(10)
              .onClick(() => {
                try {
                  this.getUIContext().getPromptAction().showToast({ message: '点击了按钮' })
                } catch (error) {
                  // TODO: Implement error handling.
                }
              })
          })


          Button('最后一个')
            .onClick(() => {
              this.navPathStack.pushPath({ name: 'MinePage' })
            })

        }
        .padding({ top: 10, bottom: 20 })
        .width('100%')
      }
    }
    .navDestination(this.navPages)

    //.mode(NavigationMode.Auto) //导航模式:默认是宽屏(大于600vp)自动分栏
    //.mode(NavigationMode.Stack)//不分栏
    //.mode(NavigationMode.Split)//强制分栏

    .title('主页')
    .title({ main: '主标题', sub: '副标题' })
    //.titleMode(NavigationTitleMode.Free)
    //.titleMode(NavigationTitleMode.Full)
    //.titleMode(NavigationTitleMode.Mini)

    //.hideTitleBar(true) //隐藏标题和菜单栏

    //设置菜单栏
    .menus([
      {
        value: '增加',
        icon: $r('sys.media.ohos_ic_public_add'),
        action: () => {
          this.navPathStack.pushPath({ name: 'MinePage' })
        }
      },
      {
        value: '分享',
        icon: $r('sys.media.ohos_ic_public_share'),
        action: () => {
          this.navPathStack.pushPath({ name: 'SettingPage' })
        }
      },
      {
        value: '编辑',
        icon: $r('sys.media.ohos_ic_public_edit'),
        action: () => {
          this.navPathStack.pushPath({ name: 'MinePage' })
        }
      },
      {
        value: '拍照',
        icon: $r('sys.media.ohos_ic_public_camera'),
        action: () => {
          this.navPathStack.pushPath({ name: 'MinePage' })
        }
      },
      {
        value: '取消',
        icon: $r('sys.media.ohos_ic_public_cancel'),
        action: () => {
          this.navPathStack.pushPath({ name: 'MinePage' })
        }
      }
    ])
    //.menus(this.navMenus) //自定义菜单栏

    .toolbarConfiguration([
      {
        value: '增加',
        icon: $r('sys.media.ohos_ic_public_add'),
        action: () => {
          this.navPathStack.pushPath({ name: 'MinePage' })
        }
      },
      {
        value: '扫码',
        icon: $r('sys.media.ohos_ic_public_scan'),
        action: () => {
          this.navPathStack.pushPath({ name: 'MinePage' })
        }
      },
      {
        value: '拍照',
        icon: $r('sys.media.ohos_ic_public_camera'),
        action: () => {
          this.navPathStack.pushPath({ name: 'SettingPage' })
        }
      }
      /*,
      {
        value: '更多',
        icon: $r('sys.media.ohos_ic_public_more'),
        action: () => {
          this.navPathStack.pushPath({ name: 'MinePage' })
        }
      }*/
    ], { backgroundColor: undefined })

  }
}

实际运行效果如下,横屏效果:

宽屏效果:

相关推荐
autumn20052 小时前
Flutter 框架跨平台鸿蒙开发 - AR历史场景穿越
flutter·华为·ar·harmonyos
AI_零食2 小时前
开源鸿蒙跨平台Flutter开发:手账记事模板库应用
学习·flutter·华为·开源·harmonyos·鸿蒙
提子拌饭1333 小时前
开源鸿蒙跨平台Flutter开发:家庭影像传承系统
flutter·华为·开源·harmonyos·鸿蒙
HwJack203 小时前
HarmonyOS NDK 开发:冲破 ArkUI 性能桎梏的“降维打击”
华为·harmonyos
李李李勃谦3 小时前
Flutter 框架跨平台鸿蒙开发 - 手工作品展示
flutter·华为·harmonyos
左手厨刀右手茼蒿3 小时前
Flutter 三方库 klutter 的鸿蒙化适配指南 - 掌握 Kotlin Multiplatform (KMP) 互操作技术、助力鸿蒙应用构建极致复用且高性能的跨端业务逻辑共享体系
flutter·harmonyos·鸿蒙·openharmony
世人万千丶3 小时前
开源鸿蒙跨平台Flutter开发:古诗词学习应用
学习·flutter·华为·开源·harmonyos·鸿蒙
2501_944448473 小时前
数据可视化 Kotlin KMP OpenHarmony图表生成
开发语言·信息可视化·harmonyos
枫叶丹43 小时前
【HarmonyOS 6.0】ArkWeb 深度解读:getPageOffset20 与网页滚动偏移量获取能力的演进
开发语言·华为·harmonyos