HarmonyOS NEXT实战:自界说封装多种样式导航栏组件

打印 上一主题 下一主题

主题 809|帖子 809|积分 2427

已上架的元服务

大家帮个忙。搜索一下下面的元服务,进去看下就行


  • 家具风格分类转盘
  • 宠物品种分类转盘
  • 星座特点分类转盘
  • 妙语集语
  • 玩具类型分类转盘
  • 本日保举吃什么
  • 时尚风格分类转盘
  • 活动项目分类转盘
手机 折叠屏 平板都可以,必要真机
涉及知识点和装饰器



  • @ComponentV2,@Local, @Builder,@BuilderParam,@Extend, @Require ,@Param,@Event等
  • 第三方库:ZRouter ,如项目中原来就用了ZRouter路由库,案例中点返回按钮直接使用了 ZRouter.pop(),没有效到的话也支持自界说返回事件。
配景:

在项目开发历程中,导航栏的应用场景颇为繁多。以我的页面为例,其导航栏呈现为图标、文字与箭头相组合的样式;而设置页面的导航栏则是图标、文字、右侧文字以及小红点的搭配形式;至于公用顶部导航栏,又表现为左侧返回图标、中央文字、右侧图标与文字的布局。倘若针对每一处用到导航栏的地方均单独编写代码,那么代码的重复编写征象将极为严肃。基于此,我们可采用自界说封装的方式构建公用组件。如此一来,不但为项目后期的维护与拓展提供了极大的便利,同时也可以或许明显提拔开发服从,让开发者有更多精力投入到更具代价的工作思索中,淘汰不必要的重复劳作时间消耗。
先上效果图



  • 图一

  • 图二

  • 图三

实现 图一 效果图



  • 1、首先必要界说好类型,比如 图片+文字+小红点+返回右键等。
  1. @ObservedV2
  2. export class TabHorizontalModel {
  3.   title: string;
  4.   index: number; //下标
  5.   icon: string | Resource;
  6.   hasIcon: boolean; //是否显示图
  7.   @Trace rightTitle: string;
  8.   hasRightTitle: boolean;
  9.   @Trace hasNew: boolean; //是否显示红点
  10.   hasRightIcon: boolean; //是否显示图
  11.   constructor(title: string, index: number = -1, icon: string | Resource = '', hasIcon: boolean = false, rightTitle: string = '', hasRightTitle: boolean = false, hasNew: boolean = false,
  12.     hasRightIcon: boolean = true) {
  13.     this.icon = icon;
  14.     this.hasIcon = hasIcon;
  15.     this.title = title;
  16.     this.rightTitle = rightTitle;
  17.     this.hasRightTitle = hasRightTitle;
  18.     this.hasNew = hasNew && rightTitle !== '';
  19.     this.index = index;
  20.     this.hasRightIcon = hasRightIcon;
  21.   }
  22. }
复制代码


  • 2、封装一个通用的 横向Tab 图片、文字、右边文字、小红点 组件
  1. import { CommonConst } from "utils"
  2. import { TabHorizontalModel } from "../model/TabHorizontalModel"
  3. /**
  4. * Author:J
  5. * Describe: 横向Tab 图片、文字、右边文字、小红点
  6. */
  7. @ComponentV2
  8. export struct HorizontalTabItemComp {
  9.   @Param @Require tabItem: TabHorizontalModel= new TabHorizontalModel('')
  10.   @Param onItemClick?: () => void = undefined
  11.   build() {
  12.     Row() {
  13.       Image(this.tabItem.icon)
  14.         .width(24)
  15.         .margin({ right: 12 })
  16.         .visibility(this.tabItem.hasIcon ? Visibility.Visible : Visibility.None)
  17.       Text(this.tabItem.title)
  18.         .fontSize(16)
  19.         .fontColor($r('app.color.color_222222'))
  20.         .layoutWeight(1)
  21.       if (this.tabItem.hasNew) {
  22.         Badge({
  23.           value: '',
  24.           position: BadgePosition.Right,
  25.           style: { badgeSize: 7, badgeColor: $r('app.color.color_FA2A2D') }
  26.         }) {
  27.           Text(this.tabItem.rightTitle)
  28.             .fontSize(16)
  29.             .fontColor($r('app.color.color_222222'))
  30.             .visibility(this.tabItem.hasRightTitle ? Visibility.Visible : Visibility.None)
  31.             .margin({ right: 20 })
  32.         }
  33.       } else {
  34.         Text(this.tabItem.rightTitle)
  35.           .fontSize(16)
  36.           .fontColor($r('app.color.color_222222'))
  37.           .visibility(this.tabItem.hasRightTitle ? Visibility.Visible : Visibility.None)
  38.       }
  39.       Image($r('app.media.ic_arrow_right_gray_small'))
  40.         .width(24)
  41.         .margin({ left: 12 })
  42.         .visibility(this.tabItem.hasRightIcon ? Visibility.Visible : Visibility.None)
  43.     }
  44.     .width(CommonConst.FULL_PARENT)
  45.     .height(44)
  46.     .backgroundColor($r('app.color.white'))
  47.     .onClick(() => {
  48.       this.onItemClick?.()
  49.     })
  50.   }
  51. }
复制代码


  • 3、使用案例
    3.1 针对于一个,可以用下面的代码,但是对于一个页面有多个的话,要是一行行的写,固然可以,但是不发起,而且也不优雅,以是必要用到ForEach来实现。
  1.   HorizontalTabItemComp({
  2.         tabItem: new TabHorizontalModel("我的积分", 0, $r('app.media.ic_coin'), true),
  3.         onItemClick: () => {
  4.           ToastUtil.showToast('我的积分')
  5.         }
  6.       }).margin({ left: 12, right: 12 })
复制代码
3.2 界说一组数据,塞到数组里
  1. /** 横向Tab */
  2. export const horizontalTabItemData: Array<TabHorizontalModel> = [
  3.   new TabHorizontalModel("我的积分", 0, $r('app.media.ic_coin'), true, '666', true),
  4.   new TabHorizontalModel("我的分享", 1, $r('app.media.ic_share_article'), true),
  5.   new TabHorizontalModel("我的收藏", 2, $r('app.media.ic_collect'), true),
  6.   new TabHorizontalModel("我的书签", 3, $r('app.media.ic_read_later'), true),
  7.   new TabHorizontalModel("阅读历史", 4, $r('app.media.ic_read_record'), true),
  8.   new TabHorizontalModel("开源项目", 5, $r('app.media.ic_github'), true),
  9.   new TabHorizontalModel("关于作者", 6, $r('app.media.ic_about'), true, '请他喝杯咖啡~', true),
  10. ]
复制代码
3.3 使用ForEach来实现
  1. ForEach(horizontalTabItemData, (item: TabHorizontalModel, index: number) => {
  2.         HorizontalTabItemComp({
  3.           tabItem: item,
  4.           onItemClick: () => {
  5.             this.onItemClick(item)
  6.           }
  7.         }).margin({ left: 12, right: 12 })
  8.       })
  9.   /** 点击事件 */
  10.   private onItemClick(item: TabHorizontalModel) {
  11.     ToastUtil.showToast(item.title)
  12.     if (item.index == 0) {
  13.     } else if (item.index == 1) {
  14.     } else if (item.index == 2) {
  15.     } else if (item.index == 3) {
  16.     } else if (item.index == 4) {
  17.     } else if (item.index == 5) {
  18.     } else if (item.index == 6) {
  19.     }
  20.   }
复制代码
实现 图二 效果图



  • 1、首先必要界说好必要的参数
  1.   /** 标题 */
  2.   @Param title: ResourceStr = '';
  3.   /** 返回按钮的点击事件 */
  4.   @Param backClick?: (event?: ClickEvent) => void = undefined;
  5.   /** 是否显示右侧按钮 */
  6.   @Param isShowRight: boolean = false;
  7.   /** 右侧标题 */
  8.   @Param rightTitle: ResourceStr = '';
  9.   /** 右侧图片 */
  10.   @Param rightImage: ResourceStr = '';
  11.   /** 右侧点击事件 */
  12.   @Param rightClick?: (event?: ClickEvent) => void = undefined;
复制代码


  • 2、封装一个公用的自界说导航栏组件,内置了导航栏的返回按钮、标题、右侧按钮等,完整代码如下:
  1. import { ZRouter } from '@hzw/zrouter';import { CommonConst } from 'utils';/** * Author:J * Describe:自界说导航栏组件 * 内置了导航栏的返回按钮、标题、右侧按钮等 */@ComponentV2export struct TitleBarComp {  /** 标题 */
  2.   @Param title: ResourceStr = '';
  3.   /** 返回按钮的点击事件 */
  4.   @Param backClick?: (event?: ClickEvent) => void = undefined;
  5.   /** 是否显示右侧按钮 */
  6.   @Param isShowRight: boolean = false;
  7.   /** 右侧标题 */
  8.   @Param rightTitle: ResourceStr = '';
  9.   /** 右侧图片 */
  10.   @Param rightImage: ResourceStr = '';
  11.   /** 右侧点击事件 */
  12.   @Param rightClick?: (event?: ClickEvent) => void = undefined;
  13.   build() {    Column() {      Row() {        Image($r('app.media.ic_arrow_left')).width(44).padding(8).onClick(() => {          if (this.backClick) {            this.backClick()          } else {            ZRouter.pop()          }        })        Text(this.title)          .fontColor($r('app.color.color_222222'))          .fontSize(16)          .maxLines(1)          .fontWeight(FontWeight.Bold)        Row() {          if (this.rightTitle) {            Text(this.rightTitle)              .fontColor($r('app.color.color_222222'))              .fontSize(16)              .margin({ right: 10 })          } else {            Image(this.rightImage ? this.rightImage : $r('app.media.ic_local_search'))              .width(44)              .padding(10)          }        }        .onClick(this.rightClick)        .visibility(this.isShowRight ? Visibility.Visible : Visibility.Hidden)      }      .width(CommonConst.FULL_PARENT)      .height(44)      .justifyContent(FlexAlign.SpaceBetween)      .backgroundColor($r('app.color.white'))      Divider()        .width(CommonConst.FULL_PARENT)        .color($r('app.color.color_F0F0F0'))    }    .width(CommonConst.FULL_PARENT)    .height(45)  }}
复制代码


  • 3、使用案例,包罗了多种样式使用
  1. NavDestination() {
  2.       Column({space:8}) {
  3.         Text('第一种样式').fontColor(Color.Red)
  4.         TitleBarComp({ title: '设置' })
  5.         Text('第二种样式,自定义返回事件').fontColor(Color.Red)
  6.         TitleBarComp({
  7.           title: '设置二', backClick: () => {
  8.             ToastUtil.showToast('自定义返回事件')
  9.           }
  10.         })
  11.         Text('第三种样式,右边有文字').fontColor(Color.Red)
  12.         TitleBarComp({
  13.           title: '设置三',
  14.           isShowRight: true,
  15.           rightTitle: '右边',
  16.           rightClick: () => {
  17.             ToastUtil.showToast('右边')
  18.           }
  19.         })
  20.         Text('第四种,右边有图片').fontColor(Color.Red)
  21.         TitleBarComp({
  22.           title: '设置四',
  23.           isShowRight: true,
  24.           rightImage: $r('app.media.ic_share_article'),
  25.           rightClick: () => {
  26.             ToastUtil.showToast('右边')
  27.           }
  28.         })
  29.       }
  30.       .width(CommonConst.FULL_PARENT)
  31.       .height(CommonConst.FULL_PARENT)
  32.       .backgroundColor($r('app.color.white'))
  33.     }
  34.     .hideTitleBar(true)
复制代码
实现 图三 效果图



  • 配景:这个逻辑比力复杂,一步步优化实现,为啥还必要自界说,直接用官方自带的Tabs+TabContent就可以实现啊;如果只是针对于一行都是简单文字切换那还好,但是对于那种,左边、右边是图片+中央是文字用自带的就不行了,因为下面的内容的宽度是铺满屏幕的宽度的,以是必要自界说。
  • 1、界说必要的参数,自界说左边视图,右边视图,内容,下划线,是否滑动等,具体可以看完整代码。
  1. @Param currentTabIndex: number = 0;
  2.   @Param tabContentArr: boolean[] = []; //存储页面状态
  3.   private tabsController: TabsController = new TabsController();
  4.   @Param tabs: Array<TabBarModel> = [];
  5.   //左边视图
  6.   @BuilderParam tabBarLeft: () => void = this.barLeft;
  7.   //右边视图
  8.   @BuilderParam tabBarRight: () => void = this.barRight;
  9.   //内容
  10.   @BuilderParam tabContentBuilder: ($$: TabBarModel) => void = this._TabContentBuilder;
  11.   //是否显示下划线
  12.   @Param isShowDivider: boolean = false;
  13.   //是否滑动
  14.   @Param scrollable: boolean = false;
  15.   //顶部中间视图是否居中 true居中 false 默认 居左
  16.   @Param isTabBarCenter: boolean = false;
  17.   //选中字体颜色
  18.   @Param selectFontColor: ResourceColor = $r('app.color.color_222222');
  19.   //滑动条是否显示
  20.   @Param isDividerVisible: boolean = true;
  21.   //更新
  22.   @Event changeFactory: (currentTabIndex: number, isShowDivider: boolean) => void = (currentTabIndex: number, isShowDivider: boolean) => {
  23.   }
复制代码


  • 2、自界说顶部视图,List替换tabBar 共同Tabs 左视图–tabBar–右视图
  1. Column() {
  2.       //切换
  3.       this.customTabBar()
  4.       //下划线
  5.       Divider()
  6.         .color($r('app.color.color_F0F0F0'))
  7.         .visibility(this.isShowDivider ? Visibility.Visible : Visibility.None)
  8.       //TabContent中的tabBar居中显示,所以暂时不用tabBar
  9.       Tabs({ controller: this.tabsController, barPosition: BarPosition.Start }) {
  10.         ForEach(this.tabs, (item: TabBarModel, index: number) => {
  11.           TabContent() {
  12.             //滑到哪个页面再加载,防止一块加载
  13.             if (this.currentTabIndex === index || this.tabContentArr[index]) {
  14.               this.tabContentBuilder(item)
  15.             }
  16.           }
  17.           // .tabBar()
  18.         }, (item: string) => item)
  19.       }
  20.       .layoutWeight(1)
  21.       .barHeight(0) //隐藏tabBar
  22.       .scrollable(this.scrollable)
  23.       .onChange(index => {
  24.         this.tabContentArr[index] = true
  25.         this.changeFactory(index,this.tabs[index].isShowDivider)
  26.       })
  27.     }.width(CommonConst.FULL_PARENT)
  28.     .backgroundColor($r('app.color.white'))
复制代码


  • 3、 List实现【标题+横线】选中效果
  1.   @Builder
  2.   customTabBar() {
  3.     Row() {
  4.       //左边自定义
  5.       this.tabBarLeft()
  6.       //中间
  7.       CustomTabBarComp({
  8.         currentTabIndex: this.currentTabIndex,
  9.         tabs: this.tabs,
  10.         selectFontColor: this.selectFontColor,
  11.         isTabBarCenter: this.isTabBarCenter,
  12.         onTabClick: (index: number) => {
  13.           this.tabsController.changeIndex(index)
  14.         },
  15.         isDividerVisible: this.isDividerVisible
  16.       })
  17.       //右边自定义
  18.       this.tabBarRight()
  19.     }
  20.     .width(CommonConst.FULL_PARENT)
  21.     .height(44)
  22.   }
复制代码


  • 4、标题+横线 List和TabContent.tabBar都可以用
  1. @ComponentV2
  2. export struct TabBarViewComp {
  3.   @Param private index: number = 0
  4.   @Param currentTabIndex: number = 0
  5.   @Param tabs: Array<TabBarModel> = new Array<TabBarModel>()
  6.   //选中字体颜色
  7.   @Param selectFontColor: ResourceColor = $r('app.color.color_222222');
  8.   @Param onTabClick: (index: number) => void = () => {
  9.   };
  10.   @Param isDividerVisible: boolean = true;
  11.   build() {
  12.     Column() {
  13.       //右上角图片
  14.       Image(this.tabs[this.index].rightSrc)
  15.         .height(11)
  16.         .margin({ left: 46 }).visibility(this.tabs[this.index].isShowRightSrc ? Visibility.Visible : Visibility.None)
  17.       Text(this.tabs[this.index].name)
  18.         .fontSize(this.currentTabIndex == this.index ? 16 : 14)
  19.         .fontColor(this.currentTabIndex == this.index ? this.selectFontColor : $r('app.color.color_505050'))
  20.         .fontWeight(this.currentTabIndex == this.index ? FontWeight.Bold : FontWeight.Normal)
  21.         .margin({ top: this.tabs[this.index].isShowRightSrc ? 0 : 11 })
  22.       Divider()
  23.         .width(16)
  24.         .height(4)
  25.         .backgroundColor($r('app.color.colorPrimary'))
  26.         .margin({ top: 4, bottom: 4 })
  27.         .borderRadius(12)
  28.         .visibility(this.isDividerVisible && this.currentTabIndex == this.index ? Visibility.Visible : Visibility.Hidden)
  29.     }
  30.     .margin({ right: 15 })
  31.     .onClick(() => {
  32.       this.onTabClick(this.index)
  33.     })
  34.   }
  35. }
复制代码


  • 5、完整代码如下
  1. import { CommonConst } from "utils";import { TabBarModel } from "../model/TabBarModel";/** * Author:J * Describe:自界说tabBar 左视图--tabBar--右视图 * * ListWithTabBarView({}) List替换tabBar 共同Tabs  左视图--tabBar--右视图 * CustomTabBarComp({}) List实现【标题+横线】选中效果 * TabBarViewComp({})  标题+横线   List和TabContent.tabBar都可以用 */@Preview@ComponentV2export struct ListWithTabBarView {  @Param currentTabIndex: number = 0;
  2.   @Param tabContentArr: boolean[] = []; //存储页面状态
  3.   private tabsController: TabsController = new TabsController();
  4.   @Param tabs: Array<TabBarModel> = [];
  5.   //左边视图
  6.   @BuilderParam tabBarLeft: () => void = this.barLeft;
  7.   //右边视图
  8.   @BuilderParam tabBarRight: () => void = this.barRight;
  9.   //内容
  10.   @BuilderParam tabContentBuilder: ($$: TabBarModel) => void = this._TabContentBuilder;
  11.   //是否显示下划线
  12.   @Param isShowDivider: boolean = false;
  13.   //是否滑动
  14.   @Param scrollable: boolean = false;
  15.   //顶部中间视图是否居中 true居中 false 默认 居左
  16.   @Param isTabBarCenter: boolean = false;
  17.   //选中字体颜色
  18.   @Param selectFontColor: ResourceColor = $r('app.color.color_222222');
  19.   //滑动条是否显示
  20.   @Param isDividerVisible: boolean = true;
  21.   //更新
  22.   @Event changeFactory: (currentTabIndex: number, isShowDivider: boolean) => void = (currentTabIndex: number, isShowDivider: boolean) => {
  23.   }
  24.   aboutToAppear() {    for (let index = 0; index < this.tabs.length; index++) {      this.tabContentArr.push(index == 0 ? true : false)    }  }  build() {    Column() {
  25.       //切换
  26.       this.customTabBar()
  27.       //下划线
  28.       Divider()
  29.         .color($r('app.color.color_F0F0F0'))
  30.         .visibility(this.isShowDivider ? Visibility.Visible : Visibility.None)
  31.       //TabContent中的tabBar居中显示,所以暂时不用tabBar
  32.       Tabs({ controller: this.tabsController, barPosition: BarPosition.Start }) {
  33.         ForEach(this.tabs, (item: TabBarModel, index: number) => {
  34.           TabContent() {
  35.             //滑到哪个页面再加载,防止一块加载
  36.             if (this.currentTabIndex === index || this.tabContentArr[index]) {
  37.               this.tabContentBuilder(item)
  38.             }
  39.           }
  40.           // .tabBar()
  41.         }, (item: string) => item)
  42.       }
  43.       .layoutWeight(1)
  44.       .barHeight(0) //隐藏tabBar
  45.       .scrollable(this.scrollable)
  46.       .onChange(index => {
  47.         this.tabContentArr[index] = true
  48.         this.changeFactory(index,this.tabs[index].isShowDivider)
  49.       })
  50.     }.width(CommonConst.FULL_PARENT)
  51.     .backgroundColor($r('app.color.white'))
  52.     // .padding({ left: 12, right: 12 })  }  @Builder  _TabContentBuilder($$: TabBarModel) {    Text("tabContentBuilder:()=>{your @Builder View}")  }  @Builder
  53.   customTabBar() {
  54.     Row() {
  55.       //左边自定义
  56.       this.tabBarLeft()
  57.       //中间
  58.       CustomTabBarComp({
  59.         currentTabIndex: this.currentTabIndex,
  60.         tabs: this.tabs,
  61.         selectFontColor: this.selectFontColor,
  62.         isTabBarCenter: this.isTabBarCenter,
  63.         onTabClick: (index: number) => {
  64.           this.tabsController.changeIndex(index)
  65.         },
  66.         isDividerVisible: this.isDividerVisible
  67.       })
  68.       //右边自定义
  69.       this.tabBarRight()
  70.     }
  71.     .width(CommonConst.FULL_PARENT)
  72.     .height(44)
  73.   }
  74.   @Builder  barLeft() {  }  @Builder  barRight() {  }}@ComponentV2export struct CustomTabBarComp {  @Param currentTabIndex: number = 0;  @Param tabs: Array<TabBarModel> = new Array<TabBarModel>()  //选中字体颜色  @Param selectFontColor: ResourceColor = $r('app.color.color_222222');  @Param onTabClick: (index: number) => void = () => {  };  @Param isTabBarCenter: boolean = false;  @Param isDividerVisible: boolean = true;  build() {    Row() {      List() {        ForEach(this.tabs, (item: TabBarModel, index: number) => {          ListItem() {            TabBarViewComp({              index: index,              currentTabIndex: this.currentTabIndex,              tabs: this.tabs,              selectFontColor: this.selectFontColor,              onTabClick: (index: number) => {                this.onTabClick(index)              },              isDividerVisible: this.isDividerVisible            })          }        })      }      // .width(Constants.FULL_PARENT)      .height(44)      .listDirection(Axis.Horizontal)      .alignListItem(ListItemAlign.Center)      .scrollBar(BarState.Off)      // .margin({ right: 8 })    }    .layoutWeight(1)    .justifyContent(this.isTabBarCenter ? FlexAlign.Center : FlexAlign.Start)  }}
  75. @ComponentV2
  76. export struct TabBarViewComp {
  77.   @Param private index: number = 0
  78.   @Param currentTabIndex: number = 0
  79.   @Param tabs: Array<TabBarModel> = new Array<TabBarModel>()
  80.   //选中字体颜色
  81.   @Param selectFontColor: ResourceColor = $r('app.color.color_222222');
  82.   @Param onTabClick: (index: number) => void = () => {
  83.   };
  84.   @Param isDividerVisible: boolean = true;
  85.   build() {
  86.     Column() {
  87.       //右上角图片
  88.       Image(this.tabs[this.index].rightSrc)
  89.         .height(11)
  90.         .margin({ left: 46 }).visibility(this.tabs[this.index].isShowRightSrc ? Visibility.Visible : Visibility.None)
  91.       Text(this.tabs[this.index].name)
  92.         .fontSize(this.currentTabIndex == this.index ? 16 : 14)
  93.         .fontColor(this.currentTabIndex == this.index ? this.selectFontColor : $r('app.color.color_505050'))
  94.         .fontWeight(this.currentTabIndex == this.index ? FontWeight.Bold : FontWeight.Normal)
  95.         .margin({ top: this.tabs[this.index].isShowRightSrc ? 0 : 11 })
  96.       Divider()
  97.         .width(16)
  98.         .height(4)
  99.         .backgroundColor($r('app.color.colorPrimary'))
  100.         .margin({ top: 4, bottom: 4 })
  101.         .borderRadius(12)
  102.         .visibility(this.isDividerVisible && this.currentTabIndex == this.index ? Visibility.Visible : Visibility.Hidden)
  103.     }
  104.     .margin({ right: 15 })
  105.     .onClick(() => {
  106.       this.onTabClick(this.index)
  107.     })
  108.   }
  109. }
复制代码


  • 6、使用案例如下,多种样式的使用:
  1. import { ToastUtil } from '@pura/harmony-utils'
  2. import { ListWithTabBarView, TabBarModel } from 'uicomponents'
  3. import { CommonConst } from 'utils'
  4. import { GetFourStyleTabData, GetOneStyleTabData, GetThreeStyleTabData, GetTwoStyleTabData } from './TestModel'
  5. @Preview
  6. @ComponentV2
  7. export struct TestTabBarView {
  8.   @Local currentTabIndex: number = 0
  9.   @Local isShowDivider: boolean = GetOneStyleTabData[0].isShowDivider
  10.   @Local currentTabIndex2: number = 0
  11.   @Local currentTabIndex3: number = 0
  12.   @Local currentTabIndex4: number = 0
  13.   build() {
  14.     NavDestination() {
  15.       Column() {
  16.         Text('第一种样式').text(Color.Red)
  17.         ListWithTabBarView({
  18.           currentTabIndex: this.currentTabIndex,
  19.           tabs: GetOneStyleTabData,
  20.           tabBarLeft: this.tabBarLeft,
  21.           tabBarRight: this.tabBarRight,
  22.           tabContentBuilder: this.tabContentBuilder,
  23.           isShowDivider: this.isShowDivider,
  24.           changeFactory: (currentTabIndex, isShowDivider) => {
  25.             this.currentTabIndex = currentTabIndex
  26.             this.isShowDivider = isShowDivider
  27.           }
  28.         }).height(80)
  29.         Text('第二种样式').text(Color.Pink)
  30.         ListWithTabBarView({
  31.           currentTabIndex: this.currentTabIndex2,
  32.           tabs: GetTwoStyleTabData,
  33.           tabBarLeft: this.tabBarLeft2,
  34.           tabBarRight: this.tabBarRight2,
  35.           tabContentBuilder: this.tabContentBuilder,
  36.           changeFactory: (currentTabIndex) => {
  37.             this.currentTabIndex2 = currentTabIndex
  38.           },
  39.           isTabBarCenter: true
  40.         }).height(80)
  41.         Text('第三种样式').text(Color.Blue)
  42.         ListWithTabBarView({
  43.           currentTabIndex: this.currentTabIndex,
  44.           tabs: GetThreeStyleTabData,
  45.           tabBarLeft: this.tabBarLeft3,
  46.           tabBarRight: this.tabBarRight3,
  47.           tabContentBuilder: this.tabContentBuilder,
  48.           isTabBarCenter: true,
  49.           changeFactory: (currentTabIndex) => {
  50.             this.currentTabIndex = currentTabIndex
  51.           }
  52.         }).height(80)
  53.         Text('第四种样式').text(Color.Grey)
  54.         ListWithTabBarView({
  55.           currentTabIndex: this.currentTabIndex4,
  56.           tabs: GetFourStyleTabData,
  57.           tabBarLeft: this.tabBarLeft4,
  58.           tabContentBuilder: (tab): void => this.tabContentBuilder(tab),
  59.           isShowDivider: true,
  60.           changeFactory: (currentTabIndex) => {
  61.             this.currentTabIndex4 = currentTabIndex
  62.           }
  63.         }).layoutWeight(1)
  64.           .height(80)
  65.       }
  66.       .width(CommonConst.FULL_PARENT)
  67.       .height(CommonConst.FULL_PARENT)
  68.     }
  69.   }
  70.   @Builder
  71.   tabBarLeft() {
  72.     Text().width(12)
  73.   }
  74.   @Builder
  75.   tabBarRight() {
  76.     Row({ space: 12 }) {
  77.       Image($r('app.media.app_icon'))
  78.         .width(24)
  79.         .visibility(this.currentTabIndex == 0 || this.currentTabIndex == 1 ? Visibility.Visible : Visibility.Hidden)
  80.         .onClick(() => {
  81.           ToastUtil.showToast('点了1')
  82.         })
  83.       Image($r('app.media.app_icon')).width(24).onClick(() => {
  84.         ToastUtil.showToast('点了')
  85.       })
  86.     }.padding({ right: 12 })
  87.   }
  88.   @Builder
  89.   tabContentBuilder($$: TabBarModel) {
  90.     Text($$.id)
  91.   }
  92.   @Builder
  93.   tabBarLeft2() {
  94.     Image($r('app.media.ic_arrow_left')).width(24)
  95.       .margin({ left: 12, right: 6 })
  96.       .onClick(() => {
  97.         ToastUtil.showToast('返回键')
  98.         // ZRouter.pop()
  99.       })
  100.   }
  101.   @Builder
  102.   tabBarRight2() {
  103.     Image($r('app.media.app_icon'))
  104.       .width(24)
  105.       .margin({ right: 12 })
  106.       .onClick(() => {
  107.         ToastUtil.showToast('点了')
  108.       })
  109.   }
  110.   @Builder
  111.   tabBarLeft3() {
  112.     Image($r('app.media.app_icon')).width(24).fillColor(Color.Black)
  113.       .margin({ left: 12, right: 20 })
  114.       .onClick(() => {
  115.         ToastUtil.showToast('设置')
  116.       })
  117.   }
  118.   @Builder
  119.   tabBarRight3() {
  120.     Image(this.currentTabIndex == 1 ? $r('app.media.ic_next') : $r('app.media.ic_local_search'))
  121.       .width(24)
  122.       .margin({ right: 12 })
  123.       .visibility(this.currentTabIndex != 2 ? Visibility.Visible : Visibility.Hidden)
  124.       .onClick(() => {
  125.         ToastUtil.showToast(this.currentTabIndex == 1 ? '点了1' : '搜索')
  126.       })
  127.   }
  128.   @Builder
  129.   tabBarLeft4() {
  130.     Text().width(12)
  131.   }
  132. }
  133. @Extend(Text)
  134. function text(color: ResourceColor) {
  135.   .height(44).width(CommonConst.FULL_PARENT).fontColor(Color.White).backgroundColor(color)
  136. }
复制代码
以往系列文章


  • 《探索 HarmonyOS NEXT(5.0):开启构建模块化项目架构奇幻之旅 —— 模块化底子篇》
  • 《探索 HarmonyOS NEXT(5.0):开启构建模块化项目架构奇幻之旅 —— 构建底子特性层》
  • 《探索 HarmonyOS NEXT(5.0):开启构建模块化项目架构奇幻之旅 —— 构建公共本领层》
  • 《探索 HarmonyOS NEXT(5.0):开启构建模块化项目架构奇幻之旅 —— Tabs底部导航栏》
  • 《探索 HarmonyOS NEXT (5.0):开启构建模块化项目架构奇幻之旅 —— 动态路由 ZRouter:引领高效模块通信的智慧中枢》
  • 《探索 HarmonyOS NEXT(5.0):开启构建模块化项目架构奇幻之旅 ——第三方库的使用:网络哀求RCP、二次封装上下拉革新、弹窗》
  • HarmonyOS NEXT:模块化项目 ——修改应用图标+启动页等
  • HarmonyOSNext模块化设计实践:打造简洁高效的登录注册页面
若本文对您稍有帮助,诚望您不吝点赞,多谢。
有兴趣的同砚可以点击查看源码



  • gitee:https://gitee.com/jiaojiaoone/explore-harmony-next/tree/case%2Fwanandroid/
  • github:https://github.com/JasonYinH/ExploreHarmonyNext.git
接待加我微信一起交换:+V:yinshiyuba


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

光之使者

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表