【HarmonyOS NEXT】LazyForEach迁移Repeat两者对比与避坑指南
本文对比了鸿蒙开发中LazyForEach与Repeat组件的核心差异。Repeat作为新一代循环渲染标准组件,支持V2模型,相比LazyForEach具有显著优势:1)直接使用普通数组,无需实现IDataSource接口;2)支持全量/懒加载两种模式;3)自动监听数据变化,无需手动通知更新;4)@Trace精准监听子属性,性能更优;5)自带组件复用功能;6)原生支持多模板渲染。官方推荐使用Rep
一、背景
在鸿蒙开发中,长列表渲染一直是性能优化的重点;从API 12开始支持Repeat,用来统一替换ForEach + LazyForEach,成为鸿蒙下一代循环渲染标准组件
从LazyForEach迁移到Repeat会遇到以下问题:
1、两者到底有什么区别?
2、懒加载怎么开?
3、数据更新、子属性监听、组件复用、多模板怎么写?
4、为什么官方推荐 Repeat?
本文基于官方文档,总结出两者之间的差异,方便快速迁移
二、核心前提
Repeat只支持V2组件(Stage模型)
LazyForEach支持V1和V2两种组件
若是新项目且Stage模型,建议直接使用V2组件Repeat
三、LazyForEach与LazyForEach七大核心区别
3.1、数据源不同
LazyForEach:
使用专用的数据结构IDataSource
需要自己实现类,重写getData()、pushData()等方法
Repeat:
直接使用V2装饰的普通数组
无需实现任何接口,写法更简单
3.2、组件生成函数&键值生成函数不同
LazyForEach:
三个参数:数据源、组件生成函数、键值生成函数
键值用于标识唯一item,优化更新
Repeat:
使用.each()或.template()设置组件生成函数
使用.key()设置键值生成函数
3.3、懒加载模式不同
LazyForEach:
本身具备懒加载功能,默认只渲染屏幕 + 预加载区域
Repeat:
具有两种模式:
全量加载(默认) —> 对标ForEach,渲染所有节点
懒加载 —> 对标LazyForEach,需手动开启
Repeat(data)
.virtualScroll() // 使能懒加载
懒加载时同样只渲染:可见区域 + 前后预加载区域
滚动性能与 LazyForEach 一致
3.4、数据更新方式不同
LazyForEach:
修改数据源后需要调用对应的接口通知其更新
如:notifyDataAdd()、notifyDataChange()
Repeat:
由V2监听其数据源变化并触发更新
直接修改数组即可,无需任何通知方法
3.5、修改数据子属性监听不同
LazyForEach(状态V1):
使用@Observed与@ObjectLink实现对数据子属性的观测
@ObjectLink是 “绑定整个对象”
Repeat(状态V2)
使用@Observed V2与@Trace实现对数据子属性进行深度观测
@Trace可以精准标记 “需要观测的子属性”,减少不必要的观测开销,性能更高
3.6、组件复用机制不同
LazyForEach:
本身不具备复用能力
必须配合 @Reusable 装饰器才能复用
Repeat:
自带组件复用(默认开启,优先级最高)
两种方案:
1、直接使用自带复用(推荐)
2、使用 @ReusableV2,但必须先关闭自带复用
.virtualScroll({ reusable: false })
3.7、多模版渲染能力不同
LazyForEach:
无原生模板支持
只能通过 if/else 条件判断渲染不同模板
Repeat:
原生支持多模板渲染(官方推荐)
两种方案:
1、使用 .templateId() + .template()(性能最优)
2、使用 if/else 手动判断(需手动关闭自身复用能力)
.virtualScroll({ reusable: false })
四、总结:为啥主推Repeat替代LazyForEach
1、统一循环渲染API
ForEach / LazyForEach 二合一 → 只用 Repeat 搞定所有场景
2、使用更简单
普通数组+状态自动监听,不再使用IDataSource
3、性能更佳
@Trace 精准监听子属性
自带组件复用
原生多模板渲染
4、官方主推,新特性、新优化直接给到Repeat
更多推荐




所有评论(0)