鸿蒙项目实战(二):实现动态栅格布局
需求:
动态设置栅格布局子元素
实现如下:
一、定义一个类,定义所有的子元素数据
// 首页业务按钮可选项集合 export class HomeBussinessConfig{ title:string = "" icon:Resource = $r('app.media.app_icon') constructor(title:string,icon:Resource) { this.title = title this.icon = icon } // 供选择的所有tab集合 // 只读 静态 static readonly buttons = [ new HomeBussinessConfig('功能一',$r('app.media.icon_home_sale')), new HomeBussinessConfig('功能二',$r('app.media.icon_home_purchase')), new HomeBussinessConfig('功能三',$r('app.media.icon_home_product')), new HomeBussinessConfig('功能四',$r('app.media.icon_home_customer')), new HomeBussinessConfig('功能五',$r('app.media.icon_home_supplier')), new HomeBussinessConfig('功能六',$r('app.media.icon_home_allocation')), new HomeBussinessConfig('功能七',$r('app.media.icon_home_check')), new HomeBussinessConfig('功能八',$r('app.media.icon_home_flow')) ] }
二、创建一个page
1、定义一个字段
@State gridItems:object[] = [] // gridItem数据源
2、定义自定义构建函数组件,实现栅格布局子元素的ui
// 自定义构建函数组件 gridCol内容 @Builder btnItem(title:string,img:Resource){ Column() { Image(img) .width(40) .height(40) Text(title) .fontSize(12) .margin({ top: 6 }) } .justifyContent(FlexAlign.Center) .width('100%') .padding({ top: 6, bottom: 4 }) .onClick(()=>this.clickBussinessBtn(title)) }
3、在生命周期方法里动态设置需要显示的数据
aboutToAppear() { this.setButtons(['功能一','功能三','功能四','功能六','功能七']) } // 动态设置需要显示的tab setButtons(btn: string[]) { this.gridItems = [] for (let i = 0; i < btn.length; i++) { let index = HomeBussinessConfig.buttons.findIndex((item) => { return item.title === btn[i] }) if (index != -1) { this.gridItems.push(HomeBussinessConfig.buttons[index]) } } }
4、设置ui部分
build() { Column() { GridRow({columns:4,direction:GridRowDirection.Row ,gutter: { x:4,y:12 }}) { ForEach(this.gridItems,(item:HomeBussinessConfig,index)=>{ GridCol(){ this.btnItem(item.title,item.icon) } .width('100%') }) } .padding(20) .backgroundColor(Color.White) } .width('100%') }
相关文档:
完整代码:
1 // 首页 2 import { HomeBussinessConfig } from '../../common/config/HomeBussinessConfig' 3 4 @Entry 5 @Component 6 struct Home { 7 @State gridItems:object[] = [] // gridItem数据源 8 9 aboutToAppear() { 10 this.setButtons(['功能一','功能三','功能四','功能六','功能七']) 11 } 12 // 动态设置需要显示的tab 13 setButtons(btn: string[]) { 14 this.gridItems = [] 15 for (let i = 0; i < btn.length; i++) { 16 let index = HomeBussinessConfig.buttons.findIndex((item) => { 17 return item.title === btn[i] 18 }) 19 if (index != -1) { 20 this.gridItems.push(HomeBussinessConfig.buttons[index]) 21 } 22 } 23 } 24 25 // 按钮点击事件 26 clickBussinessBtn(title:string){ 27 console.log('点击了'+title) 28 } 29 30 build() { 31 Column() { 32 GridRow({columns:4,direction:GridRowDirection.Row 33 ,gutter: { x:4,y:12 }}) { 34 ForEach(this.gridItems,(item,index)=>{ 35 GridCol(){ 36 this.btnItem(item.title,item.icon) 37 } 38 .width('100%') 39 }) 40 } 41 .padding(20) 42 .backgroundColor(Color.White) 43 } 44 .width('100%') 45 } 46 47 // 自定义构建函数组件 gridCol内容 48 @Builder btnItem(title:string,img:Resource){ 49 Column() { 50 Image(img) 51 .width(40) 52 .height(40) 53 Text(title) 54 .fontSize(12) 55 .margin({ top: 6 }) 56 } 57 .justifyContent(FlexAlign.Center) 58 .width('100%') 59 .padding({ top: 6, bottom: 4 }) 60 .onClick(()=>this.clickBussinessBtn(title)) 61 } 62 63 }
作者:听着music睡
出处:http://www.cnblogs.com/xqxacm/
Android交流群:38197636
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。