赞
踩
ForEach接口基于数组类型数据来进行循环渲染,需要与容器组件配合使用,且接口返回的组件应当是允许包含在ForEach父容器组件中的子组件
ForEach(
arr: Array, // 要遍历的数据数组
itemGenerator: (item: any, index?: number) => void, // 页面组件生成函数
keyGenerator?: (item: any, index?: number): string => string // 键生成函数,为数组每一项生成一个唯一标识,组件是否重新渲染的判断标准
)
开发者在使用ForEach的过程中,若对于键值生成规则的理解不够充分,可能会出现错误的使用方式。错误使用一方面会导致功能层面问题,例如渲染结果非预期,另一方面会导致性能层面问题,例如渲染性能降低。
// 定义结构体 class Item { name: string image: ResourceStr price: number discount: number constructor(name: string, image: ResourceStr, price: number, discount: number = 0) { this.name = name this.image = image this.price = price this.discount = discount } } @Entry @Component struct Index { // 商品数据 private items: Array<Item> = [ new Item("Mate60", $r("app.media.mate60"), 5999, 500), new Item("mate60pro", $r("app.media.mate60pro"), 6999), new Item("mate60pro+", $r("app.media.mate60proplus"), 8999), new Item("mate60rs", $r("app.media.mate60rs"), 12999), new Item("matebook", $r("app.media.matebook"), 5999), ] build() { Column({ space: 8 }) { // 定义标题栏 Row() { Text("商品列表") .fontSize(30) .fontWeight(FontWeight.Bold) } .width('100%') .margin({ bottom: 20 }) // 使用ForEach遍历商品数据 ForEach( this.items, (item: Item) => { // ForEach函数内部创建一个Row容器 Row({ space: 10 }) { // 插入图片 Image(item.image) .width(100) // 因为商品信息是垂直排列,所以需要一个Column容器 Column({ space: 4 }) { // 根据是有折扣判断显示方式 if (item.discount) { Text(item.name) .fontSize(20) .fontWeight(FontWeight.Bold) Text('原价:¥' + item.price) .fontSize(14) .fontColor('#CCC') // 添加中划线 .decoration({type:TextDecorationType.LineThrough}) Text('折扣价:¥' + (item.price - item.discount)) .fontSize(18) .fontColor('#F36') Text('补贴价:¥' + item.discount) .fontSize(18) .fontColor('#F36') } else { Text(item.name) .fontSize(20) .fontWeight(FontWeight.Bold) Text('¥' + item.price) .fontSize(18) .fontColor('#F36') } } .height('100%') .alignItems(HorizontalAlign.Start) } .width('100%') .backgroundColor('#218c8a8a') .borderRadius(20) .height(100) } ) } } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。