# 2.4:渲染控制语法

ArkUI开发框架是一套构建 HarmonyOS / OpenHarmony 应用界面的声明式UI开发框架,它支持程序使用 if/else 条件渲染, ForEach 循环渲染以及 LazyForEach 懒加载渲染。本节笔者介绍一下这三种渲染方式的使用。

# 2.4.1:if/else条件渲染

使用 if/else 进行条件渲染需要注意以下情况:

  • if 条件语句可以使用状态变量。

  • 使用 if 可以使子组件的渲染依赖条件语句。

  • 必须在容器组件内使用。

  • 某些容器组件限制子组件的类型或数量。将if放置在这些组件内时,这些限制将应用于 ifelse 语句内创建的组件。例如,Grid 组件的子组件仅支持 GridItem 组件,在 Grid 组件内使用条件渲染时,则 if 条件语句内仅允许使用 GridItem 组件。

    简单样例如下所示:

      样例运行结果如下图所示:

      2_4_1

    # 2.4.2:ForEach循环渲染

    ArkUI开发框架提供循环渲染(ForEach组件)来迭代数组,并为每个数组项创建相应的组件。

    ForEach 定义如下:

    interface ForEach {(
    	arr: Array<any>, 
    	itemGenerator: (item: any, index?: number) => void,
      keyGenerator?: (item: any, index?: number) => string
      ): ForEach;
    }
    
    1
    2
    3
    4
    5
    6
    • arr:必须是数组,允许空数组,空数组场景下不会创建子组件。

    • itemGenerator:子组件生成函数,为给定数组项生成一个或多个子组件。

    • keyGenerator:匿名参数,用于给定数组项生成唯一且稳定的键值。

      简单样例如下所示:

        样例运行结果如下图所示:

        2_4_2

      # 2.4.3:LazyForEach循环渲染

      ArkUI开发框架提供数据懒加载( LazyForEach 组件)从提供的数据源中按需迭代数据,并在每次迭代过程中创建相应的组件。

      1. LazyForEach 定义如下:

        // LazyForEach定义
        interface LazyForEach {(
        	dataSource: IDataSource, 
          itemGenerator: (item: any, index?: number) => void,
          keyGenerator?: (item: any, index?: number) => string
          ): LazyForEach;
        }
        
        // IDataSource定义
        export declare interface IDataSource {
          totalCount(): number;
          getData(index: number): any;
          registerDataChangeListener(listener: DataChangeListener): void;
          unregisterDataChangeListener(listener: DataChangeListener): void;
        }
        
        // DataChangeListener定义
        export declare interface DataChangeListener {
          onDataReloaded(): void;
          onDataAdded(index: number): void;
          onDataMoved(from: number, to: number): void;
          onDataDeleted(index:number): void;
          onDataChanged(index:number): void;
        }
        
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        23
        24
        • itemGenerator:子组件生成函数,为给定数组项生成一个或多个子组件。
        • keyGenerator:匿名参数,用于给定数组项生成唯一且稳定的键值。
        • dataSource:实现 IDataSource 接口的对象,需要开发者实现相关接口。
      2. IDataSource 定义如下:

        export declare interface IDataSource {
          totalCount(): number;
          getData(index: number): any;
          registerDataChangeListener(listener: DataChangeListener): void;
          unregisterDataChangeListener(listener: DataChangeListener): void;
        }
        
        1
        2
        3
        4
        5
        6
        • totalCount:获取数据总数。
        • getData:获取索引对应的数据。
        • registerDataChangeListener:注册改变数据的监听器。
        • unregisterDataChangeListener:注销改变数据的监听器。
      3. DataChangeListener 定义如下:

        export declare interface DataChangeListener {
          onDataReloaded(): void;
          onDataAdded(index: number): void;
          onDataMoved(from: number, to: number): void;
          onDataDeleted(index:number): void;
          onDataChanged(index:number): void;
        }
        
        1
        2
        3
        4
        5
        6
        7
        • onDataReloaded:item重新加载数据时的回调。
        • onDataAdded:item新添加数据时的回调。
        • onDataMoved:item数据移动时的回调。
        • onDataDeleted:item数据删除时的回调。
        • onDataChanged:item数据变化时的回调。

      简单样例如下:

        样例运行结果如下图所示:

        2_4_3

        打印结果如下:

        [phone][Console    INFO]  04/02 23:54:19 82919424 app Log: Application onCreate
        [phone][Console   DEBUG]  04/02 23:54:19 82919424 app Log: index: 0
        [phone][Console   DEBUG]  04/02 23:54:19 82919424 app Log: index: 1
        [phone][Console   DEBUG]  04/02 23:54:19 82919424 app Log: index: 2
        [phone][Console   DEBUG]  04/02 23:54:19 82919424 app Log: index: 3
        [phone][Console   DEBUG]  04/02 23:54:19 82919424 app Log: index: 4
        [phone][Console   DEBUG]  04/02 23:54:19 82919424 app Log: index: 5
        
        1
        2
        3
        4
        5
        6
        7

        📢:使用懒加载,可以有效的降低资源占用

        # 2.4.4:小结

        本节主要讲解了ArkUI开发框架的渲染控制语法,读者熟练掌握后可以随心所欲的控制页面的显示逻辑了(#^.^#)

        (adsbygoogle = window.adsbygoogle || []).push({});
        请作者喝杯咖啡

        津公网安备 12011402001367号

        津ICP备2020008934号-2

        中央网信办互联网违法和不良信息举报中心

        天津市互联网违法和不良信息举报中心