国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

案例:新聞數(shù)據(jù)加載

這篇具有很好參考價(jià)值的文章主要介紹了案例:新聞數(shù)據(jù)加載。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。


案例:新聞數(shù)據(jù)加載,HarmonyOS基礎(chǔ)知識(shí),華為,harmonyos,typescript,網(wǎng)絡(luò)請(qǐng)求

介紹

本篇Codelab是基于ArkTS的聲明式開(kāi)發(fā)范式實(shí)現(xiàn)的樣例,主要介紹了數(shù)據(jù)請(qǐng)求和touch事件的使用。包含以下功能:

  1. 數(shù)據(jù)請(qǐng)求。
  2. 列表下拉刷新。
  3. 列表上拉加載。

相關(guān)概念

  • List組件:列表包含一系列相同寬度的列表項(xiàng)。
  • Tabs:通過(guò)頁(yè)簽進(jìn)行內(nèi)容視圖切換。
  • TabContent:僅在Tabs中使用,對(duì)應(yīng)一個(gè)切換頁(yè)簽的內(nèi)容視圖。
  • 數(shù)據(jù)請(qǐng)求:提供HTTP數(shù)據(jù)請(qǐng)求能力。
  • 觸摸事件onTouch:觸摸動(dòng)作觸發(fā)調(diào)用該方法。

相關(guān)權(quán)限

網(wǎng)絡(luò)數(shù)據(jù)請(qǐng)求需要申請(qǐng)權(quán)限:ohos.permission.INTERNET。

約束與限制

本篇Codelab需要搭建服務(wù)端環(huán)境,服務(wù)端如何搭建將在代碼工程目錄的README中詳細(xì)介紹,文檔中不再贅述。

完整示例

gitee源碼地址

源碼下載

新聞數(shù)據(jù)加載(ArkTS).zip

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

本篇Codelab只對(duì)核心代碼進(jìn)行講解,對(duì)于完整代碼,我們會(huì)在源碼下載或gitee中提供。

├──entry/src/main/ets                   // ArkTS代碼區(qū)
│  ├──common
│  │  ├──constant
│  │  │  └──CommonConstant.ets          // 公共常量類
│  │  └──utils
│  │     ├──HttpUtil.ets                // 網(wǎng)絡(luò)請(qǐng)求方法
│  │     ├──Logger.ets                  // 日志工具類
│  │     ├──PullDownRefresh.ets         // 下拉刷新方法
│  │     └──PullUpLoadMore.ets          // 上拉加載更多方法
│  ├──entryability
│  │  └──EntryAbility.ts                // 程序入口類
│  ├──pages
│  │  └──Index.ets                      // 主頁(yè)面
│  ├──view
│  │  ├──CustomRefreshLoadLayout.ets    // 下拉刷新、上拉加載布局文件
│  │  ├──LoadMoreLayout.ets             // 上拉加載布局封裝
│  │  ├──NewsItem.ets                   // 新聞數(shù)據(jù)
│  │  ├──NewsList.ets                   // 新聞列表
│  │  ├──NoMoreLayout.ets               // 上拉停止布局封裝
│  │  ├──RefreshLayout.ets              // 下拉刷新布局封裝
│  │  └──TabBar.ets                     // 新聞?lì)愋晚?yè)簽
│  └──viewmodel
│     ├──NewsModel.ets                  // 新聞模型類
│     └──NewsViewModel.ets              // 新聞ViewModel
├──entry/src/main/resources             // 資源文件目錄
└──HttpServerOfNews                     // 服務(wù)端代碼

構(gòu)建主界面

本章節(jié)將介紹新聞列表頁(yè)面的實(shí)現(xiàn),用tabBar展示新聞分類,tabContent展示新聞列表,效果圖如圖所示:

案例:新聞數(shù)據(jù)加載,HarmonyOS基礎(chǔ)知識(shí),華為,harmonyos,typescript,網(wǎng)絡(luò)請(qǐng)求

在TabBar.ets文件中的aboutToAppear()方法里獲取新聞分類。

// TabBar.ets
aboutToAppear() {
  // 請(qǐng)求服務(wù)端新聞?lì)悇e
  NewsViewModel.getNewsTypeList().then((typeList: NewsTypeBean[]) => {
    this.tabBarArray = typeList;
  }).catch((typeList: NewsTypeBean[]) => {
     this.tabBarArray = typeList;
  });
}

在NewsList.ets文件中的aboutToAppear()方法里獲取新聞數(shù)據(jù),將數(shù)據(jù)加載到新聞列表頁(yè)面ListLayout布局中。

// NewsList.ets
changeCategory() {
  this.newsModel.currentPage = 1;
  NewsViewModel.getNewsList(this.newsModel.currentPage, this.newsModel.pageSize, Const.GET_NEWS_LIST)
    .then((data: NewsData[]) => {
      this.newsModel.pageState = PageState.Success;
      if (data.length === this.newsModel.pageSize) {
        this.newsModel.currentPage++;
        this.newsModel.hasMore = true;
      } else {
        this.newsModel.hasMore = false;
      }
      this.newsModel.newsData = data;
    })
    .catch((err: string | Resource) => {
      promptAction.showToast({
        message: err,
        duration: Const.ANIMATION_DURATION
      });
      this.newsModel.pageState = PageState.Fail;
    });
}
aboutToAppear() {
  // 請(qǐng)求服務(wù)端新聞數(shù)據(jù)
  this.changeCategory();
}
...
@Builder ListLayout() {
  List() {
    ...
    ForEach(this.newsModel.newsData, (item: NewsData) => {
      ListItem() {
        // 新聞數(shù)據(jù)
        NewsItem({ newsData: item })
      }
      .height($r('app.float.news_list_height'))
      .backgroundColor($r('app.color.white'))
      .margin({ top: $r('app.float.news_list_margin_top') })
      .borderRadius(Const.NewsListConstant_ITEM_BORDER_RADIUS)
    }, (item: NewsData, index?: number) => JSON.stringify(item) + index)
    ...
  }
  ...
}

數(shù)據(jù)請(qǐng)求

在module.json5文件中配置如右側(cè)所示權(quán)限:

這一章節(jié),將基于新聞數(shù)據(jù)請(qǐng)求來(lái)介紹如何從服務(wù)端請(qǐng)求數(shù)據(jù)。

// module.json5
"requestPermissions": [
  {
    "name": "ohos.permission.INTERNET",
    "reason": "$string:dependency_reason",
    "usedScene": {
      "abilities": [
        "EntryAbility"
      ],
      "when": "inuse"
    }
  }
]

導(dǎo)入http模塊,封裝httpRequestGet方法,調(diào)用者傳入url地址發(fā)起網(wǎng)絡(luò)數(shù)據(jù)請(qǐng)求。

// HttpUtil.ets
import http from '@ohos.net.http';
...
export function httpRequestGet(url: string): Promise<ResponseResult> {
  let httpRequest = http.createHttp();
  // 發(fā)送數(shù)據(jù)請(qǐng)求
  let responseResult = httpRequest.request(url, {
    method: http.RequestMethod.GET,
    readTimeout: Const.HTTP_READ_TIMEOUT,
    header: {
      'Content-Type': ContentType.JSON
    },
    connectTimeout: Const.HTTP_READ_TIMEOUT,
    extraData: {}
  });
  let serverData: ResponseResult = new ResponseResult();
  // 處理數(shù)據(jù),并返回
  return responseResult.then((value: http.HttpResponse) => {
    Logger.info(`http value ${JSON.stringify(value)}`);
    if (value.responseCode === Const.HTTP_CODE_200) {
      // 獲取返回?cái)?shù)據(jù)
      let result = `${value.result}`;
      let resultJson: ResponseResult = JSON.parse(result);
      if (resultJson.code === Const.SERVER_CODE_SUCCESS) {
        serverData.data = resultJson.data;
      }
      serverData.code = resultJson.code;
      serverData.msg = resultJson.msg;
    } else {
      serverData.msg = `${$r('app.string.http_error_message')}&${value.responseCode}`;
    }
    return serverData;
  }).catch(() => {
    serverData.msg = $r('app.string.http_error_message');
    return serverData;
  })
}

在NewsViewModel.ets文件中封裝getNewsList方法,調(diào)用httpRequestGet方法請(qǐng)求服務(wù)端,用Promise異步保存返回的新聞數(shù)據(jù)列表。

// NewsViewModel.ets
// 獲取服務(wù)端新聞數(shù)據(jù)列表
getNewsList(currentPage: number, pageSize: number, path: string): Promise<NewsData[]> {
  return new Promise(async (resolve: Function, reject: Function) => {
    let url = `${Const.SERVER}/${path}`;
    url += '?currentPage=' + currentPage + '&pageSize=' + pageSize;
    httpRequestGet(url).then((data: ResponseResult) => {
      if (data.code === Const.SERVER_CODE_SUCCESS) {
        resolve(data.data);
      } else {
        Logger.error('getNewsList failed', JSON.stringify(data));
        reject($r('app.string.page_none_msg'));
      }
    }).catch((err: Error) => {
      Logger.error('getNewsList failed', JSON.stringify(err));
      reject($r('app.string.http_error_message'));
    });
  });
}

下拉刷新

本章節(jié)將以下拉刷新的功能效果來(lái)介紹touch事件的使用。效果圖如圖所示:

案例:新聞數(shù)據(jù)加載,HarmonyOS基礎(chǔ)知識(shí),華為,harmonyos,typescript,網(wǎng)絡(luò)請(qǐng)求

創(chuàng)建一個(gè)下拉刷新布局CustomLayout,動(dòng)態(tài)傳入刷新圖片和刷新文字描述。

// CustomRefreshLoadLayout.ets
build() {
  Row() {
    // 下拉刷新圖片
    Image(this.customRefreshLoadClass.imageSrc)
      ...
    // 下拉刷新文字
    Text(this.customRefreshLoadClass.textValue)
      ...
  }
  ...
}

將下拉刷新的布局添加到NewsList.ets文件中新聞列表布局ListLayout里面,監(jiān)聽(tīng)ListLayout組件的onTouch事件實(shí)現(xiàn)下拉刷新。

// NewsList.ets
build() {
  Column() {
    if (this.newsModel.pageState === PageState.Success) {
      this.ListLayout()
    }
    ...
  }
  ...
  .onTouch((event: TouchEvent | undefined) => {
    if (event) {
      if (this.newsModel.pageState === PageState.Success) {
        listTouchEvent(this.newsModel, event);
      }
    }
  })
}
...
@Builder ListLayout() {
  List() {
    ListItem() {
      RefreshLayout({
        refreshLayoutClass: new CustomRefreshLoadLayoutClass(this.newsModel.isVisiblePullDown, this.newsModel.pullDownRefreshImage,
          this.newsModel.pullDownRefreshText, this.newsModel.pullDownRefreshHeight)
      })
      ...
    }
  }
  ...
}
  1. 在onTouch事件中,listTouchEvent方法判斷觸摸事件是否滿足下拉條件。如右側(cè)listTouchEvent所示:
  2. 在touchMovePullRefresh方法中,我們將對(duì)下拉的偏移量與下拉刷新布局的高度進(jìn)行對(duì)比,如果大于布局高度并且在新聞列表的頂部,則表示達(dá)到刷新條件。如右側(cè)touchMovePullRefresh所示:
  3. 在pullRefreshState方法中我們會(huì)對(duì)下拉刷新布局中的狀態(tài)圖片和描述進(jìn)行改變,如右側(cè)pullRefreshState所示。
  4. 當(dāng)手指松開(kāi),才執(zhí)行刷新操作。
// PullDownRefresh.ets
export function listTouchEvent(newsModel: NewsModel, event: TouchEvent) {
  switch (event.type) {
    ...
    case TouchType.Move:
      if ((newsModel.isRefreshing === true) || (newsModel.isLoading === true)) {
        return;
      }
      let isDownPull = event.touches[0].y - newsModel.lastMoveY > 0;
      if (((isDownPull === true) || (newsModel.isPullRefreshOperation === true)) && (newsModel.isCanLoadMore === false))
      {
        // 手指移動(dòng),處理下拉刷新
        touchMovePullRefresh(newsModel, event);
      }
      ...
      break;
  }
}
export function touchMovePullRefresh(newsModel: NewsModel, event: TouchEvent) {
  if (newsModel.startIndex === 0) {
    newsModel.isPullRefreshOperation = true;
    let height = vp2px(newsModel.pullDownRefreshHeight);
    newsModel.offsetY = event.touches[0].y - newsModel.downY;
    // 滑動(dòng)偏移量大于下拉刷新布局高度,滿足刷新條件。
    if (newsModel.offsetY >= height) {
      pullRefreshState(newsModel, RefreshState.Release);
      newsModel.offsetY = height + newsModel.offsetY * Const.Y_OFF_SET_COEFFICIENT;
    } else {
      pullRefreshState(newsModel, RefreshState.DropDown);
    }
    if (newsModel.offsetY < 0) {
      newsModel.offsetY = 0;
      newsModel.isPullRefreshOperation = false;
    }
  }
}
export function pullRefreshState(newsModel: NewsModel, state: number) {
  switch (state) {
    ...
    case RefreshState.Release:
      newsModel.pullDownRefreshText = $r('app.string.release_refresh_text');
      newsModel.pullDownRefreshImage = $r('app.media.ic_pull_up_refresh');
      newsModel.isCanRefresh = true;
      newsModel.isRefreshing = false;
      break;
    case RefreshState.Refreshing:
      newsModel.offsetY = vp2px(newsModel.pullDownRefreshHeight);
      newsModel.pullDownRefreshText = $r('app.string.refreshing_text');
      newsModel.pullDownRefreshImage = $r('app.media.ic_pull_up_load');
      newsModel.isCanRefresh = true;
      newsModel.isRefreshing = true;
      break;
    case RefreshState.Success:
      newsModel.pullDownRefreshText = $r('app.string.refresh_success_text');
      newsModel.pullDownRefreshImage = $r('app.media.ic_succeed_refresh');
      newsModel.isCanRefresh = true;
      newsModel.isRefreshing = true;
      break;
    ...
    default:
      break;
  }
}

上拉加載也是通過(guò)touch事件來(lái)實(shí)現(xiàn)的,此處不再贅敘,有興趣的同學(xué)可參考代碼。

總結(jié)

您已經(jīng)完成了本次Codelab的學(xué)習(xí),并了解到以下知識(shí)點(diǎn):文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-806324.html

  1. 使用List組件實(shí)現(xiàn)數(shù)據(jù)列表。
  2. 使用Tabs、TabContent組件實(shí)現(xiàn)內(nèi)容視圖切換。
  3. 網(wǎng)絡(luò)數(shù)據(jù)請(qǐng)求。
  4. 觸摸事件onTouch的使用。

到了這里,關(guān)于案例:新聞數(shù)據(jù)加載的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • JVM基礎(chǔ)知識(shí)(內(nèi)存區(qū)域劃分,類加載,GC垃圾回收)

    JVM基礎(chǔ)知識(shí)(內(nèi)存區(qū)域劃分,類加載,GC垃圾回收)

    目錄 內(nèi)存區(qū)域劃分 JVM中的棧 JVM中的堆 程序計(jì)數(shù)器 方法區(qū)(元數(shù)據(jù)區(qū)) 給一段代碼,某個(gè)變量在哪個(gè)區(qū)域上? 類加載 類加載時(shí)機(jī) 雙親委派模型 GC 垃圾回收機(jī)制 GC 實(shí)際工作過(guò)程 1.找到垃圾/判定垃圾 1.可達(dá)性分析(Java中的做法) 2.引用計(jì)數(shù) 2.清理垃圾 1.標(biāo)記清除 2.復(fù)制算法 3.標(biāo)記整

    2024年02月07日
    瀏覽(28)
  • 【01】基礎(chǔ)知識(shí):React簡(jiǎn)介與案例

    React 概述 React 是一個(gè)將數(shù)據(jù)渲染為 HTML 視圖 的開(kāi)源 JavaScript 庫(kù) React 由 FaceBook 開(kāi)發(fā),且開(kāi)源 為什么要學(xué)習(xí) React 1、原生 JavaScript 操作 DOM 繁瑣、效率低(使用 DOM-API 操作 UI) 2、使用 JavaScript 直接操作 DOM,瀏覽器會(huì)進(jìn)行大量的重繪重排 3、原生 JavaScript 沒(méi)有組件化編碼方案,

    2024年02月07日
    瀏覽(34)
  • p7付費(fèi)課程筆記:jvm基礎(chǔ)知識(shí)、字節(jié)碼、類加載器

    p7付費(fèi)課程筆記:jvm基礎(chǔ)知識(shí)、字節(jié)碼、類加載器

    機(jī)器語(yǔ)言-編程語(yǔ)言-高級(jí)語(yǔ)言(java,c++,Go,Rust等) 面向過(guò)程–面向?qū)ο?面向函數(shù) java是一種面向?qū)ο蟆㈧o態(tài)類型、編譯執(zhí)行,有VM(虛擬機(jī))/GC和運(yùn)行時(shí)、跨平臺(tái)的高級(jí)語(yǔ)言。重點(diǎn):VM(虛擬機(jī))/GC(Garbage Collector)和運(yùn)行時(shí)、跨平臺(tái)。 跨平臺(tái)步驟:字節(jié)碼文件被虛擬機(jī)加載(

    2024年02月10日
    瀏覽(18)
  • Nodejs后端架構(gòu)基礎(chǔ)知識(shí)和案例展示

    Nodejs后端架構(gòu)基礎(chǔ)知識(shí)和案例展示

    入門筆記,大神請(qǐng)繞路?。。?簡(jiǎn)單的說(shuō) Node.js 就是運(yùn)行在服務(wù)端的 JavaScript。 Node.js 是一個(gè)基于Chrome JavaScript 運(yùn)行時(shí)建立的一個(gè)平臺(tái)。 Node.js是一個(gè)事件驅(qū)動(dòng)I/O服務(wù)端JavaScript環(huán)境,基于Google的V8引擎,V8引擎執(zhí)行Javascript的速度非???,性能非常好。 優(yōu)點(diǎn): 1.高并發(fā) (高并發(fā)的

    2023年04月11日
    瀏覽(19)
  • 【JavaScript】講解JavaScript的基礎(chǔ)知識(shí)并且配有案例講解

    【JavaScript】講解JavaScript的基礎(chǔ)知識(shí)并且配有案例講解

    ??專欄【?前端易錯(cuò)合集】 ??喜歡的詩(shī)句:更喜岷山千里雪 三軍過(guò)后盡開(kāi)顏。 ??音樂(lè)分享【如愿】 大一同學(xué)小吉,歡迎并且感謝大家指出我的問(wèn)題?? 目錄 ? ??JavaScript嵌入網(wǎng)頁(yè)的方式 ??alert(\\\"這是一個(gè)JavaScript例子\\\"); ????(或者window.alert()) ???document.write(\\\"這是一個(gè)Jav

    2024年02月08日
    瀏覽(50)
  • 數(shù)據(jù)倉(cāng)庫(kù)基礎(chǔ)知識(shí)

    數(shù)據(jù)倉(cāng)庫(kù)基礎(chǔ)知識(shí)

    我要了解企業(yè)目前的運(yùn)轉(zhuǎn)情況?。▽?shí)時(shí)監(jiān)控) 我要知道某地區(qū)近5年內(nèi)的銷售情況以制定未來(lái)的發(fā)展策略!(決策支持) 我要知道哪些是值得發(fā)展的優(yōu)質(zhì)的顧客?。A(yù)測(cè)) BI是Business Intelligence的英文縮寫,中文解釋為商務(wù)智能, 用來(lái)幫助企業(yè)更好地利用數(shù)據(jù)提高決策質(zhì)量的技

    2024年02月11日
    瀏覽(24)
  • 大數(shù)據(jù)基礎(chǔ)知識(shí)

    大數(shù)據(jù)基礎(chǔ)知識(shí)

    目錄 第一章 大數(shù)據(jù)介紹 1.大數(shù)據(jù)概念 2.大數(shù)據(jù)的特點(diǎn) 3.大數(shù)據(jù)的步驟 第二章 Hadoop 1.Hadoop簡(jiǎn)介 2.Hadoop的特性 第三章 分布式文件系統(tǒng)HDFS 1.HDFS相關(guān)概念 2.HDFS體系結(jié)構(gòu) 3.HDFS存儲(chǔ)原理 第四章 分布式數(shù)據(jù)庫(kù)HBase 1.HBase簡(jiǎn)介 2.HBase訪問(wèn)接口 3.HBase數(shù)據(jù)模型 4.HBase的實(shí)現(xiàn)原理 5.HBase運(yùn)行機(jī)

    2024年02月11日
    瀏覽(49)
  • 數(shù)據(jù)結(jié)構(gòu)--基礎(chǔ)知識(shí)

    數(shù)據(jù)結(jié)構(gòu)--基礎(chǔ)知識(shí)

    數(shù)據(jù)結(jié)構(gòu)是計(jì)算機(jī)科學(xué)中研究數(shù)據(jù)組織、存儲(chǔ)和管理的方法和原則。它涉及存儲(chǔ)和操作數(shù)據(jù)的方式,以便能夠高效地使用和訪問(wèn)數(shù)據(jù)。 數(shù)組(Array):數(shù)組是一種線性數(shù)據(jù)結(jié)構(gòu),由相同類型的元素按順序排列而成。數(shù)組具有固定長(zhǎng)度,在內(nèi)存中占據(jù)連續(xù)的位置??梢酝ㄟ^(guò)索引

    2024年02月14日
    瀏覽(18)
  • 數(shù)據(jù)庫(kù)基礎(chǔ)知識(shí)

    名稱 描述 舉例 DDL 數(shù)據(jù)定義語(yǔ)言 create(創(chuàng)建)、alter(修改)、drop(刪除)、rename(重命名)、truncate(清空) DML 數(shù)據(jù)操作語(yǔ)言 insert(添加)、delete(刪除)、update(修改)、select(查詢) DCL 數(shù)據(jù)控制語(yǔ)言 commit(提交)、rollback(撤銷)、grant(賦予權(quán)限)、revoke(回收

    2024年02月09日
    瀏覽(94)
  • 數(shù)據(jù)庫(kù)基礎(chǔ)知識(shí)之?dāng)?shù)據(jù)類型

    數(shù)據(jù)庫(kù)基礎(chǔ)知識(shí)之?dāng)?shù)據(jù)類型

    mysql常用數(shù)據(jù)類型 一、數(shù)值類型(整型、浮點(diǎn)型) 1、整型 eg:添加一個(gè)表格:點(diǎn)擊表——添加字段——名稱——類型,年齡age是tinyint類型,要在下方勾選無(wú)符號(hào),因?yàn)槟挲g都是正數(shù),不存在負(fù)數(shù)一說(shuō),所以不需要符號(hào)。 點(diǎn)擊保存,然后輸入表名,比如t1,就出現(xiàn)了t1 ? ?然后

    2024年02月06日
    瀏覽(20)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包