HarmonyOS笔记5:ArkUI框架的Navigation导航组件

ArkUI框架的Navigation导航组件

在移动应用中需要在不同的页面进行切换跳转。这种切换和跳转有两种方式:页面路由和Navigation组件实现导航。HarmonyOS推荐使用Navigation实现页面跳转。在本文中在HarmonyOS 5.0.0 Release SDK (API Version 12 Release)版本下,简单介绍ArkUI框架的Navigation导航组件。

一、Navigation组件定义的页面结构

Navigation组件主要包含​导航页和子页:

导航页由标题栏、内容区和工具栏组成,其中导航页可以通过hideNavBar属性进行隐藏,导航页不存在页面栈中,导航页和子页,以及子页之间可以通过路由操作进行切换。
在这里插入图片描述

二、定义导航页

Navigation是路由导航的根视图容器,一般作为页面(@Entry)的根容器,包括单栏(Stack)、分栏(Split)和自适应(Auto)三种显示模式。Navigation组件适用于模块内和跨模块的路由切换。
导航页页面的结构:

@Entry
@Component
struct NavigationPage {
@Provide('pageInfos') pageInfos: NavPathStack = new NavPathStack()//定义页面栈保存页面路径
build() {
    Column() {
      Navigation(this.pageInfos) {
        ...//内容区定义
      }
      .title("导航组件标题")//设置导航的标题
      .mode(NavigationMode.Stack)//配置导航的模式
      .navDestination(...)//设置导航路径
      .menus(...)//定义顶部菜单
      .toolbarConfiguration(...)//配置底部导航栏即工具栏
    }

说明:

1.在上述导航页中定义的NavPathStack对象表示页面栈,采用了@Provide装饰,可以看作是“提供”给后代的状态变量。在此处,它可以提供给子页同时使用页面栈,用于记录子页的导航路径。注意:导航页的路径不会推入到NavPathStack页面栈中。
2.导航页使用Navigation组件
3.在Navigation组件中:

(1)title()函数设置导航页的标题
(2)mode()函数配置导航的模式,NavigationMode.Stack表示单页显示模式,NavigationMode.Split表示分栏显示,NavigationMode.Auto表示自动选择显示模式
(3)navDestination()函数指定导航的路径,所有的导航路径可以通过PageMap来定义。形如:
@Builder
PageMap(routerName:string){
…//定义根据routerName路由名称不同调用不同的页面``
}

(4)menus()函数定义顶部菜单栏的内容,各个菜单项由NavigationMenuItem数组或CustomBuilder两种类型构成。菜单栏在竖屏最多支持显示3个图标,横屏最多支持显示5个图标,多余的图标会被放入自动生成的更多图标。
(5)toolbarConfiguration()配置底部的工具栏。工具栏的单项由ToolbarItem组成,对toolbarConfiguration()函数传递ToolbarItem数组,可以生成底部工具栏的各个导航单项。

导航页的代码示例

@Entry
@Component
struct Index {
  //定义页面栈,子页也可以使用
  @Provide('pageInfos') pageInfos: NavPathStack = new NavPathStack()
  //定义顶部菜单项,子页也可以使用
  @Provide topMenuItems:NavigationMenuItem[] = [
    {value: "首页", icon: 'resources/base/media/startIcon.png', action: ()=> {this.pageInfos.pushPath({ name: "首页"})}},
    {value: "配置", icon: 'resources/base/media/setting.png', action: ()=> {this.pageInfos.pushPath({ name: "配置"})}},
    {value: "帮助和支持", icon:'resources/base/media/help.png', action: ()=> {this.pageInfos.pushPath({ name: "帮助和支持"})}}]

  //定义底部工具栏
  @State bottomMenuItems:ToolbarItem[] = [
    {'value': "首页", 'icon': $r("app.media.startIcon"), 'action': ()=> {this.pageInfos.pushPath({ name: "首页"})}},
    {'value': "配置", 'icon': $r("app.media.setting"), 'action': ()=> {this.pageInfos.pushPath({ name: "配置"})}},
    {'value': "帮助和支持", 'icon': $r("app.media.help"), 'action': ()=> {this.pageInfos.pushPath({ name: "帮助和支持"})}}]

  //定义导航路径的数组,其中"退出“对应退出的操作
  private routerTitles:string[] = ["首页","配置","帮助和支持","退出"]

  @Builder
  PageMap(name: string) {
    if (name === "首页") {
      pageOne()
    } else if (name === "配置") {
      pageTwo()
    } else if (name === "帮助和支持") {
      pageThree()
    }
  }

  build() {
    Column() {
      Navigation(this.pageInfos) {
        //内容区,自行定义
        TextInput({ placeholder: '检索...' })
          .width("90%")
          .height(40)
          .backgroundColor('#FFFFFF')

        List({ space: 12 }) {
          ForEach(this.routerTitles,(item:string)=>{
            ListItem(){
              Text(item)
                .width("100%")
                .height(72)
                .backgroundColor('#D2E76B')
                .borderRadius(24)
                .fontSize(16)
                .fontWeight(500)
                .textAlign(TextAlign.Center)
                .onClick(()=>{
                  if(item=="退出"){
                    (getContext(this) as common.UIAbilityContext)?.terminateSelf();
                  }
                  else
                      this.pageInfos.pushPath({ name: item})
                })
            }
          })
        }
        .width("90%")
        .margin({ top: 12 })
      }
      .title("导航组件测试示例")//设置导航的标题
      .mode(NavigationMode.Stack)//配置导航的模式
      .navDestination(this.PageMap)//设置导航路径
      .menus(this.topMenuItems)//定义顶部菜单
      .toolbarConfiguration(this.bottomMenuItems)//配置底部工具栏
    }
    .height('100%').width('100%').backgroundColor('#83B5FF')
  }
}

在这里插入图片描述
图1 导航页的运行效果

三、定义子页

子页的结构:

@Component
export struct pageOne {
  @Consume('pageInfos') pageInfos: NavPathStack;   //引用
  build() {
    NavDestination() {
      //内容区定义
    }.title("首页")//定义子页的标题
    .onBackPressed(() => {
      const popDestinationInfo = this.pageInfos.pop() // 弹出页面栈栈顶元素
      return true
    })
  }
}

说明:

(1) 子页自定义组件不是页面的入口组件,无需使用@Entry装饰,也不需要在resources/base/profile/main_pages.json中配置页面。
(2)在子页中@Consume 装饰的变量,用于“消费(绑定)”导航页提供的导航路径堆栈。
(3)子页中使用NavDestination是子页面的根容器,用于定义子页面。

调用NavDestination的title()函数设置独立的标题栏。
调用NavDestination的menus()函数设置子页的顶部菜单栏。

子页代码示例

//PageOne.ets
@Component
export struct pageOne {
  @Consume('pageInfos') pageInfos: NavPathStack;//使用导航页的页面栈
  @Consume('topMenuItems') topMenuItems:NavigationMenuItem[]//使用导航页的菜单项的定义
  build() {
    NavDestination() {
      Column() {
       
      }.width('100%').height('100%').backgroundColor(Color.Orange)
    }.title("首页")
    .menus(this.topMenuItems)//定义顶部菜单栏的菜单项
    .onBackPressed(() => {
      this.pageInfos.pop() // 弹出页面栈栈顶元素
      return true
    })
  }
}

在这里插入图片描述
图2 子页1的运行效果

//PageTwo.ets
@Component
export struct pageTwo{
  @Consume('pageInfos') pageInfos: NavPathStack;
  @Consume('topMenuItems') topMenuItems:NavigationMenuItem[]
  build() {
    NavDestination() {
      Column() {
      }.width('100%').height('100%').backgroundColor(Color.Blue)
    }.title("配置")
    .menus(this.topMenuItems)
    .onBackPressed(() => {
      this.pageInfos.pop() // 弹出页面栈栈顶元素
      return true
    })
  }
}

在这里插入图片描述
图3 子页2的运行效果

//PageThree.ets
@Component
export struct pageThree{
  @Consume('pageInfos') pageInfos: NavPathStack;
  @Consume('topMenuItems') topMenuItems:NavigationMenuItem[]
  
  build() {
    NavDestination() {
      Column() {
        
      }.width('100%').height('100%').backgroundColor(Color.Green)
    }.title("帮助和支持")
    .menus(this.topMenuItems)
    .onBackPressed(() => {
      this.pageInfos.pop() // 弹出页面栈栈顶元素
      return true
    })
  }
}

在这里插入图片描述
图4 子页3的运行效果

四、页面的路由处理

页面的路由处理表示从不同页面中进行跳转和切换,通过NavPathStack页面栈来实现。下表中展示了NavPathStack页面栈的常见函数实现不同页面的处理操作

函数说明
pushPath({name:“pageOne”,param:“somevalue”}跳转到name属性指定的路径名对应的页面;param表示传递的参数,也可不用
pushPathByName(“pageOne”,“somevalue”)跳转到name属性指定的路径名对应的页面,可以传递参数值
pop()返回上一页
popToName(‘pageOne’)返回路由路径名为pageOne对应的页面
popToIndex(1)返回索引为1的页面
clear()返回到根首页,清除页面栈
replacePath({name:“pageOne”,param:“somevalue”} )替换页面
replacePathByName(“pageOne”,“somevalue”)替换页面
修改PageTwo.ets,使之增加图片,并为图片配置点击交互处理,当点击该图片返回到首页(对应pageOne页面),代码如下:
@Component
export struct pageTwo{
  @Consume('pageInfos') pageInfos: NavPathStack;
  @Consume('topMenuItems') topMenuItems:NavigationMenuItem[]
  build() {
    NavDestination() {
      Column() {
        Text("配置说明").fontSize(50).fontColor(Color.White)
        Image("resources/base/media/startIcon.png")
          .width(60)
          .height(60)
          .margin(5)
          .position({x:260,y:600})
          .onClick(() => {
            this.getUIContext()?.animateTo({ duration: 1000 }, () => {
              this.pageInfos.pushPath({ name: '首页' }, false)//返回首页
            })
          })
      }.width('100%').height('100%').backgroundColor(Color.Blue)
    }.title("配置")
    .menus(this.topMenuItems)
    .onBackPressed(() => {
      this.pageInfos.pop() // 弹出路由栈栈顶元素
      return true
    })
  }
}

在这里插入图片描述
图5 修改后的页面2运行结果
当点击图片后,会跳转到首页。当在首页页面的标题栏的返回按钮时,因为执行了this.pageInfos.pop(),仍会返回到上一级的页面,就是上述图5展示的页面。

参考文献:

1.单页面布局示意图 https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/arkts-navigation-navigation-V5

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/922162.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于阿里云服务器部署静态的website

目录 一:创建服务器实例并connect 二:本地文件和服务器share 三:关于IIS服务器的安装预配置 四:设置安全组 五:建站流程 六:关于备案 一:创建服务器实例并connect 创建好的服务器实例在云…

mysql根据日期查询没有的日期也要显示数据

先查询出日期数据(当前日期往前推12个月) select bb.datefrom (select num : num 1,date_format(adddate(date_sub(date_sub(curdate(),interval 12 month),interval 1 month),interval num month), %Y-%m) as datefrom mysql.help_topic,(select num : 0) as twhere addd…

Go语言链接Redis数据库

1.使用go get命令安装go-redis/v8库: 我这里使用的vscode工具安装: go get github.com/go-redis/redis/v82.创建Redis客户端实例 使用以下Go代码连接到Redis服务器并执行命令: package mainimport ("context""fmt"&q…

1-测试go-redis缓存数据

1-测试go-redis缓存数据 1.go-redis缓存数据测试效果 a.测试页面 测试页面:--这里使用 Postman 来做测试 http://127.0.0.1:8000/article/getone/3 http://127.0.0.1:8000/article/getone/4 http://127.0.0.1:8000/article/getone/5b.测试效果 查看终端&#xf…

查看浏览器的请求头

爬虫时用到了请求头,虽然可以用网上公开的,但是还是想了解一下本机浏览器的。以 Edge 为例,其余浏览器通用。 打开浏览器任一网页,按F12打开DevTools;或鼠标右键,选择“检查”。首次打开界面应该显示在网页…

git branch -d 删除分支

Git进行版本控制时,删除分支是常见的操作。特别是当特定的功能开发完成或者分支不再需要时,删除分支可以帮助保持仓库的整洁。删除本地分支和删除远端分支是两个独立的操作。如果需要同时删除本地和远端的分支,需要分别执行以下两个命令。 一…

【漏洞复现】|智互联SRM智联云采系统quickReceiptDetail SQL注入漏洞

漏洞描述 智互联(深圳)科技有限公司SRM智联云采系统针对企业供应链管理难题,及智能化转型升级需求,智联云采依托人工智能、物联网、大数据、云等技术,通过软硬件系统化方案,帮助企业实现供应商关系管理和采购线上化、移动化、智能…

[论文阅读] 异常检测 Deep Learning for Anomaly Detection: A Review(三)总结梳理-疑点记录

《深度异常检测综述》总结梳理 目录 一、研究背景与挑战二、深度异常检测方法分类三、实验评估四、结论在这篇文章中,**异常检测的异构性**主要从以下几个方面来理解:如何理解多源数据融合的困难“学习正常性的特征表示”与“用于特征提取的深度学习”在…

linux下i2c开发与框架源码分析

目录 1 概述 2 I2c子系统框架 3 I2C的使用流程 3.1 在驱动里使用 3.2 在应用层使用 3.3 I2ctool的使用 4 为硬件i2c注册一个适配器 5 i2c子系统源码流程分析 5.1 i2c device与driver绑定过程 5.1.1 Driver的注册与处理 5.1.2 Client device的生成 5.2 I2c的发送与接…

学习路之phpstudy--安装mysql5.7后在my.ini文件中无法修改sql_mode

windows环境下使用phpstudy安装mysql5.7后需要修改mysql中的sql_mode配置,但是在phpstudy中打开mysql配置文件my.ini后, 通过查找找不到sql_mode或sql-mode, 此时无法在my.ini文件中直接进行修改,可以使用mysql命令进行修改&#…

【大数据学习 | Spark-Core】详解分区个数

RDD默认带有分区的,那么创建完毕rdd以后他的分区数量是多少? 从hdfs读取文件的方式是最正规的方式,我们通过计算原理可以推出blk的个数和分区数量是一致的,本地化计算。 我们可以发现数据的读取使用的是textInputFormat&#xff…

前端常用内容

Style 1. 文本左对齐 style"text-align: left;" 2. 文本居中 style"text-align: center;" 3. 文本右对齐 style"text-align: right;"margin 属性可以设置以下四种类型的外边距: 1. 单一值:为所有四个方向(上、…

免费微调自己的大模型(llama-factory微调llama3.1-8b)

目录 1. 名词/工具解释2. 微调过程3. 总结 本文主要介绍通过llama-factory框架,使用Lora微调方法,微调meta开源的llama3.1-8b模型,平台使用的是趋动云GPU算力资源。 微调已经经过预训练的大模型目的是,通过调整模型参数和不断优化…

pytest日志总结

pytest日志分为两类: 一、终端(控制台)打印的日志 1、指定-s,脚本中print打印出的信息会显示在终端; 2、pytest打印的summary信息,这部分是pytest 的默认输出(例如测试结果PASSED, FAILED, S…

labview关于文件路径的问题

在调用文件或拆分文件的时候经常会用到拆分路径函数和创建路径函数,最常用的也是当前应用程序目录或者是当前VI目录。 这里我们看到应用程序目录和VI目录在同一项目中,应用程序目录更像是根目录,往下拆分成了各个VI的子目录。 接下来我们来拆…

【MySQL课程学习】:MySQL安装,MySQL如何登录和退出?MySQL的简单配置

🎁个人主页:我们的五年 🔍系列专栏:MySQL课程学习 🌷追光的人,终会万丈光芒 🎉欢迎大家点赞👍评论📝收藏⭐文章 目录 MySQL在Centos 7环境下的安装: 卸载…

第二十一周机器学习笔记:动手深度学习之——数据操作、数据预处理

第二十周周报 摘要Abstract一、动手深度学习1. 数据操作1.1 数据基本操作1.2 数据运算1.2.1 广播机制 1.3 索引和切片 2. 数据预处理 二、复习RNN与LSTM1. Recurrent Neural Network(RNN,循环神经网络)1.1 词汇vector的编码方式1.2 RNN的变形…

SSM全家桶 1.Maven

或许总要彻彻底底地绝望一次 才能重新再活一次 —— 24.11.20 maven在如今的idea中已经实现自动配置,不需要我们手动下载 一、Maven的简介和快速入门 Maven 是一款为 Java 项目构建管理、依赖管理的工具(软件),使用 Maven 可以自动化构建测试、打包和发…

《Python 股票交易分析:开启智能投资新时代》(二)

Python 进行股票交易分析的优势 简洁易读:Python 的语法简洁明了,即使是编程新手也能较快上手,降低了股票交易分析的门槛。 Python 的简洁易读是其在股票交易分析中受欢迎的重要原因之一。Python 的语法简洁明了,与其他编程语言相…

cangjie (仓颉) vscode环境搭建

sdk下载 下载中心-仓颉编程语言官网 可选择半年更新版,不用申请。目前版本:0.53.13 ,选择不同平台压缩包下载解压到任意位置即可 补充下载,vscode插件解压后,在vscode扩展中选择从vsix安装,安装后新增名为…