HarmonyOS 鸿蒙Next tabs组件

发布于 1周前 作者 vueper 来自 鸿蒙OS

HarmonyOS 鸿蒙Next tabs组件

tabBar行默认居中排列,是否可以左对齐排列或右对齐

8 回复
build() {

    Column() {

     CustomTabItemRow()

      Tabs() {

        TabContent() {

          Column() {

            Text("all")

          }.width("100%")

          .height('100%').backgroundColor($r('app.color.primary_green'))

        }

        TabContent() {

          Column() {

            Text("hk")

          }.width("100%")

          .height('100%')

          .backgroundColor($r('app.color.primary_red'))

        }

        TabContent() {

          Column() {

            Text("us")

          }.width("100%")

          .height('100%')

          .backgroundColor($r('app.color.primary_blue'))

        }

      }

      .onChange(index => {

        this.currentTab = index;

      })

      .barHeight(0)

    }

    .width("100%")

    .height("100%")

    .backgroundColor($r('app.color.primary_bg'))

  }

代码结构如下:

image.png

注意事项:

  TabContent()后面不带tabBar()

  而且要设置barHeight(0),不让空出来一截

  CustomTabItemRow()可以自己自定义

效果如下:

image.png

懂了,就是控制联动的时候,自定义组件双向绑定联动只能传tabs()内的index来控制,无法用controller来控制,动画也给自己添,官方的TabTitleBar还无法修改效果,真够麻烦的O.0

content()和bar()连在一起写,简直有点奇葩。如果单独分成两个组件就好了

找HarmonyOS工作还需要会Flutter的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:https://www.bilibili.com/video/BV1S4411E7LY/?p=17

@Component
export default struct DevicesList {
  @Link currentBreakpoint: string
  @State currentIndex: number = 0
  //更tabs-content跳转有关
  private controller = new TabsController()
  //更list跳转有关
  private listScroller: Scroller = new Scroller();
  //tab标签
  tabs: Array<tabsInfo> = [
    new tabsInfo('device', '所有设备'),
    new tabsInfo('type', '我的分类')
  ]
  //tab标签和点击事件
  @Builder tab(name: string, tabIndex: number) {
    Row() {
      Text(name)
        .width(CommonConstants.FULL_SIZE)
        .fontSize(CommonConstants.DEFAULT_14)
        .fontColor(this.currentIndex === tabIndex ? CommonConstants.TEXT_FFF : CommonConstants.TEXT_tab_disSelected)
        .fontWeight(this.currentIndex === tabIndex ? CommonConstants.FONT_WEIGHT_600 : CommonConstants.FONT_WEIGHT_400)
        .textAlign(TextAlign.Center)
        .onClick(() => {
          this.controller.changeIndex(tabIndex)
          this.listScroller.scrollToIndex(tabIndex)
        })
    }
    .width(new BreakpointType({
      sm: 80,
      md: 90,
      lg: 100
    }).getValue(this.currentBreakpoint))
    .height(40)
  }

  build() {
    Column({space: CommonConstants.SPACE_4}) {
      //标签
      Row(){
        //tabs标签
        List({ scroller: this.listScroller }){
          ForEach(this.tabs,(item: tabsInfo,index:number)=>{
            ListItem(){
              Column(){
                //tab
                this.tab(item.title, index)
                //tabsLine滚动条
                Column().width(40).height(4).backgroundColor(CommonConstants.TEXT_LINE)
                  .visibility(this.currentIndex === index ?  Visibility.Visible : Visibility.Hidden)
              }
            }
            .height(60)
          })
        }
        .width(CommonConstants.FULL_SIZE)
        .height(60)
        .listDirection(Axis.Horizontal)
        .scrollBar(BarState.Off)
        .layoutWeight(1)
        //筛选图标
        Row({space: CommonConstants.SPACE_4}){
          Image($rawfile('black_icon/mipmap-xxhdpi/snowyi_classify_black.png'))
            .width(16)
            .height(16)
          Text('筛选')
            .fontColor(CommonConstants.TEXT_FFF)
            .fontSize(CommonConstants.DEFAULT_14)
        }.width(60)
      }
      .width(CommonConstants.FULL_SIZE)
      //tabs内容
      Tabs({ controller: this.controller}) {
        ForEach(this.tabs,(item: tabsInfo, index: number)=>{
          if(index === 0){
            TabContent() {
              AllDevices({currentBreakpoint: this.currentBreakpoint})
            }
            .width(CommonConstants.FULL_SIZE)
            .height(CommonConstants.FULL_SIZE)
          }else if(index === 1){
            TabContent() {
              DevicesType({currentBreakpoint: this.currentBreakpoint})
            }
            .width(CommonConstants.FULL_SIZE)
            .height(CommonConstants.FULL_SIZE)
          }

        })
      }
      .barWidth(0)
      .barHeight(0)
      .width(CommonConstants.FULL_SIZE)
      .height(CommonConstants.FULL_SIZE)
      .scrollable(false)
      .onChange(index => this.currentIndex = index)
      .layoutWeight(1)
    }
    .layoutWeight(1)
    .padding({bottom: 10})
  }
}

主要就是把tabs的barwidth,barheight给0,隐藏掉自带的标签高度,然后自定义一个头部标签,联动就行

API文档开放了啥就是啥,剩下的自己发挥想像力和创造力 :)

自定义组件来实现

HarmonyOS鸿蒙Next中的Tabs组件是一种用于页面内快速切换视图内容的容器组件,从API Version 7开始支持。Tabs组件主要由TabBar(导航页签栏)和TabContent(内容页)两部分组成。

TabBar可以位于底部、顶部或侧边,通过Tabs的barPosition参数进行设置。TabContent则显示与TabBar页签相对应的内容。每个TabContent都需要通过tabBar属性进行配置,以设置其对应的页签内容。

Tabs组件还支持多种自定义属性,如vertical(设置是否为纵向Tab)、scrollable(设置是否可以通过滑动页面进行页面切换)、barMode(设置TabBar布局模式,如固定或可滚动)等。此外,还可以自定义TabBar的样式,包括背景颜色、背景模糊材质、分割线样式等。

开发者在使用Tabs组件时,需要注意其版本兼容性,并确保正确设置相关属性和样式以满足应用需求。

鸿蒙Next教程已发布,可以先学学https://www.itying.com/category-93-b0.html

回到顶部