当前位置: 首页 > ds >正文

鸿蒙HarmonyOS list优化一: list 结合 lazyforeach用法

list列表是开发中不可获取的,非常常用的组件,使用过程中会需要不断的优化,接下来我会用几篇文章进行list在纯原生的纯血鸿蒙的不断优化。我想进大厂,希望某位大厂的看到后能给次机会。

首先了解一下lazyforeach:

LazyForEach(dataSource: IDataSource,itemGenerator: (item: any, index: number) => void,keyGenerator?: (item: any, index: number) => string,)

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

参数名类型必填说明
dataSourceIDataSourceLazyForEach数据源,需要开发者实现相关接口。
itemGenerator(item: Object, index: number) => void

子组件生成函数,为数组中的每一个数据项创建一个子组件。

说明:

- item是当前数据项,index是数据项索引值。

- itemGenerator的函数体必须使用大括号{...}。

- itemGenerator每次迭代只能并且必须生成一个子组件。

- itemGenerator中可以使用if语句,但是必须保证if语句每个分支都会创建一个相同类型的子组件。

keyGenerator(item: Object, index: number) => string

键值生成函数,用于给数据源中的每一个数据项生成唯一且固定的键值。修改数据源中的一个数据项若不影响其生成的键值,则对应组件不会被更新,否则此处组件就会被重建更新。keyGenerator参数是可选的,但是,为了使开发框架能够更好地识别数组更改并正确更新组件,建议提供。

说明:

- item是当前数据项,index是数据项索引值。

- 数据源中的每一个数据项生成的键值不能重复。

- keyGenerator缺省时,使用默认的键值生成函数,即(item: Object, index: number) => { return viewId + '-' + index.toString(); },生成键值仅受索引值index影响。

键值生成规则

在LazyForEach循环渲染过程中,系统会为每个item生成一个唯一且持久的键值,用于标识对应的组件。当这个键值变化时,ArkUI框架将视为该数组元素已被替换或修改,并会基于新的键值创建一个新的组件。

LazyForEach提供了一个名为keyGenerator的参数,这是一个函数,开发者可以通过它自定义键值的生成规则。如果开发者没有定义keyGenerator函数,则ArkUI框架会使用默认的键值生成函数,即(item: Object, index: number) => { return viewId + '-' + index.toString(); }, viewId在编译器转换过程中生成,同一个LazyForEach组件内其viewId是一致的。

组件创建规则

在确定键值生成规则后,LazyForEach的第二个参数itemGenerator函数会根据组件创建规则为数据源的每个数组项创建组件。组件的创建包括两种情况:首次渲染和非首次渲染。

简单样例:

/** BasicDataSource代码见文档末尾BasicDataSource示例代码: string类型数组的BasicDataSource代码 **/
// azyForEach数据源,实现相关接口model。
class MyDataSource extends BasicDataSource {private dataArray: string[] = [];public totalCount(): number {return this.dataArray.length;}public getData(index: number): string {return this.dataArray[index];}public pushData(data: string): void {this.dataArray.push(data);this.notifyDataAdd(this.dataArray.length - 1);}
}@Entry
@Component
struct MyComponent {private data: MyDataSource = new MyDataSource();aboutToAppear() {for (let i = 0; i <= 20; i++) {this.data.pushData(`Hello ${i}`);}}build() {List({ space: 3 }) {LazyForEach(this.data, (item: string) => {ListItem() {Row() {Text(item).fontSize(50).onAppear(() => {console.info(`appear: ${item}`);})}.margin({ left: 10, right: 10 })}}, (item: string) => item)//保证item key键不相同 不然会有错误惊喜 哈哈}.cachedCount(5)}
}

http://www.xdnf.cn/news/5694.html

相关文章:

  • dp自动化登陆之hCaptcha 验证码
  • http接口性能优化方案
  • uniapp|实现手机通讯录、首字母快捷导航功能、多端兼容(H5、微信小程序、APP)
  • 键盘输出希腊字符方法
  • .net 公共变量 线程安全
  • 高并发内存池(三):TLS无锁访问以及Central Cache结构设计
  • Python文字转语音TTS库示例(edge-tts)
  • keil 解决 Error: CreateProcess failed, Command: ‘XXX\ARM\ARMCC\bin\fromelf.exe
  • 精益数据分析(55/126):双边市场模式的挑战、策略与创业阶段关联
  • Leetcode (力扣)做题记录 hot100(34,215,912,121)
  • 软件设计师-错题笔记-系统开发与运行
  • 吊舱的热灵敏度技术要点
  • 【Linux网络】————HTTP协议详解
  • MySQL全量,增量备份与恢复
  • Netty在Java网络编程中的应用:实现高性能的异步通信
  • 线下消费经济“举步维艰”,开源AI智能名片链动2+1+S2B2C小程序线上“狂飙突进”!
  • springboot集成langchain4j实现票务助手实战
  • 【软考-高级】【信息系统项目管理师】论文写作注意事项及2014年至2024年历年论文题目汇总
  • sqlilab-Less-18
  • 【第四批】运行时应用程序自我保护(RASP)工具能力通过评估名单
  • 【Dv3Admin】工具数据验证配置文件解析
  • 网卡网孔速率的协商是如何进行的?
  • 【Rust泛型】Rust泛型使用详解与应用场景
  • 力扣HOT100之二叉树:104. 二叉树的最大深度
  • 软件安全之内存泄漏
  • 构造+简单树状
  • 搜索二维矩阵 II 算法讲解
  • OpenHarmony 开源鸿蒙南向开发——linux下使用make交叉编译第三方库——gnutls
  • AD开启交叉选择功能,只选中器件,不选中网络、焊盘
  • PostgreSQL 序列(Sequence) 与 Oracle 序列对比