官方文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-rendering-control-lazyforeach
- 首先用LazyForEach替换ForEach
- 第一个参数必须是IDataSource(其中包含了很多的方法和字段)
- 数据需要赋值的时候。调用其中的reloadData方法
- 这个 方法分为两步骤:进行数据的赋值;
- 通知子组件重载
- LazyForEach出现失效的原因(bug型面试题)
- 子组件的高度或者宽度是否进行配置
- 子组件是否是懒加载支持的容器组件

- 嵌套滚动时需要设置嵌套滚动属性:
- 触底加载的逻辑方法从父组件移动到子组件的地方
- 断点lg/md的时候,瀑布流无法触底进行更多加载,原因是请求数据的数量未将可视区域铺满,导致瀑布流不进行触底加载
代码示例:
// LazyForEach组件的数据类型
class BasicDataSource implements IDataSource {
private listeners: DataChangeListener[] = [];
private originDataArray: object[] = [];
public totalCount(): number {
return 0;
}
public getData(index: number): object {
return this.originDataArray[index];
}
// 该方法为框架侧调用,为LazyForEach组件向其数据源处添加listener监听
registerDataChangeListener(listener: DataChangeListener): void {
if (this.listeners.indexOf(listener) < 0) {
console.info('add listener');
this.listeners.push(listener);
}
}
// 该方法为框架侧调用,为对应的LazyForEach组件在数据源处去除listener监听
unregisterDataChangeListener(listener: DataChangeListener): void {
const pos = this.listeners.indexOf(listener);
if (pos >= 0) {
console.info('remove listener');
this.listeners.splice(pos, 1);
}
}
// 通知LazyForEach组件需要重载所有子组件
notifyDataReload(): void {
this.listeners.forEach(listener => {
listener.onDataReloaded();
})
}
// 通知LazyForEach组件需要在index对应索引处添加子组件
notifyDataAdd(index: number): void {
this.listeners.forEach(listener => {
listener.onDataAdd(index);
})
}
// 通知LazyForEach组件在index对应索引处数据有变化,需要重建该子组件
notifyDataChange(index: number): void {
this.listeners.forEach(listener => {
listener.onDataChange(index);
})
}
// 通知LazyForEach组件需要在index对应索引处删除该子组件
notifyDataDelete(index: number): void {
this.listeners.forEach(listener => {
listener.onDataDelete(index);
})
}
// 通知LazyForEach组件将from索引和to索引处的子组件进行交换
notifyDataMove(from: number, to: number): void {
this.listeners.forEach(listener => {
listener.onDataMove(from, to);
})
}
}
// 这个类 继承 上个类
class GoodsItemsDataSource extends BasicDataSource {
private dataArray: object[] = []; // 数据源
public totalCount(): number {
return this.dataArray.length;
}
public getData(index: number): object {
return this.dataArray[index];
}
public addData(index: number, data: object): void {
this.dataArray.splice(index, 0, data);
this.notifyDataAdd(index);
}
public pushData(data: object): void {
this.dataArray.push(data);
this.notifyDataAdd(this.dataArray.length - 1);
}
// 数据直接重新赋值
public reloadData(data: object[]) {
this.dataArray = data
this.notifyDataReload() // 通知重载(根据可视区情况 创建/销毁)子组件
}
}
2293

被折叠的 条评论
为什么被折叠?



