尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
HarmonyOS7 底部导航栏:Tabs 组件 5 分钟搞定多页签切换
文章目录前言Tabs 组件能干什么基础 Tab 布局自定义 TabBar 样式Tab 内容懒加载与 Navigation 联动写在最后前言做 App 首页十有八九要用到底部导航栏。我之前用自己写的方式实现代码一堆切换动画还卡。后来发现 HarmonyOS7 的 Tabs 组件5 分钟就能搞定而且自带丝滑切换。这篇聊聊 Tabs 组件怎么用从基础布局到自定义 TabBar再到懒加载和 Navigation 联动一次讲清楚。说实话我一开始没把 Tabs 当回事。觉得不就是个底部导航嘛自己画几个图标不就完了结果自己写了一版切换的时候白屏闪烁状态还各种丢。痛定思痛老老实实用 Tabs才发现真香——系统组件帮你想到了很多东西。Tabs 组件能干什么简单说Tabs 就是一个页签容器每个页签TabContent对应一个内容区点击页签切换内容。它能做的事底部导航栏微信那种底部 4 个 Tab点击切换页面顶部标签页今日头条那种频道切换侧边导航设置页面的分类导航自带滑动切换手指左右滑动就能切页预加载支持可以提前加载相邻页签切过去不卡划重点Tabs 的子组件只能是 TabContent而 TabContent 的直接子组件只能有一个。需要多个组件就套一个 Column 或 Row。基础 Tab 布局最简单的 Tabs3 行代码搞定Tabs(){TabContent(){Text(首页内容)}.tabBar(首页)TabContent(){Text(消息内容)}.tabBar(消息)TabContent(){Text(我的内容)}.tabBar(我的)}.barPosition(BarPosition.End)逐行讲解Tabs()是容器里面放TabContent子组件每个TabContent()包裹当前页签的内容.tabBar(首页)设置页签栏显示的文字.barPosition(BarPosition.End)把导航栏放底部默认是在顶部的就这样一个能滑动能点击的底部导航就出来了。不过默认样式比较素实际开发肯定要自定义。自定义 TabBar 样式默认的纯文字 TabBar 太丑了加上图标和选中态才像样。这就需要自定义 TabBarEntryComponentstruct MainPage{StatecurrentIndex:number0privatetabsController:TabsControllernewTabsController()BuildertabItemBuilder(icon:Resource,text:string,index:number){Column(){Image(this.currentIndexindex?icon:$r(app.media.ic_default)).width(24).height(24).fillColor(this.currentIndexindex?#007DFF:#999999)Text(text).fontSize(10).fontColor(this.currentIndexindex?#007DFF:#999999).margin({top:2})}.width(100%).height(100%).justifyContent(FlexAlign.Center)}build(){Column(){Tabs({controller:this.tabsController,index:this.currentIndex}){TabContent(){Text(首页内容区)}.tabBar(this.tabItemBuilder($r(app.media.ic_home_selected),首页,0))TabContent(){Text(消息内容区)}.tabBar(this.tabItemBuilder($r(app.media.ic_msg_selected),消息,1))TabContent(){Text(我的内容区)}.tabBar(this.tabItemBuilder($r(app.media.ic_mine_selected),我的,2))}.barPosition(BarPosition.End).onChange((index:number){this.currentIndexindex})}.width(100%).height(100%)}}关键代码讲解State currentIndex跟踪当前选中页签必须用 State否则切换不刷新 UITabsController控制器可以代码跳转页签比如this.tabsController.changeIndex(2)Builder tabItemBuilder是自定义 TabBar 的核心——根据currentIndex判断选中态切换图标和颜色.onChange()监听页签切换更新currentIndexicon: Resource参数类型用Resource这样能用$r()引用资源小技巧选中图标和未选中图标用同一个资源通过.fillColor()改颜色就行省得切两套图。Tab 内容懒加载Tabs 默认会把所有 TabContent 一口气加载。3 个 Tab 还好要是 5 个 6 个每个里面还请求数据启动就卡成狗。HarmonyOS7 提供了preloadItems方法可以按需预加载.onAppear((){try{this.tabsController.preloadItems([1])}catch(e){console.error(预加载失败: e)}}).onChange((index:number){this.currentIndexindexletpreloadList:number[][]if(index0){preloadList.push(index-1)}if(index4){preloadList.push(index1)}try{this.tabsController.preloadItems(preloadList)}catch(e){console.error(预加载失败: e)}})逻辑说明onAppear里预加载第 2 个页签用户大概率会切过去onChange里预加载当前页签的前后各一页preloadItems必须在 Tabs 和 Controller 绑定之后调用放aboutToAppear里会不生效务必try-catchController 没绑定时会抛异常说白了就是不提前全加载切到哪个附近就预加载哪个。用户体验不差性能还好。与 Navigation 联动实际项目中Tabs 通常嵌在 Navigation 的首页里子页面用 NavDestination 跳转。这是最经典的组合EntryComponentstruct IndexPage{ProvidenavPathStack:NavPathStacknewNavPathStack()StatecurrentIndex:number0build(){Navigation(this.navPathStack){Tabs({index:this.currentIndex}){TabContent(){HomePage()}.tabBar(首页)TabContent(){MessagePage()}.tabBar(消息)TabContent(){MinePage()}.tabBar(我的)}.barPosition(BarPosition.End).onChange((index:number){this.currentIndexindex})}.navDestination(this.pageMap).hideTitleBar(true)}BuilderpageMap(name:string){if(nameDetailPage){DetailPage()}elseif(nameSettingsPage){SettingsPage()}}}要点Navigation包在最外层Tabs 作为首页内容Provide navPathStack通过Consume在子页面里就能拿到不用层层传参子页面跳转用this.navPathStack.pushPathByName(DetailPage, null)navDestination做路由映射名字对应组件这种结构的好处是Tab 页签内的页面跳转和 Tab 切换互不干扰各管各的。写在最后Tabs 组件说简单也简单3 行代码能跑说复杂也复杂自定义样式、懒加载、Navigation 联动都要考虑。我的建议是先用最简版跑起来再逐步加自定义和优化。别一上来就搞复杂的自定义 TabBar容易把自己绕进去。
RELATED

相关推荐

终极本地图片搜索方案:基于.NET 10的千万级图库秒级检索工具完全指南

终极本地图片搜索方案:基于.NET 10的千万级图库秒级检索工具完全指南

终极本地图片搜索方案:基于.NET 10的千万级图库秒级检索工具完全指南 【免费下载链接】ImageSearch 基于.NET10的本地硬盘千万级图库以图搜图案例Demo和图片exif信息移除小工具分享 项目地址: https://gitcode.com/gh_mirrors/im/ImageSearch 你是否曾面对硬…

📅 2026/9/9 20:38:34
OpenClaw Cron:AI驱动的动态定时任务调度系统实践

OpenClaw Cron:AI驱动的动态定时任务调度系统实践

1. 项目背景与核心价值去年在开发智能客服系统时,我遇到了一个典型问题:每天凌晨需要自动生成前一天的客户服务报告,但传统定时任务框架无法适应动态变化的业务需求。比如双十一期间需要每小时生成一次报告,而平时只需要每日汇总。…

📅 2026/9/15 16:15:55
HarmonyOS ArkTS 实战:打造高评分音乐播放器与歌单管理应用

HarmonyOS ArkTS 实战:打造高评分音乐播放器与歌单管理应用

项目背景与效果 随着鸿蒙生态的日益壮大,使用 ArkTS 开发原生应用成为开发者必备技能。本项目从零开始,手把手带你实现一款功能完整、界面精美的音乐播放器与歌单管理应用,涵盖播放控制、进度条、歌词同步等核心能力,可直接运行于…

📅 2026/9/12 4:59:07
MORE NEWS

更多资讯

📰

Linux 内存不足时 OOM Killer 的选择逻辑与 cgroup 限制下的行为差异

Linux 内存不足时 OOM Killer 的选择逻辑与 cgroup 限制下的行为差异 1. 从一次线上被杀事件说起 先看一个很常见的场景。某台 8 核 16GB 的服务器上跑着一个 Java 服务和一个日志处理进程。凌晨两点,告警系统发出“服务不可用”,登录机器一看&#xff0…

📰

高校人事管理系统微服务架构设计与实践

1. 项目背景与核心需求高校人事管理系统作为教育机构数字化转型的核心组件,其复杂程度远超普通企业HR系统。我在参与某985高校信息化建设时深刻体会到:高校教师从入职到退休的全生命周期管理,涉及教学、科研、行政等多维度数据,传…

📰

STM32内部温度传感器ADC+DMA采样滤波与两点校准详解

简介:面向STM32入门与进阶开发者的完整Keil工程资源,演示如何利用STM32F103C8T6的ADC配合DMA方式读取芯片内部温度传感器,并经串口1输出温度数据。工程源码清晰实现了从ADC通道配置、DMA数据传输到USART串口发送的完整链路,适合学…

📰

PPT图片压缩全攻略:三个核心技巧,轻松为PPT演示文稿“瘦身”

做PPT的时候,很多人应该都碰到过这种情况:辛辛苦苦做好的演示文稿,图片一多,文件体积就大得吓人,发邮件发不出去,现场演示还容易卡顿,很影响效率。其实,文件大的“元凶”多半就是图片…

📰

Spring Boot考研培训管理系统开发实战

1. 项目概述与核心需求考研培训行业近年来呈现爆发式增长,传统的纸质化管理方式已经无法满足机构运营需求。文成考研培训管理系统正是针对这一痛点设计的全流程信息化解决方案。这个基于Spring Boot的毕业设计项目,旨在为中小型考研培训机构提供从学员管…

📰

RA8D2+TMC2660步进电机静音驱动方案详解

做运动控制这些年,步进电机的静音和平滑性一直是绕不开的话题。前段时间拿到一片瑞萨RA8D2系列主控(型号R7KA8D2KFLCAC,Cortex-M85内核,主频480MHz),就顺手把TMC2660驱动接上去,做了一套双极步进…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬