承接上一篇项目基础本篇实现APP核心主页架构底部Tab导航栏 多页面滑动切换。采用鸿蒙官方原生 Tabs 组件开发简化项目结构无需额外冗余数据文件所有代码就近编写、逻辑清晰适合新手学习。本篇学习目标规范项目目录实现主页子页面统一分类管理掌握鸿蒙原生 Tabs / TabContent 底部导航组件使用方法掌握 interface 自定义类型规范Tab数据格式学会SVG单图标动态变色技巧实现Tab选中/未选中状态切换实现Tab点击、页面滑动双向联动高亮效果一、最终项目目录结构整理主页页面资源将四个Tab子页面统一收纳精简多余文件目录清晰pages ├─ Index.ets // 项目全局入口、全局导航栈挂载 ├─ Start.ets // 广告启动过渡页 ├─ Layout.ets // 主页容器、底部Tab导航核心页面 └─ home // 主页子页面统一文件夹 ├─ Recommend.ets // 推荐页 ├─ Find.ets // 发现页 ├─ Dynamic.ets // 动态页 └─ Mine.ets // 我的页二、创建四个主页子页面在pages/home目录下新建4个空白ArkTS文件均为纯展示组件无需路由注册仅由主页Tabs组件托管必须添加export导出供外部导入使用。1. Recommend.ets 推荐页/** * 推荐页 * 主页Tab子页面纯展示组件 * 后续扩展首页轮播、歌单推荐、热门音乐列表 */ Component export struct Recommend { build() { Column() { Text(音乐推荐页) .fontSize(24) .fontColor(#ffffff) .fontWeight(FontWeight.Bold) } .width(100%) .height(100%) .backgroundColor(#131215) .justifyContent(FlexAlign.Center) } }2. Find.ets 发现页/** * 发现页 * 主页Tab子页面纯展示组件 * 后续扩展音乐榜单、分类歌单、活动推荐 */ Component export struct Find { build() { Column() { Text(音乐发现页) .fontSize(24) .fontColor(#ffffff) .fontWeight(FontWeight.Bold) } .width(100%) .height(100%) .backgroundColor(#131215) .justifyContent(FlexAlign.Center) } }3. Dynamic.ets 动态页/** * 动态页 * 主页Tab子页面纯展示组件 * 后续扩展用户音乐动态、好友分享、资讯推送 */ Component export struct Dynamic { build() { Column() { Text(音乐动态页) .fontSize(24) .fontColor(#ffffff) .fontWeight(FontWeight.Bold) } .width(100%) .height(100%) .backgroundColor(#131215) .justifyContent(FlexAlign.Center) } }4. Mine.ets 我的页/** * 我的页 * 主页Tab子页面纯展示组件 * 后续扩展个人中心、收藏歌单、本地音乐、系统设置 */ Component export struct Mine { build() { Column() { Text(个人中心-我的页) .fontSize(24) .fontColor(#ffffff) .fontWeight(FontWeight.Bold) } .width(100%) .height(100%) .backgroundColor(#131215) .justifyContent(FlexAlign.Center) } }三、Layout主页核心代码最终版所有Tab数据、类型定义就近写在当前页面使用官方 Tabs 组件实现底部导航自带滑动切换、状态联动代码精简无冗余可直接编译运行。import { Recommend } from ./home/Recommend import { Find } from ./home/Find import { Dynamic } from ./home/Dynamic import { Mine } from ./home/Mine // 定义一个类 interface TabClass { text : string, icon : ResourceStr } Builder export function LayoutBuilder() { Layout(); // 对应你的 struct 名字 } Component export struct Layout { navPathStack: NavPathStack new NavPathStack() State textColorIndex : number 0; tabData: TabClass[] [ {text:推荐, icon: $rawfile(ic_recommend.svg)}, {text:发现,icon:$rawfile(ic_find.svg)}, {text:动态,icon:$rawfile(ic_moment.svg)}, {text: 我的, icon: $rawfile(ic_mine.svg)}, ] Builder tarBuilder(item: TabClass, index: number) { Column({ space: 5 }) { Image(item.icon).width(24).fillColor(this.textColorIndexindex?#E85a88:#63AAAA) Text(item.text).font({ size: 14 }).fontColor(this.textColorIndexindex?#E85a88:#63AAAA) } } build() { NavDestination() { // barPosition: BarPosition.End 菜单至于底部。 Tabs({ barPosition: BarPosition.End }) { ForEach(this.tabData, (item: TabClass, index) { TabContent() { // 推荐页直接用你写好的 Recommend1 组件 if (index 0) { Recommend() // 推荐 } else if (index 1) { Find() // 发现 } else if (index 2) { Dynamic() // 动态 } else if (index 3) { Mine() // 我的 } else { // 其他页面先放个占位文本 Column() { Text(${item.text}页面).fontSize(20) }.width(100%).height(100%).justifyContent(FlexAlign.Center) } }.tabBar(this.tarBuilder(item, index)) .backgroundColor(#131215) }) }.backgroundColor(#3B3F42) .onChange((index) { this.textColorIndex index }) }.onReady((ctx: NavDestinationContext) { // 获取共享的导航栈 this.navPathStack ctx.pathStack; }) } }四、核心知识点讲解1. Tabs 组件核心作用鸿蒙官方专用标签页组件适配底部导航场景原生支持手势滑动、页面切换动画、状态监听无需手动封装滑动逻辑稳定性和性能优于自定义布局。2. interface 类型作用用于约束Tab数据结构固定数据字段格式书写数据时有代码提示、编译校验避免字段写错、漏写导致的报错。3. SVG动态变色原理通过fillColor属性结合当前选中下标动态修改图标、文字颜色仅需一套图标资源即可实现选中/未选中两种视觉状态精简资源和代码。4. 双向联动逻辑点击Tab修改currentIndex实现页面切换滑动页面触发onChange更新下标同步Tab高亮状态双向联动无延迟。五、新手常见报错解决子页面模块报错子页面 struct 必须添加 export 导出导入路径补全 .ets 后缀图标不显示确认SVG图标放入 rawfile 目录文件名与代码一致高亮不生效确认切换事件正常更新 currentIndex 状态变量路由异常LayoutBuilder 必须保留 name、param 标准参数本篇总结本篇完成了项目标准主页架构开发通过原生Tabs组件实现完整底部导航功能目录结构整洁、代码精简无冗余掌握了鸿蒙底部导航的标准开发方式为后续首页UI、音乐功能迭代打好基础。下篇预告下一篇开发推荐页完整高颜值UI实现顶部搜索栏、首页轮播图、热门歌单卡片布局。
企业数字化 ERP 产品动态
相关推荐
如何通过Obsidian日历插件构建时间驱动的知识管理系统 如何通过Obsidian日历插件构建时间驱动的知识管理系统 【免费下载链接】obsidian-calendar-plugin Simple calendar widget for Obsidian. 项目地址: https://gitcode.com/gh_mirrors/ob/obsidian-calendar-plugin
在知识管理过程中,时间维度的缺失常常导致信… · 2026/9/22 14:31:03
ChatBI+Agent实战:从NL2SQL到六层架构与落地评测 简介:《2024 ChatBI与智能体实战手册(八大案例,共一百三十四页)》是一份面向数据分析、大模型应用和商业智能从业者的实战资料,汇集平安人寿、滴滴、喜马拉雅、腾讯、快手、阿里巴巴、网易等多个企业团队的落地实践&am… · 2026/9/23 22:41:35
欧盟车牌图像数据集VOC格式解析:从VOTT标注到YOLO训练的完整流程 简介:这份资源是面向计算机视觉入门及进阶学习者的欧盟车牌图像数据集,包含534张真实行车场景下的车辆图片,均使用VOTT工具完成标注并输出VOC格式的XML标签文件,适用于目标检测、车牌识别、OCR等模型的训练与效果验证。数据采集覆… · 2026/9/23 22:41:34
药品板蓝根颗粒检测数据集110张VOC+YOLO格式:小样本目标检测实践指南 简介:面向目标检测入门与药品包装识别场景的板蓝根颗粒检测数据集,提供了111张袋装药品实拍图,并已按Pascal VOC与YOLO双格式完成标注。包内共335个文件,以jpg原图、xml标注和txt标注为主,其中111张图片对应111个xml文… · 2026/9/23 22:41:28
MMSE均衡原理与FPGA工程落地实战指南 简介:本资源是一份面向通信工程与数字信号处理初学者的MATLAB实践教学材料,聚焦多径信道下符号间干扰(ISI)的抑制问题,系统实现最小均方差(MMSE)均衡算法。资源包含2个核心MATLAB脚本文件&#… · 2026/9/23 22:41:28
基于PyQt5与OpenPose的姿态识别可视化:从骨架提取到关节角度分析 简介:基于PyQt5与OpenPose实现的太极拳姿态识别可视化系统,是一份完整可运行的毕业设计项目源码包,面向计算机相关专业正在准备毕设、课程设计或期末大作业的学生,也适合需要项目实战练习的Python学习者,可作为课程模板… · 2026/9/23 22:41:28
IEEE802.15.3a UWB信道模型:从参数解析到链路仿真避坑指南 简介:这份资源面向超宽带(UWB)通信方向的研究生、工程师与仿真开发者,聚焦IEEE 802.15.3a标准下的信道建模与冲击响应分析,帮助读者理解多径环境中的信号传播规律,为系统仿真、均衡同步与解调算法设计提供参… · 2026/9/23 22:41:22
3招搞定手机怎么下载微信面试难题实战项目解析 3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29