文章目录
前言
在HarmonyOS中,我们经常会遇到长列表加载的问题,我们第一时间会想到用ForEach来渲染,但会发现内存消耗过大,用户体验不好,所以就需要用到LazyForEach。
一、LazyForEach是什么?
通过数据懒加载(LazyForEach)从提供的数据源中按需迭代数据,并在每次迭代过程中创建相应的组件。
LazyForEach懒加载的原理和渲染过程
- LazyForEach根据屏幕可视区能够容纳显示的组件数量按需加载数据
- 屏幕可视区只展示部分组件。当可视区外的组件需要在屏幕内显示时,需要从头完成数据加载、组件创建、挂载组件树这一过程,直至渲染到屏幕上,超出组件的区域就自动销毁。
使用限制
- LazyForEach必须在容器组件内使用,且仅有List、Grid、Swiper以及WaterFlow组件支持LazyForEach的数据懒加载功能,用于循环渲染具有相同布局的子组件,其他组件仍然是一次性加载所有的数据。
- 而且必须给组件设置固定的高度,防止高度被内容撑开,就实现不了懒加载的效果。
二、使用步骤
1.实现提供的一个 IDataSource 的接口
代码如下(示例):
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);
})
}
}
2.将数据包装到对象中,实现一系列增删改查的方法
代码如下(示例):
export 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()
}
}
3.ForEach替换为LazyForEach即可
总结
LazyForEach从提供的数据源中按需迭代数据,并在每次迭代过程中创建相应的组件。当在滚动容器中使用了LazyForEach,框架会根据滚动容器可视区域按需创建组件,当组件滑出可视区域外时,框架会进行组件销毁回收以降低内存占用。
以上就是今天要讲的内容,本文仅仅简单介绍了LazyForEach的使用,以及一些使用方法和要使用时要注意的问题。
标签:index,number,LazyForEach,listener,listeners,组件,数据,加载 From: https://blog.csdn.net/hhhhhh5666/article/details/141994462