首页 > 其他分享 >LazyForEach:数据懒加载

LazyForEach:数据懒加载

时间:2024-09-08 13:24:43浏览次数:10  
标签:index number LazyForEach listener listeners 组件 数据 加载

文章目录


前言

在HarmonyOS中,我们经常会遇到长列表加载的问题,我们第一时间会想到用ForEach来渲染,但会发现内存消耗过大,用户体验不好,所以就需要用到LazyForEach。


一、LazyForEach是什么?

通过数据懒加载(LazyForEach)从提供的数据源中按需迭代数据,并在每次迭代过程中创建相应的组件。

LazyForEach懒加载的原理和渲染过程

  1. LazyForEach根据屏幕可视区能够容纳显示的组件数量按需加载数据
  2. 屏幕可视区只展示部分组件。当可视区外的组件需要在屏幕内显示时,需要从头完成数据加载、组件创建、挂载组件树这一过程,直至渲染到屏幕上,超出组件的区域就自动销毁。

使用限制

  1. LazyForEach必须在容器组件内使用,且仅有List、Grid、Swiper以及WaterFlow组件支持LazyForEach的数据懒加载功能,用于循环渲染具有相同布局的子组件,其他组件仍然是一次性加载所有的数据。
  2. 而且必须给组件设置固定的高度,防止高度被内容撑开,就实现不了懒加载的效果。

二、使用步骤

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

相关文章

  • WGCLOUD使用指南 - 监测数据库的连通性
    数据可视化监测是WGCLOUD的一个重要模块,可以帮我们监控数据源是否在线,自定义sql查询数据进行可视化展示,比如新增订单、注册用户量、数据库运行参数等信息数据监控是由server来监测的,因此要保证server主机能够访问到数据库如果server无法访问被监控的数据源,怎么监控 1、......
  • 【国外比较权威的免费的卫星数据网站——ESA’s Sentinel Mission】
    ESA’sSentinelMission(欧洲航天局的哨兵系列卫星任务)是欧洲哥白尼(Copernicus)计划空间部分的核心组成部分,旨在通过一系列专用卫星提供连续、高质量的地球观测数据。以下是对ESA’sSentinelMission的详细介绍:一、任务概述哨兵系列卫星由欧洲委员会投资,欧洲航天局(ESA)负责......
  • 掌握动态图表:使用Python的Matplotlib库实现动态数据可视化
    在数据可视化领域,Matplotlib库是Python中最流行和功能强大的工具之一。它能够生成各种静态图表,如散点图、折线图和柱状图等。然而,Matplotlib也提供了创建动态图表的功能,使得我们能够以动画的方式展示数据的变化趋势,从而更直观地理解数据。本文将介绍如何使用Matplotlib库创建动态图......
  • 数据分析训练模型后输出模型评估报告
    数据分析训练模型后输出模型评估报告1、模型评估指标1.1、概念:A:n个正样本,检测到是真值的数量B:m个负样本,检测到是真值的数量C:n个正样本,检测到假值的数量D:m个负样本,检测到假值的数量1.2、准确率(Accuracy)正确预测的样本数量与总样本数量的比值。优点:易于理解和计......
  • 微信小程序开发系列3----页面配置--WXML数据绑定+条件渲染
    1小程序布局-WXML数据绑定有的时候发现需要刷新一下全局的app.js才能有效果。。。。。  2小程序布局-WXML条件渲染  下图会报错:不能在ifelse中间插入其他的标签  如下展示一次渲染多个标签使用block 源码获取方式(免费):(1)登录-注册:http://resources.kittytig......
  • 【数据结构】单链表专题
    链表的概念及结构概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表的结构跟火车车厢相似,淡季时车次的车厢会相应减少,旺季时车次的车厢会额外增加几节。只需要将火车里的某节车厢去掉/加上,不会影响其他车......
  • 数据结构基础讲解(二)——线性表之单链表专项练习
    本文数据结构讲解参考书目:通过网盘分享的文件:数据结构 C语言版.pdf链接: https://pan.baidu.com/s/159y_QTbXqpMhNCNP_Fls9g?pwd=ze8e 提取码:ze8e 上一节我讲了线性表中顺序表的定义以及常用的算法,那么这节我将继续讲解顺序表中的链式结构以及常见的算法。数据......
  • 数据结构基础讲解(一)——线性表之顺序表专项练习
     本文数据结构讲解参考书目:通过网盘分享的文件:数据结构 C语言版.pdf链接:https://pan.baidu.com/s/159y_QTbXqpMhNCNP_Fls9g?pwd=ze8e提取码:ze8e目录前言一.线性表的定义二.线性表的基本操作三.线性表的顺序存储和表示四.顺序表中基本操作的实现1.顺序表......
  • Python实践——CAN数据CRC校验计算
    一、代码功能概述这段Python代码实现了多种不同CRC(循环冗余校验)算法的计算功能。用户可以选择特定的CRC算法,然后输入数据,函数将返回该数据的CRC校验结果。可以选择以字节数组的形式(高位在前)或单个值的列表形式输出结果。二、准备工作确保你已经安装了Python环境......
  • 马老师浑元十三刀本质是DDD程序=算法+数据结构:浑元形意太极的本质是领域驱动设计(02)
    浑元形意太极的本质是领域驱动设计(01)在软件开发的旅程中,领域驱动设计就是我们的指路明灯。它照亮了我们前进的道路,驱散了迷茫的阴霾。有了领域驱动设计的指引,我们不再畏惧未知,不再害怕挑战。我们知道,无论前方有多么艰难的障碍,都有领域驱动设计为我们指明方向。领域驱动设计就......