ForEach:循环渲染
官方:ForEach接口基于数组类型数据来进行循环渲染,需要与容器组件配合使用,且接口返回的组件应当是允许包含在ForEach父容器组件中的子组件。
语法:
ForEach(
arr: Array,
itemGenerator: (item: any, index?: number) => void,
keyGenerator?: (item: any, index?: number) => string
)
参数解释:
1、arr: Array 要遍历的数据,数组
2、itemGenerator: (item: any, index?: number) => void,
itemGenerator: (item: any, index?: number) => {},
组件生成函数(数组中的数据项,数组中的数据项索引-可省略)
返回函数或void
3、 keyGenerator?: (item: any, index?: number) => string
可省略,键值生成函数(数组中的数据项,数组中的数据项索引-可省略)
如果函数缺省,框架默认的键值生成函数为(item: T, index: number) => { return index + ‘__’ + JSON.stringify(item); }
示例1:
@State simpleList: Array<string> = ['one', 'two', 'three'];
ForEach(this.simpleList, (item2: string) => {
Text(item2).fontColor(Color.Red)
},)
示例2:**ForEach与list组件整合
@Entry
@Component
struct ForEachListItem {
private arr: number[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
build() {
Column() {
List({ space: 20, initialIndex: 0 }) {
ForEach(this.arr, (item) => {
//创建列表项
ListItem() {
Text('列表' + item)
.width('100%').height(100).fontSize(16)
.textAlign(TextAlign.Center).borderRadius(10).backgroundColor(0xFFFFFF)
}
}, item => item)
}.width('90%')
}.width('100%').height('100%')
.backgroundColor(0xf5a0a3)
.padding({ top: 5 })
}
}
示例3:** ForEach与自定义组件
@Entry
@Component
struct Parent {
@State simpleList: Array<string> = ['one', 'two', 'three'];
build() {
Row() {
Column() {
ForEach(this.simpleList, (item: string) => {
ChildItem({ item1: item })
}, (item: string) => item)
}
.width('100%')
.height('100%')
}
.height('100%')
.backgroundColor(0xfceace)
}
}
@Component
struct ChildItem {
@Prop item1: string;
build() {
Text('父组件参数:'+this.item1)
.fontSize(20)
}
}
**示例4 ** 创建类对象,渲染组件,综合案例
定义类:
// 定义类--文章类
class MyArticle {
id : string
title : string
content : string
//构造函数
constructor(id: string, title: string, content: string) {
this.id = id
this.title = title
this.content = content
}
}
具体实现:
@Entry
@Component
struct MyArticleListView {
@State isListReachEnd: boolean = false;
@State MyArticleList: Array<MyArticle> = [
new MyArticle('001', '第1篇文章', '文章简介内容'),
new MyArticle('002', '第2篇文章', '文章简介内容'),
new MyArticle('003', '第3篇文章', '文章简介内容'),
new MyArticle('004', '第4篇文章', '文章简介内容'),
new MyArticle('005', '第5篇文章', '文章简介内容'),
new MyArticle('006', '第6篇文章', '文章简介内容')
]
loadMoreMyArticles() {
this.MyArticleList.push(new MyArticle('007', '加载的新文章', '文章简介内容'));
}
build() {
Column({ space: 5 }) {
List() {
ForEach(this.MyArticleList, (item: MyArticle) => {
ListItem() {
MyArticleCard({ MyArticle: item })
.margin({ top: 20 })
}
}, (item: MyArticle) => item.id)
}
.onReachEnd(() => {
this.isListReachEnd = true;
})
.parallelGesture(
PanGesture({ direction: PanDirection.Up, distance: 80 })
.onActionStart(() => {
if (this.isListReachEnd) {
this.loadMoreMyArticles();
this.isListReachEnd = false;
}
})
)
.padding(20)
.scrollBar(BarState.Off)
}
.width('100%')
.height('100%')
.backgroundColor(0xF1F3F5)
}
}
@Component
struct MyArticleCard {
@Prop MyArticle: MyArticle;
build() {
Row() {
Image($r('app.media.icon'))
.width(80)
.height(80)
.margin({ right: 20 })
Column() {
Text(this.MyArticle.title)
.fontSize(20)
.margin({ bottom: 8 })
Text(this.MyArticle.content)
.fontSize(16)
.fontColor(Color.Gray)
.margin({ bottom: 8 })
}
.alignItems(HorizontalAlign.Start)
.width('80%')
.height('100%')
}
.padding(20)
.borderRadius(12)
.backgroundColor('#FFECECEC')
.height(120)
.width('100%')
.justifyContent(FlexAlign.SpaceBetween)
}
}