1. 整体架构

采用鸿蒙原生Tabs + TabContent组件实现底部导航,Tabs作为导航容器,TabContent承载每个页面内容,通过配置将导航栏固定在页面底部。

2. 状态管理

使用@State装饰器定义currentIndex,记录当前选中的Tab索引;TabsonChange事件监听切换动作,实时更新索引值,驱动UI状态刷新。

3. 自定义Tab样式

通过@Builder装饰器封装通用导航栏构建函数,接收索引、标题、默认图标、选中图标四个参数,通过三目运算符判断当前索引是否为选中态,自动切换图标和文字颜色,实现统一的导航栏样式。

4. 关键配置

  • barPosition(BarPosition.End):将导航栏固定在底部
  • scrollable(false):禁止页面滑动切换,贴合常规App交互
  • 固定导航栏高度、设置背景色,保证UI规整

完整精简代码

@Entry
@Component
struct BarCustomPage {
  @State currentIndex: number = 0;

  build() {
    Tabs() {
      TabContent() {
        Text('首页')
      }.tabBar(this.barBuilder(0, '主页', $r('app.media.icon_home'), $r('app.media.icon_home_selected')))

      TabContent() {
        Text('消息')
      }.tabBar(this.barBuilder(1, '消息', $r('app.media.icon_message'), $r('app.media.icon_message_selected')))

      TabContent() {
        Text('我的')
      }.tabBar(this.barBuilder(2, '我的', $r('app.media.icon_mine'), $r('app.media.icon_mine_selected')))
    }
    .barPosition(BarPosition.End)
    .scrollable(false)
    .onChange((index: number) => {
      this.currentIndex = index;
    })
    .backgroundColor('#FFFFFF')
    .width('100%')
  }

  @Builder
  barBuilder(index: number, title: string, icon: Resource, iconSelected: Resource) {
    Column() {
      Image(this.currentIndex === index ? iconSelected : icon)
        .width(25)
        .height(25)
      Text(title)
        .fontSize(12)
        .fontColor(this.currentIndex === index ? '#0491d1' : '#8a8a8a')
        .fontWeight(FontWeight.Medium)
    }
    .justifyContent(FlexAlign.Center)
    .height(56)
  }
}

🔥 专属服务

【关于我】

  • CSDN 技术分享者
  • 专注[各种技术]分享
  • 已帮助10000+开发者

【能帮你】

  • 🎯 技术答疑
  • 📚 学习规划
  • 💼 项目指导

**📱 添加微信:最下方的微信名片(备注"CSDN")

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐