代码如下:
class MyDataSource extends BasicDataSource {
private dataArray: StringData[] = [];
public totalCount(): number {
return this.dataArray.length;
}
public getData(index: number): StringData {
return this.dataArray[index];
}
public addData(index: number, data: StringData): void {
this.dataArray.splice(index, 0, data);
this.notifyDataAdd(index);
}
public pushData(data: StringData): void {
this.dataArray.push(data);
this.notifyDataAdd(this.dataArray.length - 1);
}
}
class StringData {
message: string;
constructor(message: string) {
this.message = message;
}
}
@Entry
@ComponentV2
struct MyComponent {
data: MyDataSource = new MyDataSource();
aboutToAppear() {
for (let i = 0; i <= 30; i++) {
this.data.pushData(new StringData('Hello' + i));
}
}
build() {
List({ space: 3 }) {
LazyForEach(this.data, (item: StringData, index: number) => {
ListItem() {
ChildComponent({ data: item })
.onAppear(() => {
console.log('onAppear: ' + item.message)
})
}
}, (item: StringData, index: number) => index.toString())
}.cachedCount(5)
}
}
@Reusable
@Component
struct ChildComponent {
@State data: StringData = new StringData('');
aboutToAppear(): void {
console.log('aboutToAppear: ' + this.data.message);
}
aboutToRecycle(): void {
console.log('aboutToRecycle: ' + this.data.message);
}
// 对复用的组件进行数据更新
aboutToReuse(params: Record<string, ESObject>): void {
this.data = params.data as StringData;
console.log('aboutToReuse: ' + this.data.message);
}
build() {
Row() {
Text(this.data.message).fontSize(50)
}
}
}
本文参与了 【 HarmonyOS NEXT 技术问答冲榜,等你来战!】欢迎正在阅读的你也加入。
@Reusable与@ComponentV2混用会导致组件渲染异常。
在@ComponentV2装饰的组件MyComponent中,LazyForEach列表中使用了@Reusable装饰的组件ChildComponent,导致组件渲染失败,观察日志可以看到组件触发了onAppear,但是没有触发aboutToAppear。
将@ComponentV2修改为@Component可以修复渲染异常。修复后,当滑动事件触发组件节点下树时,对应的可复用组件ChildComponent从组件树上被加入到复用缓存中而不是被销毁,并触发aboutToRecycle事件,打印日志信息。当滑动需要显示新的节点时,会将可复用的组件从复用缓存中重新加入到节点树,并触发aboutToReuse刷新组件数据,并打印日志信息。
本文参与了 【 HarmonyOS NEXT 技术问答冲榜,等你来战!】欢迎正在阅读的你也加入。