一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

HarmonyOS開(kāi)發(fā)案例:【使用List組件實(shí)現(xiàn)商品列表】

jf_46214456 ? 來(lái)源:jf_46214456 ? 作者:jf_46214456 ? 2024-05-10 16:41 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

介紹

OpenHarmony ArkTS提供了豐富的接口和組件,開(kāi)發(fā)者可以根據(jù)實(shí)際場(chǎng)景和開(kāi)發(fā)需求,選用不同的組件和接口。在本篇Codelab中,我們使用Scroll、List以及LazyForEach實(shí)現(xiàn)一個(gè)商品列表的頁(yè)面,并且擁有下拉刷新,懶加載和到底提示的效果。效果圖如下:

相關(guān)概念

  • [Scroll]:可滾動(dòng)的容器組件,當(dāng)子組件的布局尺寸超過(guò)父組件的視口時(shí),內(nèi)容可以滾動(dòng)。
  • [List]:列表包含一系列相同寬度的列表項(xiàng)。適合連續(xù)、多行呈現(xiàn)同類數(shù)據(jù),例如圖片和文本。
  • [Tabs]:一種可以通過(guò)頁(yè)簽進(jìn)行內(nèi)容視圖切換的容器組件,每個(gè)頁(yè)簽對(duì)應(yīng)一個(gè)內(nèi)容視圖。
  • [LazyForEach]:開(kāi)發(fā)框架提供數(shù)據(jù)懶加載(LazyForEach組件)從提供的數(shù)據(jù)源中按需迭代數(shù)據(jù),并在每次迭代過(guò)程中創(chuàng)建相應(yīng)的組件。

環(huán)境搭建

軟件要求

  • [DevEco Studio]版本:DevEco Studio 3.1 Release。
  • OpenHarmony SDK版本:API version 9。

硬件要求

  • 開(kāi)發(fā)板類型:[潤(rùn)和RK3568開(kāi)發(fā)板]。
  • OpenHarmony系統(tǒng):3.2 Release。

環(huán)境搭建

完成本篇Codelab我們首先要完成開(kāi)發(fā)環(huán)境的搭建,本示例以RK3568開(kāi)發(fā)板為例,參照以下步驟進(jìn)行:

  1. [獲取OpenHarmony系統(tǒng)版本]:標(biāo)準(zhǔn)系統(tǒng)解決方案(二進(jìn)制)。以3.2 Release版本為例:
  2. 搭建燒錄環(huán)境。
    1. [完成DevEco Device Tool的安裝]
    2. [完成RK3568開(kāi)發(fā)板的燒錄](méi)
  3. 搭建開(kāi)發(fā)環(huán)境。
    1. 開(kāi)始前請(qǐng)參考[工具準(zhǔn)備],完成DevEco Studio的安裝和開(kāi)發(fā)環(huán)境配置。
    2. 開(kāi)發(fā)環(huán)境配置完成后,請(qǐng)參考[使用工程向?qū)創(chuàng)建工程(模板選擇“Empty Ability”),選擇JS或者eTS語(yǔ)言開(kāi)發(fā)。
    3. 工程創(chuàng)建完成后,選擇使用[真機(jī)進(jìn)行調(diào)測(cè)]。
    4. 鴻蒙開(kāi)發(fā)指導(dǎo)文檔:[gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md]

代碼結(jié)構(gòu)解讀

本篇Codelab只對(duì)核心代碼進(jìn)行講解,完整代碼可以直接從gitee獲取。

├──entry/src/main/ets                      // 代碼區(qū)
│  ├──common
│  │  └──CommonConstants.ets               // 常量集合文件
│  ├──entryability
│  │  └──EntryAbility.ts                   // 應(yīng)用入口,承載應(yīng)用的生命周期
│  ├──pages
│  │  └──ListIndex.ets                     // 頁(yè)面入口
│  ├──view
│  │  ├──GoodsListComponent.ets            // 商品列表組件
│  │  ├──PutDownRefreshLayout.ets          // 下拉刷新組件
│  │  └──TabBarsComponent.ets              // Tabs組件
│  └──viewmodel
│     ├──InitialData.ets                   // 初始化數(shù)據(jù)
│     └──ListDataSource.ets                // List使用的相關(guān)數(shù)據(jù)加載
└──entry/src/main/resources
    ├──base
    │  ├──element                          // 字符串以及顏色的資源文件
    │  ├──media                            // 圖片等資源文件
    │  └──profile                          // 頁(yè)面配置文件存放位置
    ├──en_US
    │  └──element
    │     └──string.json                   // 英文字符存放位置
    └──zh_CN
        └──element
           └──string.json                  // 中文字符存放位置
           
`HarmonyOS與OpenHarmony鴻蒙文檔籽料:mau123789是v直接拿`

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

頁(yè)面布局

頁(yè)面使用Navigation與Tabs做頁(yè)面布局,使用Navigation的title屬性實(shí)現(xiàn)頁(yè)面的標(biāo)題,Tabs做商品內(nèi)容的分類。示例代碼如下:

// ListIndex.ets
Row() {
  Navigation() {
    Column() {
      TabBars()
    }
    .width(LAYOUT_WIDTH_OR_HEIGHT)
    .justifyContent(FlexAlign.Center)
  }
  .size({ width: LAYOUT_WIDTH_OR_HEIGHT, height: LAYOUT_WIDTH_OR_HEIGHT })
  .title(STORE)
  .titleMode(NavigationTitleMode.Mini)
}
.height(LAYOUT_WIDTH_OR_HEIGHT)
.backgroundColor($r('app.color.primaryBgColor'))

頁(yè)面分為“精選”、“手機(jī)”、“服飾”、“穿搭”、“家居”五個(gè)模塊,由于本篇CodeLab的主要內(nèi)容在“精選”部分,故將“精選”部分單獨(dú)編寫(xiě)代碼,其余模塊使用ForEach遍歷生成。示例代碼如下:

// TabBarsComponent.ets
Tabs() {
  // 精選模塊
  TabContent() {
    Scroll() {
      Column() {
        if (this.refreshStatus) {
          PutDownRefresh({ refreshText: $refreshText })
        }
        GoodsList()
        Text($r('app.string.to_bottom'))
          .fontSize(NORMAL_FONT_SIZE)
          .fontColor($r('app.color.gray'))
      }
      .width(LAYOUT_WIDTH_OR_HEIGHT)
    }
    ...
  }
  .tabBar(this.firstTabBar)

  // 其他模塊
  ForEach(initTabBarData, (item: Resource, index?: number) = > {
    TabContent() {
      Column() {
        Text(item).fontSize(MAX_FONT_SIZE)
      }
      .justifyContent(FlexAlign.Center)
      .width(LAYOUT_WIDTH_OR_HEIGHT)
      .height(LAYOUT_WIDTH_OR_HEIGHT)
    }
    .tabBar(this.otherTabBar(item, index !== undefined ? index : 0))
  })
}
...

商品列表的懶加載

使用Scroll嵌套List做長(zhǎng)列表,實(shí)現(xiàn)Scroll與List的聯(lián)動(dòng)。具體實(shí)現(xiàn)代碼如下:

// TabBarsComponent.ets
Scroll() {
  Column() {
    // 下拉刷新的組件
    if (this.refreshStatus) {
      PutDownRefresh({ refreshText:$refreshText })
    }

    // List的自定義組件
    GoodsList()
    Text($r('app.string.to_bottom')).fontSize(NORMAL_FONT_SIZE).fontColor($r('app.color.gray'))
  }
  .width(LAYOUT_WIDTH_OR_HEIGHT)
}
...

商品列表往往數(shù)據(jù)量很多,如果使用ForEach一次性遍歷生成的話,性能不好,所以這里使用LazyForEach進(jìn)行數(shù)據(jù)的懶加載。當(dāng)向下滑動(dòng)時(shí),需要加載新的數(shù)據(jù)的時(shí)候,再將新的數(shù)據(jù)加載出來(lái),生成新的列表。

通過(guò)onTouch事件來(lái)觸發(fā)懶加載行為,當(dāng)商品列表向下滑動(dòng),加載新的數(shù)據(jù)。示例代碼如下:

// GoodsListComponent.ets
List({ space:commonConst.LIST_ITEM_SPACE }) {
  LazyForEach(this.goodsListData, (item: GoodsListItemType) = > {
    ListItem() {
      Row() {
        Column() {
          Image(item?.goodsImg)
            ...
        }
        ... // 布局樣式

        Column() {
          ... // 布局代碼
        }
        ... // 布局樣式
      }
    }

    // 通過(guò)Touch事件來(lái)觸發(fā)懶加載
    .onTouch((event?:TouchEvent) = > {
      if (event === undefined) {
        return;
      }
      switch (event.type) {
        case TouchType.Down:
          this.startTouchOffsetY = event.touches[0].y;
          break;
        case TouchType.Up:
          this.startTouchOffsetY = event.touches[0].y;
          break;
        case TouchType.Move:
          if (this.startTouchOffsetY - this.endTouchOffsetY > 0) {
            this.goodsListData.pushData();
          }
          break;
      }
    })
  })
}
...

下拉刷新與到底提示

下拉刷新同樣使用TouchEvent做下拉的判斷,當(dāng)下拉的偏移量超出將要刷新的偏移量時(shí),就展示下拉刷新的布局,同時(shí)使用條件渲染判斷是否顯示下拉刷新布局,實(shí)現(xiàn)效果如下圖:

具體代碼如下:

// TabBarsComponent.ets
putDownRefresh(event?:TouchEvent): void {
  if (event === undefined) {
    return;
  }
  switch (event.type) {
    case TouchType.Down:
      // 記錄手指按下的y坐標(biāo)
      this.currentOffsetY = event.touches[0].y;
      break;
    case TouchType.Move:
      // 根據(jù)下拉的偏移量來(lái)判斷是否刷新
      this.refreshStatus = event.touches[0].y - this.currentOffsetY > MAX_OFFSET_Y;
      break;
    case TouchType.Cancel:
      break;
    case TouchType.Up:
      // 模擬刷新效果,并未真實(shí)請(qǐng)求數(shù)據(jù)
      this.timer = setTimeout(() = > {
        this.refreshStatus = false;
        }, REFRESH_TIME)
      break;
  }
}
...
// 下拉刷新的組件根據(jù)條件決定是否顯示
if (this.refreshStatus) {
  PutDownRefresh({ refreshText:$refreshText })
}

列表到底提示“已經(jīng)到底了”并回彈的效果使用了Scroll的edgeEffect來(lái)控制回彈,實(shí)現(xiàn)效果如下圖:

具體代碼如下:

// TabBarsComponent.ets
Scroll() {
  Column() {
    ...
    GoodsList()
    Text($r('app.string.to_bottom')).fontSize(NORMAL_FONT_SIZE).fontColor($r('app.color.gray'))
  }
  .width(LAYOUT_WIDTH_OR_HEIGHT)
}
.scrollBar(BarState.Off)
.edgeEffect(EdgeEffect.Spring)
.width(LAYOUT_WIDTH_OR_HEIGHT)
.height(LAYOUT_WIDTH_OR_HEIGHT)
.onTouch((event?: TouchEvent) = > {
  this.putDownRefresh(event)
})

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 組件
    +關(guān)注

    關(guān)注

    1

    文章

    532

    瀏覽量

    18424
  • 鴻蒙
    +關(guān)注

    關(guān)注

    60

    文章

    2620

    瀏覽量

    44060
  • HarmonyOS
    +關(guān)注

    關(guān)注

    80

    文章

    2126

    瀏覽量

    33078
  • OpenHarmony
    +關(guān)注

    關(guān)注

    29

    文章

    3854

    瀏覽量

    18619
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    HarmonyOS開(kāi)發(fā)案例:【使用List組件實(shí)現(xiàn)設(shè)置項(xiàng)】

    使用List組件、Toggle組件以及Router接口,實(shí)現(xiàn)一個(gè)簡(jiǎn)單的設(shè)置頁(yè),點(diǎn)擊將跳轉(zhuǎn)到對(duì)應(yīng)的詳細(xì)設(shè)置頁(yè)面。
    的頭像 發(fā)表于 05-10 17:01 ?1396次閱讀
    <b class='flag-5'>HarmonyOS</b><b class='flag-5'>開(kāi)發(fā)案</b>例:【使用<b class='flag-5'>List</b><b class='flag-5'>組件</b><b class='flag-5'>實(shí)現(xiàn)</b>設(shè)置項(xiàng)】

    HarmonyOS開(kāi)發(fā)案例:【W(wǎng)eb組件實(shí)現(xiàn)抽獎(jiǎng)】

    基于ArkTS的聲明式開(kāi)發(fā)范式的樣例,主要介紹了Web組件如何加載本地和云端H5小程序。
    的頭像 發(fā)表于 05-09 18:31 ?1672次閱讀
    <b class='flag-5'>HarmonyOS</b><b class='flag-5'>開(kāi)發(fā)案</b>例:【W(wǎng)eb<b class='flag-5'>組件</b><b class='flag-5'>實(shí)現(xiàn)</b>抽獎(jiǎng)】

    HarmonyOS開(kāi)發(fā)案例:【基礎(chǔ)組件Slider的使用】

    學(xué)習(xí)如何使用聲明式UI編程框架的基礎(chǔ)組件。本篇Codelab將會(huì)使用Image組件、Slider組件、Text組件共同實(shí)現(xiàn)一個(gè)可調(diào)節(jié)的風(fēng)車動(dòng)
    的頭像 發(fā)表于 05-10 16:01 ?1062次閱讀
    <b class='flag-5'>HarmonyOS</b><b class='flag-5'>開(kāi)發(fā)案</b>例:【基礎(chǔ)<b class='flag-5'>組件</b>Slider的使用】

    HarmonyOS開(kāi)發(fā)案例:【常用組件與布局】

    HarmonyOS ArkUI提供了豐富多樣的UI組件,您可以使用這些組件輕松地編寫(xiě)出更加豐富、漂亮的界面。
    的頭像 發(fā)表于 05-09 18:20 ?1789次閱讀
    <b class='flag-5'>HarmonyOS</b><b class='flag-5'>開(kāi)發(fā)案</b>例:【常用<b class='flag-5'>組件</b>與布局】

    HarmonyOS開(kāi)發(fā)案例:【排行榜頁(yè)面】

    本課程使用聲明式語(yǔ)法和組件化基礎(chǔ)知識(shí),搭建一個(gè)可刷新的排行榜頁(yè)面。在排行榜頁(yè)面中,使用循環(huán)渲染控制語(yǔ)法來(lái)實(shí)現(xiàn)列表數(shù)據(jù)渲染,使用@Builder創(chuàng)建排行列表布局內(nèi)容,使用裝飾器@Stat
    的頭像 發(fā)表于 04-30 16:16 ?2504次閱讀
    <b class='flag-5'>HarmonyOS</b><b class='flag-5'>開(kāi)發(fā)案</b>例:【排行榜頁(yè)面】

    HarmonyOS開(kāi)發(fā)案例:【待辦列表

    使用ArkTS聲明式語(yǔ)法和基礎(chǔ)組件實(shí)現(xiàn)簡(jiǎn)易待辦列表。效果為點(diǎn)擊某一事項(xiàng),替換標(biāo)簽圖片、虛化文字。
    的頭像 發(fā)表于 05-06 15:22 ?1556次閱讀
    <b class='flag-5'>HarmonyOS</b><b class='flag-5'>開(kāi)發(fā)案</b>例:【待辦<b class='flag-5'>列表</b>】

    鴻蒙開(kāi)發(fā)實(shí)戰(zhàn)-(ArkUI)List組件和Grid組件的使用

    一系列相同寬度的列表項(xiàng),連續(xù)、多行呈現(xiàn)同類數(shù)據(jù),例如圖片和文本。常見(jiàn)的列表有線性列表List列表)和網(wǎng)格布局(Grid
    發(fā)表于 01-18 20:18

    《仿盒馬》app開(kāi)發(fā)技術(shù)分享-- 分類右側(cè)商品列表(18)

    技術(shù)棧 Appgallery connect 開(kāi)發(fā)準(zhǔn)備 上一節(jié)我們實(shí)現(xiàn)了分類頁(yè)左側(cè)二級(jí)分類列表功能,并實(shí)現(xiàn)了頂部列表&彈窗跟左側(cè)
    發(fā)表于 06-30 12:00

    HarmonyOS NEXT應(yīng)用元服務(wù)常見(jiàn)列表操作二級(jí)聯(lián)動(dòng)

    二級(jí)聯(lián)動(dòng)場(chǎng)景 場(chǎng)景描述 通過(guò)左邊一級(jí)列表的選擇,聯(lián)動(dòng)更新右邊二級(jí)列表的數(shù)據(jù),常用于商品分類選擇、編輯風(fēng)格等二級(jí)類別選擇頁(yè)面。 本場(chǎng)景以商品分類列表
    發(fā)表于 07-02 10:29

    【基于HarmonyOS開(kāi)發(fā)購(gòu)物應(yīng)用】AnBetter Codelab第二期記錄帖

    量。應(yīng)用包含兩級(jí)頁(yè)面,分別是主頁(yè)(商品瀏覽頁(yè)簽、購(gòu)物車頁(yè)簽、我的頁(yè)簽)和商品詳情頁(yè)面,兩個(gè)頁(yè)面都展示了豐富的HarmonyOS UI組件,包括:自定義彈窗容器(dialog),
    發(fā)表于 04-17 00:55

    使用JS實(shí)現(xiàn)一款簡(jiǎn)單的HarmonyOS購(gòu)物應(yīng)用

    1. 介紹本篇Codelab將會(huì)使用UI組件開(kāi)發(fā)出一個(gè)HarmonyOS購(gòu)物應(yīng)用。HarmonyOS開(kāi)發(fā)者提供了多種
    發(fā)表于 09-23 10:40

    HarmonyOS/OpenHarmony應(yīng)用開(kāi)發(fā)-聲明式開(kāi)發(fā)范式組件匯總

    組件是構(gòu)建頁(yè)面的核心,每個(gè)組件通過(guò)對(duì)數(shù)據(jù)和方法的簡(jiǎn)單封裝,實(shí)現(xiàn)獨(dú)立的可視、可交互功能單元。組件之間相互獨(dú)立,隨取隨用,也可以在需求相同的地方重復(fù)使用。聲明式
    發(fā)表于 01-19 11:14

    如何用JS UI框架的List組件畫(huà)一個(gè)表格?

    UI框架的List組件畫(huà)一個(gè)表格”。 作者通過(guò)List組件快速、高效地構(gòu)建了一個(gè)自定義表格。接下來(lái),讓我們一起見(jiàn)證作者是如何遇到問(wèn)題,解決問(wèn)題,最終
    的頭像 發(fā)表于 07-01 10:42 ?2442次閱讀

    華為開(kāi)發(fā)者分論壇HarmonyOS學(xué)生公開(kāi)課-OpenHarmony Codelabs開(kāi)發(fā)案

    2021華為開(kāi)發(fā)者分論壇HarmonyOS學(xué)生公開(kāi)課-OpenHarmony Codelabs開(kāi)發(fā)案
    的頭像 發(fā)表于 10-24 11:25 ?2170次閱讀
    華為<b class='flag-5'>開(kāi)發(fā)</b>者分論壇<b class='flag-5'>HarmonyOS</b>學(xué)生公開(kāi)課-OpenHarmony Codelabs<b class='flag-5'>開(kāi)發(fā)案</b>例

    HarmonyOS開(kāi)發(fā)案例:【 switch、chart組件的使用】

    基于switch組件和chart組件,實(shí)現(xiàn)線形圖、占比圖、柱狀圖,并通過(guò)switch切換chart組件數(shù)據(jù)的動(dòng)靜態(tài)顯示。
    的頭像 發(fā)表于 04-25 20:58 ?1093次閱讀
    <b class='flag-5'>HarmonyOS</b><b class='flag-5'>開(kāi)發(fā)案</b>例:【 switch、chart<b class='flag-5'>組件</b>的使用】