鸿蒙项目实战(一):实现首页动态Tab
需求:存在n个tab页,支持动态设置显示指定某几个tab
实现如下:
一、定义一个类,定义所有的tab页数据
知识点:
1、类使用export修饰,可以让其他模块引入
2、类内字段 设置 static readonly ,只读静态字段
3、图标文件存于src->main->resources->base->media目录下
// 主页Tabs可选项集合 export class TabConfig{ title:string = "" icon:Resource = $r('app.media.app_icon') selectIcon:Resource = $r('app.media.app_icon') constructor(title:string,selectIcon:Resource,icon:Resource) { this.title = title this.icon = icon this.selectIcon = selectIcon } // 供选择的所有tab集合 // 只读 静态 static readonly tabList = [ new TabConfig('首页',$r('app.media.icon_menu_home_press'),$r('app.media.icon_menu_home_unpress')), new TabConfig('供货商',$r('app.media.icon_menu_supplier_press'),$r('app.media.icon_menu_supplier_unpress')), new TabConfig('客户',$r('app.media.icon_menu_customer_press'),$r('app.media.icon_menu_customer_unpress')), new TabConfig('货品',$r('app.media.icon_menu_product_press'),$r('app.media.icon_menu_product_unpress')), new TabConfig('更多',$r('app.media.icon_menu_more_press'),$r('app.media.icon_menu_more_unpress')) ] }
二、创建一个page
1、定义两个字段:
@State currentTabIndex: number = 0 // 当前tab下标 @State currentTabs: object[] = [] // 当前显示的tab集合
2、定义自定义构建函数组件,实现自定义tab
// 自定义构建函数组件 @Builder mTabs(index: number, title: string, selectIcon: Resource, icon: Resource) { Column() { Image(this.currentTabIndex == index ? selectIcon : icon) .width(28) .height(28) Text(title) .fontSize(14) .margin({ top: 6 }) } .justifyContent(FlexAlign.Center) .width('100%') .height('100%') .padding({ top: 6, bottom: 4 }) }
3、在生命周期方法里动态设置需要显示的tab
aboutToAppear() { this.setTabs(['首页', '客户', '更多']) } // 动态设置需要显示的tab setTabs(tab: string[]) { this.currentTabs = [] for (let i = 0; i < tab.length; i++) { let index = TabConfig.tabList.findIndex((item) => { return item.title === tab[i] } ) if (index != -1) { this.currentTabs.push(TabConfig.tabList[index]) } } }
4、设置ui部分
build() { Tabs() { ForEach(this.currentTabs, (item:TabConfig, index) => { TabContent() { Text('这是' + item.title + '页面') } .tabBar(this.mTabs(index, item.title, item.selectIcon, item.icon)) }) } .barPosition(BarPosition.End) .width('100%') .height('100%') .barHeight(60) .onChange((index:number)=>{ this.currentTabIndex = index //改变当前选中的tab下标 }) .barMode(BarMode.Fixed) // 不可滑动 }
相关文档:
完整代码:
1 // 首页 2 import { TabConfig } from '../common/config/TabConfig' 3 4 @Entry 5 @Component 6 struct Main { 7 @State currentTabIndex: number = 0 // 当前tab下标 8 @State currentTabs: object[] = [] // 当前显示的tab集合 9 // 10 aboutToAppear() { 11 this.setTabs(['首页', '客户', '更多']) 12 } 13 // 动态设置需要显示的tab 14 setTabs(tab: string[]) { 15 this.currentTabs = [] 16 for (let i = 0; i < tab.length; i++) { 17 let index = TabConfig.tabList.findIndex((item) => { 18 return item.title === tab[i] 19 } 20 ) 21 if (index != -1) { 22 this.currentTabs.push(TabConfig.tabList[index]) 23 } 24 } 25 } 26 27 build() { 28 Tabs() { 29 ForEach(this.currentTabs, (item, index) => { 30 TabContent() { 31 Text('这是' + item.title + '页面') 32 } 33 .tabBar(this.mTabs(index, item.title, item.selectIcon, item.icon)) 34 }) 35 } 36 .barPosition(BarPosition.End) 37 .width('100%') 38 .height('100%') 39 .barHeight(60) 40 .onChange((index:number)=>{ 41 this.currentTabIndex = index 42 }) 43 .barMode(BarMode.Fixed) // 不可滑动 44 } 45 // 自定义构建函数组件 46 @Builder mTabs(index: number, title: string, selectIcon: Resource, icon: Resource) { 47 Column() { 48 Image(this.currentTabIndex == index ? selectIcon : icon) 49 .width(28) 50 .height(28) 51 Text(title) 52 .fontSize(14) 53 .margin({ top: 6 }) 54 } 55 .justifyContent(FlexAlign.Center) 56 .width('100%') 57 .height('100%') 58 .padding({ top: 6, bottom: 4 }) 59 } 60 }
作者:听着music睡
出处:http://www.cnblogs.com/xqxacm/
Android交流群:38197636
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。