当前位置: 首页 > news >正文

鸿蒙应用开发:使用Navigation组件和Tab组件实现首页tab选项卡及子页跳转功能

文章目录

  • 了解navigation组件和tab组件
    • navigation组件
    • tab组件
  • 使用navigation和tab实现首页tab切换及子页面跳转
    • 创建项目略
    • 编写Index.ets文件(默认UI入口组件)
    • 编写MyTabs.ets文件
    • 编写Other.ets文件
    • 编写路由规则
      • 编辑module.json5文件
      • 编写router_map.json
  • 实现效果

了解navigation组件和tab组件

navigation组件

官方文档
组件导航(Navigation)主要用于实现Navigation页面(NavDestination)间的跳转,支持在不同Navigation页面间传递参数,提供灵活的跳转栈操作,从而更便捷地实现对不同页面的访问和复用。

Navigation是路由导航的根视图容器,一般作为页面(@Entry)的根容器,包括单栏(Stack)、分栏(Split)和自适应(Auto)三种显示模式。

Navigation组件主要包含​导航页和子页。导航页由标题栏(包含菜单栏)、内容区和工具栏组成,可以通过hideNavBar属性进行隐藏,导航页不存在路由栈中,与子页,以及子页之间可以通过路由操作进行切换。

在组件导航(Navigation)框架下,“页面”通过NavDestination组件承载,特指一个NavDestination组件包含的内容。

Navigation组件和NavDestination组件必须配合使用,被跳转的子页面需要被NavDestination组件包裹,Navigation组件创建时需要传入NavPathStack对象方可实现页面跳转

tab组件

官方文档
Tabs组件的页面组成包含两个部分,分别是TabContent和TabBar。TabContent是内容页,TabBar是导航页签栏,页面结构如下图所示,根据不同的导航类型,布局会有区别,可以分为底部导航、顶部导航、侧边导航,其导航栏分别位于底部、顶部和侧边。
在这里插入图片描述

使用navigation和tab实现首页tab切换及子页面跳转

创建项目略

编写Index.ets文件(默认UI入口组件)

该页面组件build()方法添加根组件为navigation组件,内容为空,通过导航控制器直接跳转至MyTabs子页面(子页面必须被NavDestination组件包裹才可实现跳转)


@Entry
@Component
struct Index {// 创建导航控制器对象private navPathStack: NavPathStack = new NavPathStack();aboutToAppear(): void {// 使用AppStorage存取NavPathStack,全局共用一个NavPathStack对象AppStorage.setOrCreate("navPathStack",this.navPathStack)this.navPathStack.pushPathByName("MyTabs",null)}build() {// Navigation组件是路由导航的根视图容器,一般作为Page页面的根容器使用。// Navigation路由相关的操作都是基于导航控制器NavPathStack提供的方法进行,// 每个Navigation都需要创建并传入一个NavPathStack对象,// 用于管理页面。主要涉及页面跳转、页面返回、页面替换、页面删除、参数获取、路由拦截等功能。// 被跳转页面UI必须被NavDestination组件包裹才可实现跳转,否则会报错NavDestination not found且跳转页为空白Navigation(this.navPathStack){}.mode(NavigationMode.Stack)//NavigationMode设置模式单栏、双栏或自动,stack为单栏// 设置是否隐藏导航栏。设置为true时,隐藏Navigation的导航栏,包括标题栏、内容区和工具栏。// 如果此时路由栈中存在NavDestination页面,则直接显示栈顶NavDestination页面,反之显示空白。// 设置后该页面不会出现在导航栈中,即不可返回到该页面.hideNavBar(true)}
}

编写MyTabs.ets文件

该页面根组件为NavDestination组件,如无该组件,则跳转不成功报错:NavDestination not found,在该页面中使用tab组件实现一个简单且常用的选项卡功能


// 对外暴露MyTabsBuilder方法
@Builder
export function MyTabsBuilder(){// 调用组件MyTabs()
}@Component
struct MyTabs{private tabInfo:Array<string> = ["tab1","tab2","tab3",]//从AppStorage获取navPathStack要确定非空值,结尾加“!”号private navPathStack :NavPathStack = AppStorage.get<NavPathStack>("navPathStack")!;build() {// 所有被跳转的子页面都要被NavDestination组件包裹才可以实现跳转,否则会报错NavDestination not found且跳转页为空白NavDestination(){//barPosition可设置tabs选项卡导航位置,end为底部导航Tabs({ barPosition: BarPosition.End }) {ForEach(this.tabInfo,(item:string)=>{TabContent(){Button(item).onClick(()=>{this.navPathStack.pushPathByName("Other",null)})}//设置底部导航页签,可自定义模板样式.tabBar(item)})}}}
}

编写Other.ets文件

@Builder
export function OtherBuilder(){Other()
}@Component
struct Other{build() {// 所有被跳转的子页面都要被NavDestination组件包裹才可以实现跳转,否则会报错NavDestination not found且跳转页为空白NavDestination(){Text("其他页").fontColor(Color.Black).width("100%").height("100%").textAlign(TextAlign.Center).fontSize(18).fontWeight(FontWeight.Bolder)}}
}

编写路由规则

编辑module.json5文件

在src/main/module.json5文件中module字段下添加"routerMap": “$profile:router_map”,

{"module": {"name": "entry","type": "entry","description": "$string:module_desc","mainElement": "EntryAbility",
//    此处添加routerMap路由表,指定读取路由表文件位置"routerMap": "$profile:router_map","deviceTypes": ["phone"],"deliveryWithInstall": true,"installationFree": false,"pages": "$profile:main_pages","abilities": [{"name": "EntryAbility","srcEntry": "./ets/entryability/EntryAbility.ets","description": "$string:EntryAbility_desc","icon": "$media:layered_image","label": "$string:EntryAbility_label","startWindowIcon": "$media:startIcon","startWindowBackground": "$color:start_window_background","exported": true,"skills": [{"entities": ["entity.system.home"],"actions": ["action.system.home"]}]}],"extensionAbilities": [{"name": "EntryBackupAbility","srcEntry": "./ets/entrybackupability/EntryBackupAbility.ets","type": "backup","exported": false,"metadata": [{"name": "ohos.extension.backup","resource": "$profile:backup_config"}],}]}
}

编写router_map.json

在src/main/resources/base/profile中创建router_map.json文件,添加路由规则

{"routerMap" : [{"name" : "MyTabs","pageSourceFile"  : "src/main/ets/pages/MyTabs.ets","buildFunction" : "MyTabsBuilder"},{"name" : "Other","pageSourceFile"  : "src/main/ets/pages/Other.ets","buildFunction" : "OtherBuilder"}]
}

实现效果

在这里插入图片描述
在这里插入图片描述

http://www.dtcms.com/a/294660.html

相关文章:

  • 第一次实习经历
  • Java——Spring中Bean配置核心规则:id、name、ref的用法与区别
  • freqtrade在docker运行一个dryrun实例
  • 内容梳理|新手体会大模型AI接口调用
  • EDoF-ToF: extended depth of field time-of-flight imaging解读, OE 2021
  • 《WebGL打造高性能3D粒子特效系统:从0到1的技术探秘》
  • AR维修辅助系统UI设计:虚实融合界面中的故障标注与操作引导
  • nginx.conf配置文件以及指令详解
  • 暑期自学嵌入式——Day06(C语言阶段)
  • 红松推出国内首个银发AI播客产品,首创“边听边问”交互体验
  • 5.综合案例 案例演示
  • [硬件电路-76]:无论是波长还是时间,还是能量维度来看,频率越高,越走进微观世界,微观世界的影响越大;频率越低,越走进宏观世界,微观世界的影响越小;
  • 销采一体化客户管理系统核心要点速通
  • IDEA202403 超好用设置【持续更新】
  • SAP第二季度利润大增但云业务疲软,股价承压下跌
  • 【笔记】Handy Multi-Agent Tutorial 第三章: CAMEL框架简介及实践(实践部分)
  • HCIP笔记(第一、二章)
  • 电商项目_秒杀_压测
  • 策略模式(Strategy Pattern)+ 模板方法模式(Template Method Pattern)的组合使用
  • 水泥厂码垛环节的协议转换实践:从Modbus TCP到DeviceNet
  • opencv学习(图像读取)
  • CPU,减少晶体管翻转次数的编码
  • haproxy算法
  • LSTM学习笔记
  • unity小:webgl开发注意事项(持续更新)
  • 2025年7月Nature子刊-Adam梯度下降优化算法Adam Gradient Descent-附Matlab免费代码
  • CVE-2025-32463漏洞:sudo权限提升漏洞全解析
  • OpenLayers 快速入门(五)Controls 对象
  • 西安旅游行业从业者:凤凰新闻怎么发稿有哪些注意事项
  • 编程日常开发工具整理