色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

鴻蒙ArkUI開發學習:【渲染控制語法】

jf_46214456 ? 來源:jf_46214456 ? 作者:jf_46214456 ? 2024-04-09 16:40 ? 次閱讀

ArkUI開發框架是一套構建 HarmonyOS / OpenHarmony 應用界面的聲明式UI開發框架,它支持程序使用 if/else 條件渲染, ForEach 循環渲染以及 LazyForEach 懶加載渲染。本節筆者介紹一下這三種渲染方式的使用。

if/else條件渲染

使用 if/else 進行條件渲染需要注意以下情況:

  • if 條件語句可以使用狀態變量。

  • 使用 if 可以使子組件的渲染依賴條件語句。

  • 必須在容器組件內使用。

  • 某些容器組件限制子組件的類型或數量。將if放置在這些組件內時,這些限制將應用于 ifelse 語句內創建的組件。例如,Grid 組件的子組件僅支持 GridItem 組件,在 Grid 組件內使用條件渲染時,則 if 條件語句內僅允許使用 GridItem 組件。
    簡單樣例如下所示:

    @Entry @Component struct ComponentTest {
    
      @State showImage: boolean = false;
    
      build() {
        Column({space: 10}) {
    
          if (this.showImage) {            // 顯示圖片
            Image($r("app.media.test"))
              .width(160)
              .height(60)
              .backgroundColor(Color.Pink)
          } else {                         // 顯示文本
            Text('Loading...')
              .fontSize(23)
              .width(160)
              .height(60)
              .backgroundColor(Color.Pink)
          }
    
          Button(this.showImage ? 'Image Loaded' : 'Load Image')    // 按鈕文字
            .size({width: 160, height: 40})
            .backgroundColor(this.showImage ? Color.Gray : '#aabbcc')// 按鈕背景色
            .onClick(() = > {
              this.showImage = true;                                 // 設置標記位
            })
        }
        .width('100%')
        .height('100%')
        .padding(10)
      }
    }
    

    樣例運行結果如下圖所示:

    2_4_1

ForEach循環渲染

ArkUI開發框架提供循環渲染(ForEach組件)來迭代數組,并為每個數組項創建相應的組件。

ForEach 定義如下:

interface ForEach {(
	arr: Array< any >, 
	itemGenerator: (item: any, index?: number) = > void,
  keyGenerator?: (item: any, index?: number) = > string
  ): ForEach;
}
  • arr :必須是數組,允許空數組,空數組場景下不會創建子組件。
  • itemGenerator :子組件生成函數,為給定數組項生成一個或多個子組件。
  • keyGenerator :匿名參數,用于給定數組項生成唯一且穩定的鍵值。
    簡單樣例如下所示:
@Entry @Component struct ComponentTest {

  private textArray: string[] = ["1", "2", "3", "4", "5"];        // 數據源

  build() {
    Column({space: 10}) {
      ForEach(this.textArray, (item: string, index?: number) = > { // 循環數組創建每一個Item
        Text(`Text: ${item}`)                                     // 可以生成一個或多個子組件
          .fontSize(20)
          .backgroundColor(Color.Pink)
          .margin({ top: 10 })
      })
    }
    .width('100%')
    .height('100%')
    .padding(10)
  }
}

樣例運行結果如下圖所示:

2_4_2

LazyForEach循環渲染

搜狗高速瀏覽器截圖20240326151547.png

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;
    }
    
    • itemGenerator :子組件生成函數,為給定數組項生成一個或多個子組件。
    • keyGenerator :匿名參數,用于給定數組項生成唯一且穩定的鍵值。
    • dataSource :實現 IDataSource 接口的對象,需要開發者實現相關接口。
  2. IDataSource 定義如下:

    export declare interface IDataSource {
      totalCount(): number;
      getData(index: number): any;
      registerDataChangeListener(listener: DataChangeListener): void;
      unregisterDataChangeListener(listener: DataChangeListener): void;
    }
    
    • 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;
    }
    
    • onDataReloaded :item重新加載數據時的回調。
    • onDataAdded :item新添加數據時的回調。
    • onDataMoved :item數據移動時的回調。
    • onDataDeleted :item數據刪除時的回調。
    • onDataChanged :item數據變化時的回調。

簡單樣例如下:

// 定義Student
class Student {
  public sid: number;
  public name: string;
  public age: number
  public address: string
  public avatar: string
  constructor(sid: number = -1, name: string, age: number = 16, address: string = '北京', avatar: string = "") {
    this.sid = sid;
    this.name = name;
    this.age = age;
    this.address = address;
    this.avatar = avatar;
  }
}

// 定義DataSource
abstract class BaseDataSource< T > implements IDataSource {

  private mDataSource: T[] = new Array();

  constructor(dataList: T[]) {
    this.mDataSource = dataList;
  }

  totalCount(): number {
    return this.mDataSource == null ? 0 : this.mDataSource.length
  }

  getData(index: number): T|null {
    return index >= 0 && index < this.totalCount() ? this.mDataSource[index] : null;
  }

  registerDataChangeListener(listener: DataChangeListener) {
  }

  unregisterDataChangeListener(listener: DataChangeListener) {
  }

}

// 
class StudentDataSource extends BaseDataSource< Student > {
  constructor(students: Student[]) {
    super(students)
  }
}

function mock(): Student[] {
  var students = [];
  for(var i = 0; i < 20; i++) {
    students[i] = new Student(i, "student:" + i, i + 10, "address:" + i, "app.media.test")
  }
  return students;
}

@Entry @Component struct ComponentTest {

  // mock數據
  private student: Student[] = mock();

  // 創建dataSource
  private dataSource: StudentDataSource = new StudentDataSource(this.student);

  build() {
    Column({space: 10}) {
      List() {
        LazyForEach(this.dataSource, (item: Student) = > {// LazyForEach使用自定義dataSource
          ListItem() {
            Row() {
              Image($r("app.media.test"))
                .height('100%')
                .width(80)
              Column() {
                Text(this.getName(item)) // 調用getName驗證懶加載
                  .fontSize(20)
                Text('address: ' + item.address)
                  .fontSize(17)
              }
              .margin({left: 5})
              .alignItems(HorizontalAlign.Start)
              .layoutWeight(1)
            }
            .width('100%')
            .height('100%')
          }
          .width('100%')
          .height(60)
        })
      }
      .divider({
        strokeWidth: 3,
        color: Color.Gray
      })
      .width('90%')
      .height(160)
      .backgroundColor(Color.Pink)
    }
    .width('100%')
    .height('100%')
    .padding(10)
  }

  getName(item: Student): string {
    console.log("index: " + item.sid); // 打印item下標日志
    return 'index:' + item.sid + ", " + item.name;
  }
}

樣例運行結果如下圖所示:

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

使用懶加載,可以有效的降低資源占用

審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 鴻蒙
    +關注

    關注

    57

    文章

    2386

    瀏覽量

    42961
  • HarmonyOS
    +關注

    關注

    79

    文章

    1980

    瀏覽量

    30395
  • OpenHarmony
    +關注

    關注

    25

    文章

    3744

    瀏覽量

    16470
收藏 人收藏

    評論

    相關推薦

    鴻蒙ArkUI開發-Video組件的使用

    以視頻功能為例,在應用開發過程中,我們需要通過ArkUI提供的Video組件為應用增加基礎的視頻播放功能。借助Video組件,我們可以實現視頻的播放功能并控制其播放狀態。常見的視頻播放場景包括觀看網絡上的較為流行的短視頻,也包括
    的頭像 發表于 01-23 16:59 ?1419次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>ArkUI</b><b class='flag-5'>開發</b>-Video組件的使用

    鴻蒙開發學習:初探【ArkUI-X】

    **簡單來說,ArkTS + ArkUI-X 對標的框架為 flutter,一次代碼,編譯為 native 全平臺運行**
    的頭像 發表于 05-13 15:58 ?1096次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>開發</b><b class='flag-5'>學習</b>:初探【<b class='flag-5'>ArkUI</b>-X】

    免費學習鴻蒙(HarmonyOS)開發,一些地址分享

    國內一流高校。通過鴻蒙班的設立,高??梢詾閷W生提供專業的鴻蒙OS學習環境和豐富的實踐機會,培養出更多的鴻蒙開發人才,為
    發表于 01-12 20:48

    HarmonyOS實戰開發-合理選擇條件渲染和顯隱控制

    14ms。 可見,針對反復切換條件渲染控制分支的情況,且控制分支中的組件子樹結構比較復雜,使用組件復用機制,可以提升應用性能。 最后 如果大家覺得這篇內容對學習
    發表于 05-10 15:16

    請問鴻蒙系統是否支持native側opengles渲染引擎開發?

    鴻蒙系統是否支持native側opengles渲染引擎開發
    發表于 05-27 15:11

    HDD杭州站?ArkUI開發更靈活

    。 采用聲明式語法,更符合開發者繪制習慣。 框架集成Canvas能力,無需引入Web引擎。 同時,ArkUI還提供離屏繪制能力。當繪制的圖形比較復雜時,頻繁的刪除與重繪會消耗很多性能。這時,
    發表于 08-05 11:33

    ArkUI,更高效的框架設計

    ArkUI是一套用于構建HarmonyOS應用界面的UI開發框架,本期我們將從架構設計上來聊聊ArkUI的設計理念。 ArkUI架構圖 從架構圖可以看出,
    發表于 12-21 10:26

    4天帶你上手HarmonyOS ArkUI開發——《HarmonyOS ArkUI入門訓練營之健康生活實戰》

    者快速提升技能實力進階。目標學員入門開發者(計算機專業相關)學習鏈接:https://t.elecfans.com/c2241.html訓練營目標通過學習ArkUI入門訓練營課程,了解
    發表于 01-05 11:49

    ArkUI新能力,助力應用開發更便捷

    ArkUI是一套構建分布式應用的聲明式UI開發框架。它具備簡潔自然的UI信息語法、豐富的UI組件、多維的狀態管理,以及實時界面預覽等相關能力,幫助您提升應用開發效率,并能在多種設備上實
    發表于 02-15 11:40

    HarmonyOS/OpenHarmony應用開發-ArkTS語言渲染控制概述

    ArkUI通過自定義組件的build()函數和@builder裝飾器中的聲明式UI描述語句構建相應的UI。 在聲明式描述語句中開發者除了使用系統組件外,還可以使用渲染控制語句來輔助U
    發表于 08-09 09:54

    ArkUI新能力,助力應用開發更便捷

    作者:niulihua,華為ArkUI技術專家;wanglei,華為ArkUI技術專家 ArkUI是一套構建分布式應用的聲明式UI開發框架。它具備簡潔自然的UI信息
    的頭像 發表于 02-15 16:35 ?885次閱讀

    鴻蒙ArkUI開發-Tabs組件的使用

    鴻蒙ArkUI開發-Tabs組件的使用
    的頭像 發表于 01-19 16:01 ?1992次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>ArkUI</b><b class='flag-5'>開發</b>-Tabs組件的使用

    鴻蒙ArkUI實例:【自定義組件】

    組件是 OpenHarmony 頁面最小顯示單元,一個頁面可由多個組件組合而成,也可只由一個組件組合而成,這些組件可以是ArkUI開發框架自帶系統組件,比如?`Text`?、?`Button`?等,也可以是自定義組件,本節筆者簡單介紹一下自定義組件的
    的頭像 發表于 04-08 10:17 ?677次閱讀

    鴻蒙ArkUI:【從代碼到UI顯示的整體渲染流程】

    方舟開發框架(簡稱ArkUI)是鴻蒙開發的UI框架,提供如下兩種開發范式,我們 **只學聲明式開發
    的頭像 發表于 05-13 16:06 ?1001次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>ArkUI</b>:【從代碼到UI顯示的整體<b class='flag-5'>渲染</b>流程】

    鴻蒙ArkUI-X跨平臺技術:【開發準備】

    本文檔適用于ArkUI跨平臺應用開發的初學者。通過開發環境搭建、應用工程創建、編譯和運行,熟悉ArkUI跨平臺應用開發基本流程。
    的頭像 發表于 05-24 10:40 ?531次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>ArkUI</b>-X跨平臺技術:【<b class='flag-5'>開發</b>準備】
    主站蜘蛛池模板: 国产精品久久久久久久A片冻果 | 欧美xxxxx18| fryee性欧美18 19| 色综合精品无码一区二区三区| 国产精品日本欧美一区二区| 亚洲精品无夜久久久久久久久 | 91久久综合精品国产丝袜长腿| 日本成熟bbxxxxxxxx| 精品久久久久中文字幕日本| 99综合之综合久久伊人| 亚洲精品无码一区二区三区四虎| 奇米狠狠干| 精品AV国产一区二区三区| 草莓在线观看| 影音先锋色av男人资源网| 三级叫床震大尺度视频| 老师掀开短裙让我挺进动态| 国产精品伦一区二区三级视频| 97超在线视频| 亚洲精品白色在线发布| 青青草原直播| 久久婷婷电影网| 国产免费人成在线看视频| jk白丝袜美女被男人桶| 影音先锋 av天堂| 天天影视色欲 影视| 免费被靠视频动漫| 国产亚洲欧美在线观看三区| chinesedaddy80老年人| 妖精视频免费看| 忘忧草在线社区WWW日本-韩国| 女生扒开下面| 久久这里只有精品2| 韩国精品韩国专区久久| 国产成人在线免费| jizz破处| 99久久国产综合精品国| 伊人久久综合成人亚洲| 亚洲精品国产高清嫩草影院| 十分钟免费视频大全在线观看 | 国产麻豆精品人妻无码A片|