ArkTs之:数据懒加载——LazyForEach的用法

news2024/9/22 9:43:58

官方描述

LazyForEach从提供的数据源中按需迭代数据,并在每次迭代过程中创建相应的组件。当在滚动容器中使用了LazyForEach,框架会根据滚动容器可视区域按需创建组件,当组件滑出可视区域外时,框架会进行组件销毁回收以降低内存占用。

使用限制

  • LazyForEach必须在容器组件内使用,仅有List、Grid、Swiper以及WaterFlow组件支持数据懒加载(可配置cachedCount属性,即只加载可视部分以及其前后少量数据用于缓冲),其他组件仍然是一次性加载所有的数据。
  • LazyForEach在每次迭代中,必须创建且只允许创建一个子组件。
  • 生成的子组件必须是允许包含在LazyForEach父容器组件中的子组件。
  • 允许LazyForEach包含在if/else条件渲染语句中,也允许LazyForEach中出现if/else条件渲染语句。
  • 键值生成器必须针对每个数据生成唯一的值,如果键值相同,将导致键值相同的UI组件渲染出现问题。
  • LazyForEach必须使用DataChangeListener对象进行更新,对第一个参数dataSource重新赋值会异常;dataSource使用状态变量时,状态变量改变不会触发LazyForEach的UI刷新。
  • 为了高性能渲染,通过DataChangeListener对象的onDataChange方法来更新UI时,需要生成不同于原来的键值来触发组件刷新。
  • LazyForEach必须和@Reusable装饰器一起使用才能触发节点复用。使用方法:将@Reusable装饰在LazyForEach列表的组件上,见使用规则。

实战

LazyForEach是专门用来进行数据懒加载的接口,非常适合大数据量渲染的场景,但是想使用它必须要先实现IDatasource接口才能使用,废话不多说,直接上代码:

//第一步:实现IDataSource接口
// RecommendDataSource.ets
import { Recommend_Item } from '../DataType/index';
export class RecommendDataSource implements IDataSource {
  // 数据源
  private recommends: Array<Recommend_Item>;
  // 监听器
  private listeners: DataChangeListener[] = [];

  constructor(data: Recommend_Item[]) {
    this.recommends = data;
  }
  // 返回数据源中的数据数量
  public totalCount(): number {
    return this.recommends.length;
  }
  // 根据索引返回数据项
  public getData(index: number): Recommend_Item {
    return this.recommends[index];
  }
  // 为 LazyForEach 组件注册监听器
  registerDataChangeListener(listener: DataChangeListener): void {
    if (this.listeners.indexOf(listener) < 0) {
      console.info('add listener');
      this.listeners.push(listener);
    }
  }
  // 为 LazyForEach 组件注销监听器
  unregisterDataChangeListener(listener: DataChangeListener): void {
    const pos = this.listeners.indexOf(listener);
    if (pos >= 0) {
      console.info('remove listener');
      this.listeners.splice(pos, 1);
    }
  }
}

//第二步:在组件中引用并实例化
//Recommend.ets
import { Recommend_Item } from '../DataType/index';
import { RecommendDataSource } from '../MockData/RecommendDataSource';

@Component
export struct Recommend {
  @Prop RecommendList: Array<Recommend_Item> = [];  // 默认初始化为空数组
  private dataSource: RecommendDataSource = new RecommendDataSource([]);//初始化

  aboutToAppear() {
    // 在生命周期钩子中重新初始化 dataSource(如果 RecommendList 有更新)
    this.dataSource = new RecommendDataSource(this.RecommendList);
    console.log('RecommendList updated:', JSON.stringify(this.RecommendList), JSON.stringify(this.dataSource))
  } 
  build() {
    List({ space: 3 }) {
      LazyForEach(this.dataSource, (item: Recommend_Item, index: number) => {
        ListItem() {
          Row() {
            Text(item.type + '')
              .fontSize(50)
              .onAppear(() => {
                console.info("appear:" + item.type);
              });
          }.margin({ left: 10, right: 10 });
        }
        .onClick(() => {
          // 处理点击事件
        });
      }, (item: Recommend_Item) => item.type + '');
    }.cachedCount(5);
  }
}


最终效果

在这里插入图片描述

懒加载效果成功实现

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2071947.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

我在某日重新下载了idea

# 1 Maven设置 2 字体样式,字体颜色 3 插件 1,fitten code和通义灵码 2,one dark theme主题 3,mybatisX 4,Rainbow Brackets 5,Key Promoter X 设置 自动导入包

Ps:首选项 - 常规

Ps菜单&#xff1a;编辑/首选项 Edit/Preferences 快捷键&#xff1a;Ctrl K Photoshop 首选项中的“常规” General选项卡主要用于调整 Photoshop 的整体工作行为和用户体验。这些设置让用户可以根据个人习惯和工作流程定制软件的响应方式和界面布局&#xff0c;从而提高工作…

下载的word中的mathtype公式双击无法打开编辑器

原因分析&#xff1a; 该word中的此公式不是通过word内置的mathtype插入公式的&#xff0c;而是从mathtype编辑器中复制粘贴到word中的。 后者的方式当被其他人下载接收后&#xff0c;无法修改此公式&#xff0c;而且该公式也不能被其他人复制&#xff0c;会报错如下&#xff…

GPT-4o System Card is released

GPT-4o System Card is released, including red teaming, frontier risk evaluations, and other key practices for industrial-strength Large Language Models. https://openai.com/index/gpt-4o-system-card/ 报告链接 企业级生成式人工智能LLM大模型技术、算法及案例实战…

5G毫米波测试助力突破高频段设备局限,实现高效外场测试

作者介绍 一、方案背景 随着业务对带宽需求的不断增加&#xff0c;通信频谱不断向更高频谱延伸&#xff0c;5G毫米波具有丰富的频率资源&#xff0c;是移动通信技术演进的必然方向。下图是ITU的WRC-19会议发布的目前5G所占用频段。 从图中可以看出&#xff0c;在5G毫米波测试中…

AgentQ,超越人类的人工智能代理

MultiOn 宣布推出一款新代理AgentQ&#xff0c;这是一款令人惊叹的产品&#xff0c;它整合了我最近一直在讨论的大部分内容&#xff1a;将 LLM 与搜索相结合。 但这个经纪人很特殊。 与其他代理不同的是&#xff0c;由于巧妙地使用了对齐技术&#xff0c;该代理可以从好的和坏的…

redis | 认识非关系数据库Redis的位图数据类型

Redis 非关 kv型 位图常用命令应用场景python操作位图 位图 位图不是真正的数据类型&#xff0c;它是定义在字符串类型中 01100001 97 61 a 01100010 98 62 b 一个字符串类型的值最多能存储512M字节的内容 位上限&#xff1a;2^32 常用命令 SETBIT \x : 16进制 没有key值 GE…

npm 设置代理

目录 前言 一、查看npm配置 二、设置代理 三、删除代理 四、代理认证 往期回顾 前言 在使用npm时&#xff0c;如果您处于需要使用代理的网络环境中&#xff0c;您可以通过配置npm来设置代理。 一、查看npm配置 npm config list或者单独查看 npm config get proxynpm co…

Using Azure openAI key rotation automation

题意&#xff1a;使用 Azure OpenAI 密钥轮换自动化 问题背景&#xff1a; We are planning to do the Azure OpenAI key rotation automatically. How can we achieve this? Do we have terraform resource for this. 我们计划自动执行 Azure OpenAI 密钥轮换。我们如何实现…

垃圾分类笔记YOLOV5(一)-pip换源-口罩识别-训练自己的数据集

pip换源网址 pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple不进行配置的是临时换源 1、从github上下载YOLOV5的代码 翻墙软件clash 数据集地址roboflow clash配置一键导入 哔哩哔哩视频地址 数据集的下载格式&#xff1a; 2、修改自己的数据…

HarmonyOS NEXT 地图服务中‘我的位置’功能全解析

1 前言 “我的位置”功能在表象上或许给人以简单之感&#xff0c;但从专业角度深入剖析&#xff0c;其蕴含着极为可观的信息量与巨大潜力。此功能绝非仅仅局限于作为一个单纯显示用户当前所处地点的标识&#xff0c;而确切地说是连接用户与周边世界、实现个性化服务的关键纽带…

operlayers-初始化地图-天地图初始化地图

今天分享一篇初始化operlayers的文章&#xff0c;算上一篇笔记吧&#xff0c;以后再有项目时直接看笔记回省好多事&#xff0c;也帮网上的兄弟们避避雷。 前言 这个项目是vue3operlayers开发的一个有关地名地址的小插件&#xff0c;具体服务就不展示了。 之所以用天地图来加…

CMake构建学习笔记3-libpng库的构建

libpng是一个用于读取、写入 PNG (Portable Network Graphics) 文件格式的开源软件库&#xff0c;有了上一篇笔记作为基础&#xff0c;构建起来也非常简单。还是在源代码的根目录中创建一个build文件夹&#xff0c;执行如下关键指令&#xff1a; # 配置CMake cmake .. -G &q…

86.游戏改造-UI修正暴力分析

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;易道云信息技术研究院 上一个内容&#xff1a;85.游戏改造-修改UI分辨率&#xff0c;面向对象方式 85.游戏改造-修改UI分辨率&#xff…

【Material-UI】深入了解Radio Group中的useRadioGroup Hook

文章目录 一、什么是useRadioGroup&#xff1f;1.1 Hook的返回值 二、useRadioGroup的基本用法2.1 代码示例2.2 代码解析 三、useRadioGroup的应用场景3.1 动态样式调整3.2 高级交互逻辑 四、使用useRadioGroup的最佳实践4.1 保持代码简洁4.2 结合主题定制4.3 注意无障碍设计 五…

通过Python绘制不同数据类型适合的可视化图表

在数据可视化中&#xff0c;对于描述数值变量与数值变量之间的关系常见的有散点图和热力图&#xff0c;以及描述数值变量与分类变量之间的关系常见的有条形图&#xff0c;饼图和折线图&#xff0c;可以通过使用Python的matplotlib和seaborn库来绘制图表进行可视化表达&#xff…

基于R语言进行AMMI分析2

接续上文【基于R语言进行AMMI分析1】 1、AMMI()函数的结果解读 # 加载agricolae包 library(agricolae) # 加载数据 data(plrv) # 查看数据 head(plrv) model<-with(plrv,AMMI(Locality,Genotype,Rep,Yield,PCTRUE)) # 查看方差分析结果 model$ANOVA # 查看主成分的方差分析…

AIGC综合应用-黑神话悟空cos写真制作方法(案例拆解)

​ 想要体验一下穿越到黑神话悟空的世界中&#xff0c;亲自上阵来一场cos写真拍摄&#xff1f; 其实&#xff0c;通过AI&#xff0c;这个愿望轻松实现&#xff01; 不需要复杂的设备和高超的技术&#xff0c;只要两步就能搞定&#xff1a;生成底图和换脸。 以下就带你一步步…

Redis计数器:数字的秘密

文章目录 Redis计数器incr 指令用户计数统计用户统计信息查询缓存一致性 小结 技术派项目源码地址 : Gitee :技术派 - https://gitee.com/itwanger/paicodingGithub :技术派 - https://github.com/itwanger/paicoding 用户的相关统计信息 文章数&#xff0c;文章总阅读数&am…

网络互联基础

1. 集线器 与集线器相连的所有主机组成一个简单局域网LAN&#xff0c;都属于同一个冲突域&#xff0c;且属于同一个广播域。 2. 交换机 交换机连接的每个网段都是独立的冲突域&#xff0c;即交换机每个端口都是独立的冲突域。默认情况下&#xff0c;交换机对冲突域进行分割。…