49.HarmonyOS鸿蒙系统 App(ArkUI)Tab导航组件的使用

本文详细介绍了如何在HarmonyOS鸿蒙系统的App中使用ArkUI框架实现Tab导航组件,包括顶部导航、底部导航的配置,以及TabContent和TabBar的结构与功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

HarmonyOS鸿蒙系统 App(ArkUI)Tab导航组件的使用

图片显示

Row()
{
  Image($r('app.media.leaf')).height(100).width(100)
  Image($r('app.media.icon')).height(100).width(100)
}

 

左侧导航 

 

import prompt from '@ohos.prompt';
import promptAction from '@ohos.promptAction';
@Entry
@Component
struct Index {
  @State message: string = 'Hello World'
  @State handlePopup: boolean = false
  build() {
   // Tabs() { //默认顶部导航
     // Tabs({ barPosition: BarPosition.End }) { //设置底部导航
    Tabs({ barPosition: BarPosition.Start }) { //设置顶部部导航
      TabContent() {
        Column()
        {

          Row()
          {
            Image($r('app.media.leaf')).height(100).width(100)
            Image($r('app.media.icon')).height(100).width(100)
          }
          Row(){
            Text('工号:')
            TextInput({text:'tintel10699487'}).backgroundColor(Color.Yellow)

          }
          Row(){
            Button('确定')

          }
          Row(){
            Text('首页的内容').fontSize(30)
            Button('查看')
          }
          Row(){
            Text('首页的内容2').fontSize(30)
            Button('查看2')
          }
        }

      }
      .tabBar('首页').backgroundColor(Color.Green)

      TabContent() {
        Column()
        {
          Row()
          {
            Text('这里是推荐的内容').fontSize(30)
          }
          Row()
          {
            Text('这里是推荐的内容2').fontSize(30)
          }
          Row()
          {
            Text('这里是推荐的内容3').fontSize(30)
          }
          Row()
          {
            Text('这里是推荐的内容4').fontSize(30)
          }
          Row()
          {
            Text('这里是推荐的内容5').fontSize(30)
          }
        }


      }
      .tabBar('推荐')
      .backgroundColor(Color.Yellow)

      TabContent() {
        Text('发现的内容').fontSize(30)

      }
      .tabBar('发现')

      TabContent() {
        Column(){
          Row()
          {
            Text('姓名:').fontSize(30).fontColor(Color.White)
            TextInput({text:"书书航"}).fontSize(30).fontColor(Color.Green)
          }
          Row()
          {
            Text('职业:').fontSize(30).fontColor(Color.White)
            TextInput({text:"工程师"}).fontSize(30).fontColor(Color.Green)
          }
          Row()
          {
            Text('爱好:').fontSize(30).fontColor(Color.White)
            TextInput({text:"音乐"}).fontSize(30).fontColor(Color.Green)
          }
          Row()
          {
            Text('户籍:').fontSize(30).fontColor(Color.White)
            TextInput({text:"CHN"}).fontSize(30).fontColor(Color.Green)
          }
          Row()
          {
            Text('地区:').fontSize(30).fontColor(Color.White)
            TextInput({text:"SHH"}).fontSize(30).fontColor(Color.Green)
          }
          Row()
          {
            Button('编辑').fontSize(30).fontColor(Color.White)
            Button('确认').fontSize(30).fontColor(Color.White)
          }
        }


      }
      .tabBar("我的")
        .backgroundColor(Color.Blue)

    }.vertical(true)
  }
}

 

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

图1 Tabs组件布局示意图

说明

  • TabContent组件不支持设置通用宽度属性,其宽度默认撑满Tabs父组件。
  • TabContent组件不支持设置通用高度属性,其高度由Tabs父组件高度与TabBar组件高度决定。

Tabs使用花括号包裹TabContent,如图2,其中TabContent显示相应的内容页。

图2 Tabs与TabContent使用

每一个TabContent对应的内容需要有一个页签,可以通过TabContent的tabBar属性进行配置。在如下TabContent组件上设置属性tabBar,可以设置其对应页签中的内容,tabBar作为内容的页签。


  1. TabContent() {
  2. Text('首页的内容').fontSize(30)
  3. }
  4. .tabBar('首页')

设置多个内容时,需在Tabs内按照顺序放置。


  1. Tabs() {
  2. TabContent() {
  3. Text('首页的内容').fontSize(30)
  4. }
  5. .tabBar('首页')
  6. TabContent() {
  7. Text('推荐的内容').fontSize(30)
  8. }
  9. .tabBar('推荐')
  10. TabContent() {
  11. Text('发现的内容').fontSize(30)
  12. }
  13. .tabBar('发现')
  14. TabContent() {
  15. Text('我的内容').fontSize(30)
  16. }
  17. .tabBar("我的")
  18. }

 

顶部导航:

设置:Tabs({ barPosition: BarPosition.Start }) { //设置顶部部导航
设置:}.vertical(false)

import prompt from '@ohos.prompt';
import promptAction from '@ohos.promptAction';
@Entry
@Component
struct Index {
  @State message: string = 'Hello World'
  @State handlePopup: boolean = false
  build() {
   // Tabs() { //默认顶部导航
     // Tabs({ barPosition: BarPosition.End }) { //设置底部导航
    Tabs({ barPosition: BarPosition.Start }) { //设置顶部部导航
      TabContent() {
        Column()
        {

          Row()
          {
            Image($r('app.media.leaf')).height(100).width(100)
            Image($r('app.media.icon')).height(100).width(100)
          }
          Row(){
            Text('工号:')
            TextInput({text:'tintel10699487'}).backgroundColor(Color.Yellow)

          }
          Row(){
            Button('确定')

          }
          Row(){
            Text('首页的内容').fontSize(30)
            Button('查看')
          }
          Row(){
            Text('首页的内容2').fontSize(30)
            Button('查看2')
          }
        }

      }
      .tabBar('首页').backgroundColor(Color.Green)

      TabContent() {
        Column()
        {
          Row()
          {
            Text('这里是推荐的内容').fontSize(30)
          }
          Row()
          {
            Text('这里是推荐的内容2').fontSize(30)
          }
          Row()
          {
            Text('这里是推荐的内容3').fontSize(30)
          }
          Row()
          {
            Text('这里是推荐的内容4').fontSize(30)
          }
          Row()
          {
            Text('这里是推荐的内容5').fontSize(30)
          }
        }


      }
      .tabBar('推荐')
      .backgroundColor(Color.Yellow)

      TabContent() {
        Text('发现的内容').fontSize(30)

      }
      .tabBar('发现')

      TabContent() {
        Column(){
          Row()
          {
            Text('姓名:').fontSize(30).fontColor(Color.White)
            TextInput({text:"书书航"}).fontSize(30).fontColor(Color.Green)
          }
          Row()
          {
            Text('职业:').fontSize(30).fontColor(Color.White)
            TextInput({text:"工程师"}).fontSize(30).fontColor(Color.Green)
          }
          Row()
          {
            Text('爱好:').fontSize(30).fontColor(Color.White)
            TextInput({text:"音乐"}).fontSize(30).fontColor(Color.Green)
          }
          Row()
          {
            Text('户籍:').fontSize(30).fontColor(Color.White)
            TextInput({text:"CHN"}).fontSize(30).fontColor(Color.Green)
          }
          Row()
          {
            Text('地区:').fontSize(30).fontColor(Color.White)
            TextInput({text:"SHH"}).fontSize(30).fontColor(Color.Green)
          }
          Row()
          {
            Button('编辑').fontSize(30).fontColor(Color.White)
            Button('确认').fontSize(30).fontColor(Color.White)
          }
        }


      }
      .tabBar("我的")
        .backgroundColor(Color.Blue)

    }.vertical(false)
  }
}

 

 

底部导航:

设置:Tabs({ barPosition: BarPosition.End}) { //设置底部导航
设置:}.vertical(false)

 

 

import prompt from '@ohos.prompt';
import promptAction from '@ohos.promptAction';
@Entry
@Component
struct Index {
  @State message: string = 'Hello World'
  @State handlePopup: boolean = false
  build() {
   // Tabs() { //默认顶部导航
      Tabs({ barPosition: BarPosition.End }) { //设置底部导航
    //Tabs({ barPosition: BarPosition.Start }) { //设置顶部部导航
      TabContent() {
        Column()
        {

          Row()
          {
            Image($r('app.media.leaf')).height(100).width(100)
            Image($r('app.media.icon')).height(100).width(100)
          }
          Row(){
            Text('工号:')
            TextInput({text:'tintel10699487'}).backgroundColor(Color.Yellow)

          }
          Row(){
            Button('确定')

          }
          Row(){
            Text('首页的内容').fontSize(30)
            Button('查看')
          }
          Row(){
            Text('首页的内容2').fontSize(30)
            Button('查看2')
          }
        }

      }
      .tabBar('首页').backgroundColor(Color.Green)

      TabContent() {
        Column()
        {
          Row()
          {
            Text('这里是推荐的内容').fontSize(30)
          }
          Row()
          {
            Text('这里是推荐的内容2').fontSize(30)
          }
          Row()
          {
            Text('这里是推荐的内容3').fontSize(30)
          }
          Row()
          {
            Text('这里是推荐的内容4').fontSize(30)
          }
          Row()
          {
            Text('这里是推荐的内容5').fontSize(30)
          }
        }


      }
      .tabBar('推荐')
      .backgroundColor(Color.Yellow)

      TabContent() {
        Text('发现的内容').fontSize(30)

      }
      .tabBar('发现')

      TabContent() {
        Column(){
          Row()
          {
            Text('姓名:').fontSize(30).fontColor(Color.White)
            TextInput({text:"书书航"}).fontSize(30).fontColor(Color.Green)
          }
          Row()
          {
            Text('职业:').fontSize(30).fontColor(Color.White)
            TextInput({text:"工程师"}).fontSize(30).fontColor(Color.Green)
          }
          Row()
          {
            Text('爱好:').fontSize(30).fontColor(Color.White)
            TextInput({text:"音乐"}).fontSize(30).fontColor(Color.Green)
          }
          Row()
          {
            Text('户籍:').fontSize(30).fontColor(Color.White)
            TextInput({text:"CHN"}).fontSize(30).fontColor(Color.Green)
          }
          Row()
          {
            Text('地区:').fontSize(30).fontColor(Color.White)
            TextInput({text:"SHH"}).fontSize(30).fontColor(Color.Green)
          }
          Row()
          {
            Button('编辑').fontSize(30).fontColor(Color.White)
            Button('确认').fontSize(30).fontColor(Color.White)
          }
        }


      }
      .tabBar("我的")
        .backgroundColor(Color.Blue)

    }.vertical(false)
  }
}

 

<think>好的,用户需要基于HarmonyOS的菜谱App代码示例,包含多个容器组件如Column、Row、Stack、Grid、List、Swiper和Tabs。首先,我需要回忆这些组件的基本用法和如何在HarmonyOS中组合它们。首先,整体布局可能需要使用Tabs来切换不同的页面,比如首页、分类和个人中心。每个Tab对应的页面可以用不同的容器组件来构建。例如,首页可能包含一个Swiper轮播图展示推荐菜谱,接着用Grid展示分类,然后用List显示热门菜谱列表。接下来,Column和Row用于垂直和水平排列子组件。比如,每个菜谱卡片可以用Column包含图片和文字描述,文字部分用Row来排列菜谱名称和收藏按钮。Stack可能用于叠加元素,比如在图片上叠加一个评分标签。 Swiper组件需要设置自动播放和分页指示器,展示多个图片。Grid需要定义具体的列数和每个格子中的内容,比如分类图标和名称。List则需要绑定数据源,动态生成多个列表项,每个列表项使用Row或Column布局。 另外,用户可能希望代码结构清晰,符合ArkUI的语法规范,比如使用@Entry和@Component装饰器,正确导入所需的模块。还需要注意样式设置,如宽高、边距、字体大小等,确保界面美观。可能遇到的问题是如何在Tabs中管理不同页面的内容,确保切换流畅。同时,动态数据的绑定和事件处理,比如点击菜谱跳转到详情页,需要合理使用路由功能。需要参考HarmonyOS的文档,确保API使用正确,比如router.pushUrl方法。 最后,生成相关问题时要考虑用户可能进一步询问的优化方法、数据绑定细节或特定组件的深入使用。确保回答真实可靠,引用相关示例时标注来源,但用户提供的引用似乎与菜谱App无关,需注意不要混淆。</think>以下是一个基于HarmonyOS的菜谱App核心代码示例,包含主要容器组件的实现: ```typescript // 主页框架 @Entry @Component struct RecipeMain { @State currentTab: number = 0 build() { Tabs({ barPosition: BarPosition.Bottom }) { TabContent() { // 首页 Column() { // 轮播图区域 Swiper() { Image($r('app.media.banner1')).width('100%').height(200) Image($r('app.media.banner2')).width('100%').height(200) Image($r('app.media.banner3')).width('100%').height(200) } .autoPlay(true) .indicator(true) .loop(true) // 分类网格 Grid() { GridItem() { RecipeCategory('热菜', $r('app.media.hot')) } GridItem() { RecipeCategory('凉菜', $r('app.media.cold')) } GridItem() { RecipeCategory('汤羹', $r('app.media.soup')) } } .columnsTemplate('1fr 1fr 1fr') .columnsGap(10) .rowsGap(10) .padding(10) // 推荐列表 List({ space: 10 }) { ForEach(recipeData, (item) => { ListItem() { RecipeItem(item) } }) } .height('40%') } }.tabBar('首页') TabContent() { // 分类页 Column() { // 分类筛选组件 } }.tabBar('分类') TabContent() { // 个人中心 Stack() { Image($r('app.media.bg')) Column() { AvatarComponent() UserInfoPanel() } } }.tabBar('我的') } } } // 菜谱项组件 @Component struct RecipeItem { private item: Recipe build() { Row() { Image(this.item.image) .width(80) .height(80) .borderRadius(8) Column() { Text(this.item.title) .fontSize(16) .fontWeight(500) Row() { Image($r('app.media.star')) .width(12) .height(12) Text(this.item.rating.toString()) } }.layoutWeight(1) } .padding(10) .backgroundColor('#FFF') .borderRadius(8) } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

txwtech笛克电科

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值