class MyDataSource implements IDataSource {
private data: number[] = []
constructor() {
for (let i = 0; i < 100000; i++) {
this.data.push(i)
}
}
totalCount(): number {
return this.data.length
}
getData(index: number): number {
return this.data[index]
}
registerDataChangeListener(listener: DataChangeListener): void {
}
unregisterDataChangeListener(listener: DataChangeListener): void {
}
}
@Entry
@Component
struct Index {
@Builder
private itemContent(item: number) {
Item()
}
build() {
Stack() {
A({
// 可以触发item()组件复用, 但是使用了@Provide装饰器会报错
// itemContent: (item, index): void => this.itemContent(item)
// @Provide装饰器不报错,但是无法触发item()组件复用逻辑
itemContent: this.itemContent
})
.width('100%')
.height('100%')
}
.width('100%')
.height('100%')
}
}
@Component
struct A {
@BuilderParam
itemContent: (item: number, index: number) => void
build() {
List() {
LazyForEach(new MyDataSource(), (item: number, index) => EzListItemViewWrapper({
itemContent: this.itemContent,
item: item,
index: index
}), (item: number, index) => `${item}`)
}
.width('100%')
.height('100%')
}
}
@Component
export struct EzListItemViewWrapper {
@BuilderParam itemContent: (item: number, index: number) => void
item?: number
index?: number
@Provide parentValue: number = 1
build() {
this.itemContent(this.item!, this.index!)
}
}
@Component
@Reusable
struct Item {
// 当使用下面这种形式传参时,会报crash。itemContent: (item, index): void => this.itemContent(item)
@Consume parentValue: number
aboutToReuse(params: ESObject): void {
console.log("TestReuse: aboutToReuse")
}
build() {
Text("TTT").width('100%').height(90)
}
}
@Provide使用不规范造成的,@Provide的定义应该在@Consume的祖先组件中,出问题的场景,@Provide和@Consume没有父子关系,导致@Consume初始化找不到@Provide