1# LazyForEach 2 3> **说明** 4> 5> 本模块首批接口从API version 7开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 6 7开发者指南见:[LazyForEach开发者指南](../../../quick-start/arkts-rendering-control-lazyforeach.md)。 8 9## 接口 10 11LazyForEach(dataSource: IDataSource,itemGenerator: (item: any, index: number) => void,keyGenerator?: (item: any, index: number) => string,) 12 13LazyForEach从提供的数据源中按需迭代数据,并在每次迭代过程中创建相应的组件。当在滚动容器中使用了LazyForEach,框架会根据滚动容器可视区域按需创建组件,当组件滑出可视区域外时,框架会进行组件销毁回收以降低内存占用。 14 15**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 16 17**系统能力:** SystemCapability.ArkUI.ArkUI.Full 18 19**参数:** 20 21| 参数名 | 类型 | 必填 | 说明 | 22| ------------- | --------------------------------------------------------- | ---- | ------------------------------------------------------------ | 23| dataSource | [IDataSource](#idatasource10) | 是 | LazyForEach数据源,需要开发者实现相关接口。 | 24| itemGenerator | (item: Object, index: number) => void | 是 | 子组件生成函数,为数组中的每一个数据项创建一个子组件。<br/>**说明:**<br/>- item是当前数据项,index是数据项索引值。<br/>- itemGenerator的函数体必须使用大括号{...}。<br />- itemGenerator每次迭代只能并且必须生成一个子组件。<br />- itemGenerator中可以使用if语句,但是必须保证if语句每个分支都会创建一个相同类型的子组件。<br />- itemGenerator中不允许使用ForEach和LazyForEach语句。 | 25| keyGenerator | (item: Object, index: number) => string | 否 | 键值生成函数,用于给数据源中的每一个数据项生成唯一且固定的键值。当数据项在数组中的位置更改时,其键值不得更改,当数组中的数据项被新项替换时,被替换项的键值和新项的键值必须不同。键值生成器的功能是可选的,但是,为了使开发框架能够更好地识别数组更改,提高性能,建议提供。如将数组反向时,如果没有提供键值生成器,则LazyForEach中的所有节点都将重建。<br/>**说明:**<br/>- item是当前数据项,index是数据项索引值。<br/>- 数据源中的每一个数据项生成的键值不能重复。 | 26 27## 属性 28 29继承自[DynamicNode](./ts-rendering-control-foreach.md#dynamicnode12)。 30 31## IDataSource<sup>10+</sup> 32 33**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 34 35**系统能力:** SystemCapability.ArkUI.ArkUI.Full 36 37### totalCount 38 39totalCount(): number 40 41获得数据总数。 42 43**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 44 45**系统能力:** SystemCapability.ArkUI.ArkUI.Full 46 47### getData 48 49getData(index: number): Object 50 51获取索引值index对应的数据。 52 53**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 54 55**系统能力:** SystemCapability.ArkUI.ArkUI.Full 56 57**参数:** 58 59| 参数名 | 类型 | 必填 | 说明 | 60| ------ | ------ | ---- | -------------------- | 61| index | number | 是 | 获取数据对应的索引值。 | 62 63### registerDataChangeListener 64 65registerDataChangeListener(listener: DataChangeListener): void 66 67注册数据改变的监听器。 68 69**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 70 71**系统能力:** SystemCapability.ArkUI.ArkUI.Full 72 73**参数:** 74 75| 参数名 | 类型 | 必填 | 说明 | 76| -------- | ------------------------------------------- | ---- | -------------- | 77| listener | [DataChangeListener](#datachangelistener10) | 是 | 数据变化监听器。 | 78 79### unregisterDataChangeListener 80 81unregisterDataChangeListener(listener: DataChangeListener): void 82 83注销数据改变的监听器。 84 85**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 86 87**系统能力:** SystemCapability.ArkUI.ArkUI.Full 88 89**参数:** 90 91| 参数名 | 类型 | 必填 | 说明 | 92| -------- | ------------------------------------------- | ---- | -------------- | 93| listener | [DataChangeListener](#datachangelistener10) | 是 | 数据变化监听器。 | 94 95## DataChangeListener<sup>10+</sup> 96 97数据变化监听器。 98 99> **说明:** 100> 101> DataChangeListener除onDatasetChange以外的方法中,当参数包含index且值为负数时,会默认用0来替换。onDatasetChange中,当单个DataOperation参数包含index且值在数据源索引范围之外(DataAddOperation中index可以等于数据源长度),则对应DataOperation不会生效。 102 103**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 104 105**系统能力:** SystemCapability.ArkUI.ArkUI.Full 106 107### onDataReloaded 108 109onDataReloaded(): void 110 111通知组件重新加载所有数据。键值没有变化的数据项会使用原先的子组件,键值发生变化的会重建子组件。重新加载数据完成后调用。 112 113**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 114 115**系统能力:** SystemCapability.ArkUI.ArkUI.Full 116 117### onDataAdded<sup>(deprecated)</sup> 118 119onDataAdded(index: number): void 120 121通知组件index的位置有数据添加。添加数据完成后调用。 122 123> 从API 8开始,建议使用[onDataAdd](#ondataadd8)。 124 125**系统能力:** SystemCapability.ArkUI.ArkUI.Full 126 127**参数:** 128 129| 参数名 | 类型 | 必填 | 说明 | 130| ------ | ------ | ---- | -------------------- | 131| index | number | 是 | 数据添加位置的索引值。 | 132 133### onDataMoved<sup>(deprecated)</sup> 134 135onDataMoved(from: number, to: number): void 136 137通知组件数据有移动。将from和to位置的数据进行交换。 138 139> 从API 8开始,建议使用[onDataMove](#ondatamove8)。 140 141> **说明:** 142> 143> 数据移动前后键值要保持不变,如果键值有变化,应使用删除数据和新增数据接口。数据移动起始位置与数据移动目标位置交换完成后调用。 144 145**系统能力:** SystemCapability.ArkUI.ArkUI.Full 146 147**参数:** 148 149| 参数名 | 类型 | 必填 | 说明 | 150| ------ | ------ | ---- | ---------------- | 151| from | number | 是 | 数据移动起始位置。 | 152| to | number | 是 | 数据移动目标位置。 | 153 154### onDataDeleted<sup>(deprecated)</sup> 155 156onDataDeleted(index: number): void 157 158通知组件删除index位置的数据并刷新LazyForEach的展示内容。删除数据完成后调用。 159 160> 从API 8开始,建议使用[onDataDelete](#ondatadelete8)。 161 162**系统能力:** SystemCapability.ArkUI.ArkUI.Full 163 164**参数:** 165 166| 参数名 | 类型 | 必填 | 说明 | 167| ------ | ------ | ---- | -------------------- | 168| index | number | 是 | 数据删除位置的索引值。 | 169 170### onDataChanged<sup>(deprecated)</sup> 171 172onDataChanged(index: number): void 173 174通知组件index的位置有数据有变化。改变数据完成后调用。 175 176> 从API 8开始,建议使用[onDataChange](#ondatachange8)。 177 178**系统能力:** SystemCapability.ArkUI.ArkUI.Full 179 180**参数:** 181 182| 参数名 | 类型 | 必填 | 说明 | 183| ------ | ------ | ---- | -------------- | 184| index | number | 是 | 数据变化监听器。 | 185 186### onDataAdd<sup>8+</sup> 187 188onDataAdd(index: number): void 189 190通知组件index的位置有数据添加。添加数据完成后调用 191 192**卡片能力:** 从API version 10开始,该接口支持在ArkTS卡片中使用。 193 194**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 195 196**系统能力:** SystemCapability.ArkUI.ArkUI.Full 197 198**参数:** 199 200| 参数名 | 类型 | 必填 | 说明 | 201| ------ | ------ | ---- | -------------- | 202| index | number | 是 | 数据添加位置的索引值。 | 203 204### onDataMove<sup>8+</sup> 205 206onDataMove(from: number, to: number): void 207 208通知组件数据有移动。将from和to位置的数据进行交换。数据移动起始位置与数据移动目标位置交换完成后调用。 209 210> **说明:** 211> 212> 数据移动前后键值要保持不变,如果键值有变化,应使用删除数据和新增数据接口。 213 214**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 215 216**系统能力:** SystemCapability.ArkUI.ArkUI.Full 217 218**参数:** 219 220| 参数名 | 类型 | 必填 | 说明 | 221| ------ | ------ | ---- | ---------------- | 222| from | number | 是 | 数据移动起始位置。 | 223| to | number | 是 | 数据移动目标位置。 | 224 225### onDataDelete<sup>8+</sup> 226 227onDataDelete(index: number): void 228 229通知组件删除index位置的数据并刷新LazyForEach的展示内容。删除数据完成后调用。 230 231> **说明:** 232> 233> 需要保证dataSource中的对应数据已经在调用onDataDelete前删除,否则页面渲染将出现未定义的行为。 234 235**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 236 237**系统能力:** SystemCapability.ArkUI.ArkUI.Full 238 239**参数:** 240 241| 参数名 | 类型 | 必填 | 说明 | 242| ------ | ------ | ---- | -------------------- | 243| index | number | 是 | 数据删除位置的索引值。 | 244 245### onDataChange<sup>8+</sup> 246 247onDataChange(index: number): void 248 249通知组件index的位置有数据有变化。改变数据完成后调用。 250 251**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 252 253**系统能力:** SystemCapability.ArkUI.ArkUI.Full 254 255**参数:** 256 257| 参数名 | 类型 | 必填 | 说明 | 258| ------ | ------ | ---- | -------------------- | 259| index | number | 是 | 数据变化位置的索引值。 | 260 261### onDatasetChange<sup>12+</sup> 262 263onDatasetChange(dataOperations: DataOperation[]): void 264 265进行批量的数据处理后,调用onDatasetChange接口通知组件按照dataOperations刷新组件。 266 267> **说明:** 268> 269> onDatasetChange接口不能与其他DataChangeListener的更新接口混用。如在同一个LazyForEach中,调用过onDataAdd接口后,不能再调用onDatasetChange接口;反之,调用过onDatasetChange接口后,也不能调用onDataAdd等其他更新接口。页面中不同LazyForEach之间互不影响。 270 271**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 272 273**系统能力:** SystemCapability.ArkUI.ArkUI.Full 274 275**参数:** 276 277| 参数名 | 类型 | 必填 | 说明 | 278| -------------- | ------------------- | ---- | ------------------ | 279| dataOperations | [DataOperation](#dataoperation12)[] | 是 | 一次处理数据的操作。 | 280 281## DataOperation<sup>12+</sup> 282 283> **说明** 284> 285> 本模块首批接口从API version 12开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 286 287**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 288 289**系统能力:** SystemCapability.ArkUI.ArkUI.Full 290 291### DataAddOperation 292 293添加数据操作。 294 295**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 296 297**系统能力:** SystemCapability.ArkUI.ArkUI.Full 298 299**参数:** 300 301| 参数名 | 类型 | 必填 | 说明 | 302| ------ | ------------------------- | ---- | -------------------- | 303| type | [DataOperationType](#dataoperationtype枚举说明).ADD | 是 | 数据添加类型。 | 304| index | number | 是 | 插入数据索引值。 | 305| count | number | 否 | 插入数量,默认为1。 | 306| key | string \| Array\<string\> | 否 | 为插入的数据分配键值。 | 307 308### DataDeleteOperation 309 310删除数据操作。 311 312**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 313 314**系统能力:** SystemCapability.ArkUI.ArkUI.Full 315 316**参数:** 317 318| 参数名 | 类型 | 必填 | 说明 | 319| ------ | ------------------------- | ---- | -------------------- | 320| type | [DataOperationType](#dataoperationtype枚举说明).DELETE | 是 | 数据删除类型。 | 321| index | number | 是 | 起始删除位置索引值。 | 322| count | number | 否 | 删除数据数量,默认为1。 | 323 324### DataChangeOperation 325 326改变数据操作。 327 328**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 329 330**系统能力:** SystemCapability.ArkUI.ArkUI.Full 331 332**参数:** 333 334| 参数名 | 类型 | 必填 | 说明 | 335| ------ | ------------------------- | ---- | -------------------- | 336| type | [DataOperationType](#dataoperationtype枚举说明).CHANGE | 是 | 数据改变类型。 | 337| index | number | 是 | 改变的数据的索引值。 | 338| key | string | 否 | 为改变的数据分配新的键值,默认使用原键值。 | 339 340### DataMoveOperation 341 342移动数据操作。 343 344**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 345 346**系统能力:** SystemCapability.ArkUI.ArkUI.Full 347 348**参数:** 349 350| 参数名 | 类型 | 必填 | 说明 | 351| ------ | ------------------------- | ---- | -------------------- | 352| type | [DataOperationType](#dataoperationtype枚举说明).MOVE | 是 | 数据移动类型。 | 353| index | [MoveIndex](#moveindex) | 是 | 移动位置。 | 354| key | string | 否 | 为被移动的数据分配新的键值,默认使用原键值。 | 355 356#### MoveIndex 357 358**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 359 360**系统能力:** SystemCapability.ArkUI.ArkUI.Full 361 362**参数:** 363 364| 参数名 | 类型 | 必填 | 说明 | 365| ------ | --------------- | ---- | ------- | 366| from | number | 是 | 起始移动位置。 | 367| to | number | 是 | 目的移动位置。 | 368 369### DataExchangeOperation 370 371交换数据操作。 372 373**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 374 375**系统能力:** SystemCapability.ArkUI.ArkUI.Full 376 377**参数:** 378 379| 参数名 | 类型 | 必填 | 说明 | 380| ------ | -------------------------- | ---- | ---------------------------- | 381| type | [DataOperationType](#dataoperationtype枚举说明).EXCHANGE | 是 | 数据交换类型。 | 382| index | [ExchangeIndex](#exchangeindex) | 是 | 交换位置。 | 383| key | [ExchangeKey](#exchangekey) | 否 | 分配新的键值,默认使用原键值。 | 384 385#### ExchangeIndex 386 387**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 388 389**系统能力:** SystemCapability.ArkUI.ArkUI.Full 390 391**参数:** 392 393| 参数名 | 类型 | 必填 | 说明 | 394| ------ | --------------- | ---- | ------- | 395| start | number | 是 | 第一个交换位置。 | 396| end | number | 是 | 第二个交换位置。 | 397 398#### ExchangeKey 399 400**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 401 402**系统能力:** SystemCapability.ArkUI.ArkUI.Full 403 404**参数:** 405 406| 参数名 | 类型 | 必填 | 说明 | 407| ------ | --------------- | ---- | ------- | 408| start | string | 是 | 为第一个交换的位置分配新的键值,默认使用原键值。 | 409| end | string | 是 | 为第二个交换的位置分配新的键值,默认使用原键值。 | 410 411### DataReloadOperation 412 413重载所有数据操作。当onDatasetChange含有DataOperationType.RELOAD操作时,其余操作全部失效,框架会自己调用keygenerator进行键值比对。 414 415**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 416 417**系统能力:** SystemCapability.ArkUI.ArkUI.Full 418 419**参数:** 420 421| 参数名 | 类型 | 必填 | 说明 | 422| ------ | ------------------------ | ---- | ---------------- | 423| type | [DataOperationType](#dataoperationtype枚举说明).RELOAD | 是 | 数据全部重载类型。 | 424 425### DataOperationType枚举说明 426 427枚举类型,数据操作说明。 428 429**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 430 431**系统能力:** SystemCapability.ArkUI.ArkUI.Full 432 433| 名称 | 值 | 说明 | 434| ------ | ------------------- | -------------------- | 435| ADD | add | 数据添加。 | 436| DELETE | delete | 数据删除。 | 437| CHANGE | change | 数据改变。 | 438| MOVE | move | 数据移动。 | 439| EXCHANGE | exchange | 数据交换。 | 440| RELOAD | reload | 全部数据重载。 |