首页 鸿蒙 正文
  • 本文约2014字,阅读需10分钟
  • 104
  • 0

鸿蒙ForEach和LazyForEach的区别

温馨提示:本文最后更新于2024年10月29日 22:08,若内容或图片失效,请在下方留言或联系博主。

在鸿蒙系统开发中,ForEach 和 LazyForEach 是两种用于遍历数据集合的组件,它们的主要区别在于渲染机制和性能优化方面:
ForEach:
立即渲染:ForEach 会立即渲染所有子组件,无论这些子组件是否在当前视图中可见。
适用场景:适用于数据量较小且所有项都需要立即显示的场景。
性能影响:当数据量较大时,可能会导致性能问题,因为所有项都会被渲染到内存中。
LazyForEach: PullToRefresh 示例代码
懒加载:LazyForEach 只会渲染当前视图中可见的子组件,当用户滚动时,才会动态加载新的子组件。
适用场景:适用于数据量较大或需要滚动显示的场景,可以显著提高性能和用户体验。
性能优化:通过懒加载机制,减少了内存占用和初始加载时间,提高了应用的响应速度。
总结:
如果数据量较小且所有项都需要立即显示,使用 ForEach。
如果数据量较大或需要滚动显示,使用 LazyForEach 以优化性能。

1. 实现提供的一个 IDataSource 的接口

class BasicDataSource implements IDataSource {
  private listeners: DataChangeListener[] = new Array<DataChangeListener>();

  public totalCount(): number {
    return 0;
  }

  public getData(index: number): Object {
    return 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);
    })
  }

  notifyDataMove(from: number, to: number): void {
    this.listeners.forEach(listener => {
      listener.onDataMove(from, to);
    })
  }
}

class MyDataSource extends BasicDataSource {
  private dataArray: string[] = [];

  public totalCount(): number {
    return this.dataArray.length;
  }

  public getData(index: number): Object {
    return this.dataArray[index];
  }

  public addData(index: number, data: string): void {
    this.dataArray.splice(index, 0, data);
    this.notifyDataAdd(index);
  }

  public pushData(data: string): void {
    this.dataArray.push(data);
    this.notifyDataAdd(this.dataArray.length - 1);
  }

  public clear(): void {
    this.dataArray = [];
  }
}

2. 只替换 MyDataSource 中 dataArray 的类型即可

3. 渲染数组中重新 new 一个实例化数

@State list: MyDataSource = new MyDataSource()

4. 把ForEach换成 LazyForEach后 会出现爆红 修改爆红地区即可

 
 
标签:第三方库
评论