ArkUI Tabs:多页内容别都堆在一个页面里

举报
蓝瘦的蜕变 发表于 2026/09/02 14:54:13 2026/09/02
【摘要】 今天我们用 Tabs 把同一层级的内容拆成几页,让页面不再从头长到尾。 Tabs 的思路很直接:Tabs 管整体,TabContent 管每一页,tabBar 管标签文字。我们先用组件自己的切换能力,不额外记录当前索引,避免一上来就把主题带到状态管理。 第一块是顶部页签。barPosition: BarPosition

ArkUI Tabs:多页内容别都堆在一个页面里

今天我们用 Tabs 把同一层级的内容拆成几页,让页面不再从头长到尾。

Tabs 的思路很直接:Tabs 管整体,TabContent 管每一页,tabBar 管标签文字。我们先用组件自己的切换能力,不额外记录当前索引,避免一上来就把主题带到状态管理。

第一块是顶部页签。barPosition: BarPosition.Start 放在上面,barMode(BarMode.Fixed) 让几个标签均分宽度。参数少、标签少时,这种写法最稳。

第二块是底部页签。把 barPosition 改成 End,内容会先被看到,标签放到下面。它适合内容优先的页面,不是所有场景都该用,但作为布局能力值得认识。

第三块是可滚动标签。标签多了就别硬挤,用 BarMode.Scrollablescrollable(true) 让标签区自己处理横向空间。

你做过哪种最容易变长的页面?详情页、设置页,还是各种“说明 + 参数 + 示例”的教程页?

完整代码

class TabPanelInfo {
  title: string
  desc: string
  color: string

  constructor(title: string, desc: string, color: string) {
    this.title = title
    this.desc = desc
    this.color = color
  }
}

@Entry
@Component
struct ArkUITabsDemo {
  private panels: TabPanelInfo[] = [
    new TabPanelInfo('概览', '把同一类内容放到一个页签里,用户不用在长页面里反复找。', '#2563EB'),
    new TabPanelInfo('参数', '参数多时可以单独成页,主内容会更干净。', '#0F766E'),
    new TabPanelInfo('示例', '示例页签适合放短代码、截图或操作步骤。', '#C2410C'),
    new TabPanelInfo('常见问题', '问题列表不必挤在正文后面,切出去看更轻。', '#7C3AED'),
    new TabPanelInfo('更新记录', '内容有版本变化时,用页签隔开更好扫读。', '#B45309')
  ]

  @Builder
  sectionTitle(title: string, desc: string) {
    Column({ space: 6 }) {
      Text(title)
        .fontSize(19)
        .fontWeight(FontWeight.Bold)
        .fontColor('#111827')
      Text(desc)
        .fontSize(13)
        .fontColor('#6B7280')
        .lineHeight(20)
    }
    .width('100%')
    .alignItems(HorizontalAlign.Start)
  }

  @Builder
  tabPanel(item: TabPanelInfo) {
    Column({ space: 10 }) {
      Text(item.title)
        .fontSize(22)
        .fontWeight(FontWeight.Bold)
        .fontColor(item.color)
      Text(item.desc)
        .fontSize(14)
        .fontColor('#4B5563')
        .lineHeight(22)
      Text('这里先只看 Tabs 的结构:TabContent 负责内容,tabBar 负责标签。')
        .fontSize(13)
        .fontColor('#6B7280')
        .lineHeight(20)
    }
    .width('100%')
    .height('100%')
    .padding(16)
    .borderRadius(12)
    .backgroundColor('#F8FAFC')
    .alignItems(HorizontalAlign.Start)
    .justifyContent(FlexAlign.Center)
  }

  build() {
    Scroll() {
      Column({ space: 22 }) {
        Column({ space: 8 }) {
          Text('ArkUI Tabs')
            .fontSize(28)
            .fontWeight(FontWeight.Bold)
            .fontColor('#111827')
          Text('多页内容别都堆在一个页面里')
            .fontSize(16)
            .fontColor('#4B5563')
          Text('Tabs 适合把同一层级的内容分开看。我们先用组件自己的切换能力,不额外记录当前索引。')
            .fontSize(14)
            .fontColor('#6B7280')
            .lineHeight(22)
        }
        .width('100%')
        .alignItems(HorizontalAlign.Start)

        this.sectionTitle('顶部页签:最常见的分组方式', 'barPosition 放在 Start,TabContent 里写每个页面的内容。')
        Tabs({ barPosition: BarPosition.Start }) {
          TabContent() {
            this.tabPanel(this.panels[0])
          }
          .tabBar('概览')

          TabContent() {
            this.tabPanel(this.panels[1])
          }
          .tabBar('参数')

          TabContent() {
            this.tabPanel(this.panels[2])
          }
          .tabBar('示例')
        }
        .width('100%')
        .height(240)
        .barMode(BarMode.Fixed)

        this.sectionTitle('底部页签:内容优先时可以这样放', 'barPosition 放在 End,页面主体会先进入视线。')
        Tabs({ barPosition: BarPosition.End }) {
          TabContent() {
            this.tabPanel(this.panels[0])
          }
          .tabBar('概览')

          TabContent() {
            this.tabPanel(this.panels[1])
          }
          .tabBar('参数')

          TabContent() {
            this.tabPanel(this.panels[2])
          }
          .tabBar('示例')
        }
        .width('100%')
        .height(240)
        .barMode(BarMode.Fixed)

        this.sectionTitle('可滚动标签:标签多了也别硬挤', 'barMode 用 Scrollable,标签数量多时更自然。')
        Tabs({ barPosition: BarPosition.Start }) {
          ForEach(this.panels, (item: TabPanelInfo) => {
            TabContent() {
              this.tabPanel(item)
            }
            .tabBar(item.title)
          }, (item: TabPanelInfo) => item.title)
        }
        .width('100%')
        .height(240)
        .barMode(BarMode.Scrollable)
        .scrollable(true)
      }
      .width('100%')
      .padding({ left: 18, right: 18, top: 22, bottom: 32 })
    }
    .width('100%')
    .height('100%')
    .backgroundColor('#FFFFFF')
  }
}
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。