17 懒加载

循环渲染服务数据时,需要多少加载多少 快 用户体验比较好

接口描述

LazyForEach(
    dataSource: IDataSource,             // 需要进行数据迭代的数据源
    itemGenerator: (item: Object, index: number) => void,  // 子组件生成函数
    keyGenerator?: (item: Object, index: number) => string // 键值生成函数
): void

IDataSource类型说明

interface IDataSource {
    totalCount(): number; // 获得数据总数
    getData(index: number): Object; // 获取索引值对应的数据
    registerDataChangeListener(listener: DataChangeListener): void; // 注册数据改变的监听器
    unregisterDataChangeListener(listener: DataChangeListener): void; // 注销数据改变的监听器
}

DataChangeListener类型说明

interface DataChangeListener {
    onDataReloaded(): void; // 重新加载数据完成后调用
    onDataAdded(index: number): void; // 添加数据完成后调用
    onDataMoved(from: number, to: number): void; // 数据移动起始位置与数据移动目标位置交换完成后调用
    onDataDeleted(index: number): void; // 删除数据完成后调用
    onDataChanged(index: number): void; // 改变数据完成后调用
    onDataAdd(index: number): void; // 添加数据完成后调用
    onDataMove(from: number, to: number): void; // 数据移动起始位置与数据移动目标位置交换完成后调用
    onDataDelete(index: number): void; // 删除数据完成后调用
    onDataChange(index: number): void; // 改变数据完成后调用
    onDatasetChange(dataOperations: DataOperation[]): void; // 批量数据处理后调用
}

DataOperation类型说明

type DataOperation =
      DataAddOperation |          // 添加数据操作
    DataDeleteOperation |       // 删除数据操作
    DataChangeOperation |       // 改变数据操作
    DataMoveOperation |         // 移动数据操作
    DataExchangeOperation |     // 交换数据操作
    DataReloadOperation         // 重载所有数据操作

DataAddOperation

interface DataAddOperation {
  type: DataOperationType.ADD,     // 数据添加类型
  index: number,                   // 插入数据索引值
  count?: number,                  // 插入数量,默认值为1
  key?: string | Array<string>     // 为插入的数据分配键值
}

DataDeleteOperation

interface DataDeleteOperation {
  type: DataOperationType.DELETE,  // 数据删除类型
  index: number,                   // 起始删除位置索引值
  count?: number                   // 删除数据数量,默认值为1
}

DataChangeOperation

interface DataChangeOperation {
  type: DataOperationType.CHANGE,  // 数据改变类型
  index: number,                   // 改变的数据的索引值
  key?: string                     // 为改变的数据分配新的键值,默认使用原键值
}

DataMoveOperation

interface MoveIndex {
  from: number;                    // 起始移动位置
  to: number;                      // 目的移动位置
}

interface DataMoveOperation {
  type: DataOperationType.MOVE,    // 数据移动类型
  index: MoveIndex,
  key?: string                     // 为被移动的数据分配新的键值,默认使用原键值
}

DataExchangeOperation

interface ExchangeIndex {
  start: number;                   // 第一个交换位置
  end: number;                     // 第二个交换位置
}
interface ExchangeKey {
  start: string;                   // 为第一个交换的位置分配新的键值,默认使用原键值
  end: string;                     // 为第二个交换的位置分配新的键值,默认使用原键值
}

interface DataExchangeOperation {
  type: DataOperationType.EXCHANGE,  // 数据交换类型
  index: ExchangeIndex,
  key?: ExchangeKey
}

DataReloadOperation

interface DataReloadOperation {     // 当onDatasetChange含有DataOperationType.RELOAD操作时,其余操作全部失效,框架会自己调用keygenerator进行键值比对
  type: DataOperationType.RELOAD    // 数据全部重载类型
}

DataOperationType

declare enum DataOperationType {
  ADD = 'add',                      // 数据添加
  DELETE = 'delete',                // 数据删除
  CHANGE = 'change',                // 数据改变
  MOVE = 'move',                    // 数据移动
  EXCHANGE = 'exchange',            // 数据交换
  RELOAD = 'reload'                 // 全部数据重载
}

使用限制

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

键值生成规则

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

组件创建规则

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

如果对您有帮助,一键三连哟

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值