【HarmonyOS Next开发】Tabs使用封装

简介: 在写Tabs时,会使用很多个TabContent来实现不同页面的展示内容,但是如果TabContent数量很多时,会导致Tabs代码量大而且很臃肿,因此想着尝试去封装Tabs的使用,可以让界面整洁和对内容界面的解耦。主要依托于wrapBuilder:封装全局@Builder的方法使用。需要注意从API 11 才开始支持使用

背景

在写Tabs时,会使用很多个TabContent来实现不同页面的展示内容,但是如果TabContent数量很多时,会导致Tabs代码量大而且很臃肿,因此想着尝试去封装Tabs的使用,可以让界面整洁和对内容界面的解耦。

主要依托于wrapBuilder:封装全局@Builder的方法使用。需要注意从API 11 才开始支持使用

代码结构

cke\_7167.png

Index.ets

import { TabbarItem, TabbarItemList } from '../Models/TabbarItem';

@Entry
@Component
struct Index {
  // tab选择索引
  @State selectIndex: number = 0;
  // 内容
  controller: TabsController = new TabsController()
  // tab集合
  @State items: TabbarItem[] = TabbarItemList;

  build() {
    Tabs({ controller: this.controller, index: this.selectIndex }) {
      ForEach(this.items, (item: TabbarItem, index: number) => {
        TabContent() {
          //点击页签显示的内容
          item.builder.builder()
        }
        .tabBar(this.tabarBuilder(item, index)) //TabContent的样式和内容
      })
    }.onChange((index: number) => {
      this.selectIndex = index;
    })
    .barPosition(BarPosition.End);
  }

  @Builder
  tabarBuilder(item: TabbarItem, index: number) {
    Column() {
      Image(this.selectIndex == index ? item.icon_selected : item.icon_normal)
        .width(28)
        .aspectRatio(1)
        .margin({ top: 5, bottom: 1 });
      Text(item.title)
        .width('100%')
        .height(14)
        .fontSize(10)
        .fontWeight(500)
        .textAlign(TextAlign.Center)
        .margin({ bottom: 7 });
    }
  }
}

TabbarItem.ets

import { View1Builder } from '../Views/View1_Page';
import { View2Builder } from '../Views/View2_Page';
import { View3Builder } from '../Views/View3_Page';
import { View4Builder } from '../Views/View4_Page';
import { View5Builder } from '../Views/View5_Page';

class TabbarItem {
  index: number = 0;
  title: string = '';
  icon_selected: Resource = $r('app.media.app_icon');
  icon_normal: Resource = $r('app.media.app_icon');
  builder: WrappedBuilder<[]> = wrapBuilder(TabbarBuilder);

  constructor(index: number, title: string, selectedIcon: Resource, normalIcon: Resource, builder: WrappedBuilder<[]>) {
    this.index = index;
    this.title = title;
    this.icon_selected = selectedIcon;
    this.icon_normal = normalIcon;
    this.builder = builder;
  }
}

@Builder
function TabbarBuilder() {

}


// tab集合
const TabbarItemList: TabbarItem[] = [
  new TabbarItem(0, "View1", $r('app.media.app_icon'), $r('app.media.app_icon'), wrapBuilder(View1Builder)),
  new TabbarItem(1, "View2", $r('app.media.app_icon'), $r('app.media.app_icon'), wrapBuilder(View2Builder)),
  new TabbarItem(2, "View3", $r('app.media.app_icon'), $r('app.media.app_icon'), wrapBuilder(View3Builder)),
  new TabbarItem(3, "View4", $r('app.media.app_icon'), $r('app.media.app_icon'), wrapBuilder(View4Builder)),
  new TabbarItem(4, "View5", $r('app.media.app_icon'), $r('app.media.app_icon'), wrapBuilder(View5Builder)),
]


export {
  TabbarItem, TabbarItemList
}

View1_Page.ets

@Builder
export function View1Builder(){
  View1_Page();
}

@Entry
@Component
struct View1_Page {
  @State message: string = 'View1';

  build() {
    RelativeContainer() {
      Text(this.message)
        .id('View1_PageHelloWorld')
        .fontSize(50)
        .fontWeight(FontWeight.Bold)
        .alignRules({
          center: { anchor: '__container__', align: VerticalAlign.Center },
          middle: { anchor: '__container__', align: HorizontalAlign.Center }
        })
    }
    .height('100%')
    .width('100%')
  }
}

效果

cke\_121422.png

cke\_124375.png

相关文章
|
16小时前
【HarmonyOS Next开发】:ListItemGroup使用
通过使用ListItemGroup和AlphabetIndexer两种类型组件,实现带标题分类和右侧导航栏的页面
78 59
|
16小时前
|
API 容器
【HarmonyOS Next开发】Navigation使用
Navigation是路由容器组件,包括单栏(Stack)、分栏(Split)和自适应(Auto)三种显示模式。适用于模块内和跨模块的路由切换。 在页面跳转时,应该使用页面路由router,在页面内的页面跳转时,建议使用Navigation达到更好的转场动效场景。
16 8
|
16小时前
|
开发者
【HarmonyOS Next开发】用户文件访问
文件所有者为登录到该终端设备的用户,包括用户私有的图片、视频、音频、文档等。 应用对用户文件的创建、访问、删除等行为,需要提前获取用户授权,或由用户操作完成。
18 10
|
16小时前
|
存储 JSON 测试技术
【HarmonyOS Next开发】云开发-云数据库(二)
实现了云侧和端侧的云数据库创建、更新、修改等操作。这篇文章实现调用云函数对云数据库进行增删改查。
19 9
|
16小时前
|
存储 IDE JavaScript
【HarmonyOS Next开发】端云一体化初始化项目
端云一体化开发是HarmonyOS对云端开发的支持、实现端云联动。云开发服务提供了云函数、云数据库、云存储等服务,可以使开发者专注于应用的业务逻辑开发,无需关注基础设施,例如:服务器、操作系统等问题。
14 6
|
1天前
|
人工智能 文字识别 算法
|
1天前
|
安全 Java 开发者
|
1天前
|
存储 开发者 容器
|
2天前
|
人工智能 自然语言处理 算法
开箱即用的个人主页页面开发实战—基于HarmonyOS 5.0 (Next)和ArkTS的实现【HarmonyOS 5.0(Next)】
本文介绍了基于HarmonyOS 5.0(Next)和ArkTS开发的开箱即用个人主页页面。HarmonyOS 5.0(Next)采用全新“和谐美学”设计理念,通过光元素模拟、多设备无缝流转及小艺助手升级,提升用户体验。文章详细解析了使用ArkTS构建个人主页页面的代码,展示了清晰的布局层次、简洁的事件处理、状态管理和组件化开发等最佳实践。这段代码不仅实现了美观的界面设计,还提供了高效的应用导航和数据传递功能,体现了对用户体验的高度关注。
36 12
开箱即用的个人主页页面开发实战—基于HarmonyOS 5.0 (Next)和ArkTS的实现【HarmonyOS 5.0(Next)】

热门文章

最新文章