【HarmonyOS NEXT】网络请求 - 分页加载

分页加载关键字:onReachEnd

一、申请网络权限

module.json5 文件中,添加网络权限:

json 复制代码
{
  "module": {
    
    ...

    "requestPermissions": [
      {
        "name": "ohos.permission.INTERNET",
        "usedScene": {
          "when": "always"
        }
      }
    ]
  }
}

二、创建数据结构体

ts 复制代码
export default class NewsInfo {
  title: string = ''
  thumbnail: string = ''
  publish_time: string = ''
  source: string = ''
  origin: string = ''
}
ts 复制代码
import NewsInfo from '../viewmodel/NewsInfo'

export default class NewsData {
  code: string = ''
  data: NewsInfo[] = []
}

三、封装网络请求

ts 复制代码
import NewsData from '../viewmodel/NewsData';
import http from '@ohos.net.http';

class NewsModel {
  baseURL: string = 'https://china.nba.cn/cms/v1'
  pageNo: number = 1

  getNewsList(): Promise<NewsData> {
    return new Promise((resolve, reject) => {
      let httpRequest = http.createHttp()
      httpRequest.request(
        `${this.baseURL}/news/list?column_id=57&page_size=5&page_no=${this.pageNo}&app_key=tiKB2tNdncnZFPOi&os_type=3&os_version=10.0&app_version=1.0.0&install_id=202111201544&network=wifi&t=1716876416465&device_id=6bdaac33a8df720345a767431e62caf3&channel=nba&sign=48da38cc43775e0efea30a3726328530`,
        {
          method: http.RequestMethod.GET
        }
      )
        .then(response => {
          if (response.responseCode === 200) {
            console.log('查询新闻信息成功!', response.result)
            resolve(JSON.parse(response.result.toString()))
          } else {
            console.log('查询新闻信息失败!error:', JSON.stringify(response))
            reject('查询新闻信息失败')
          }
        })
        .catch((error: Error) => {
          console.log('查询新闻信息失败!error:', JSON.stringify(error))
          reject('查询新闻信息失败')
        })
    })
  }
}

const newsModel = new NewsModel()

export default newsModel as NewsModel

四、创建 item 布局

ts 复制代码
import NewsInfo from '../viewmodel/NewsInfo'

@Component
export default struct NewsItem {
  news: NewsInfo = new NewsInfo()

  build() {
    Column({ space: 5 }) {
      Column() {
        Image(this.news.thumbnail)
        Text(this.news.title)
          .fontSize(20)
          .fontWeight(FontWeight.Bold)
          .ellipsisMode(EllipsisMode.END)
      }
      .width('100%')
    }
  }
}

五、实现网络请求分页加载

ts 复制代码
import NewsInfo from '../viewmodel/NewsInfo'
import NewsItem from '../views/NewsItem'
import NewsModel from '../model/NewsModel'

@Entry
@Component
struct Index {
  @State news: NewsInfo[] = []
  isLoading: boolean = false
  isMore: boolean = true

  aboutToAppear(): void {
    this.loadNewsInfo()
  }

  build() {
    Column() {
      List({ space: 10 }) {
        ForEach(this.news, (news: NewsInfo) => {
          ListItem() {
            NewsItem({ news: news })
          }
        })
      }
      .width('100%')
      .onReachEnd(() => {
        console.log('触底了!')
        if (!this.isLoading && this.isMore) {
          this.isLoading = true
          // 翻页
          NewsModel.pageNo++
          this.loadNewsInfo()
        }
      })
    }
    .width('100%')
    .height('100%')
    .padding(10)
  }

  loadNewsInfo() {
    NewsModel.getNewsList()
      .then(newsData => {
        this.news = this.news.concat(newsData.data)
        this.isLoading = false
        if (!newsData.data || newsData.data.length == 0) {
          this.isMore = false
        }
      })
  }
}

六、效果演示

相关推荐
逢生博客8 小时前
Mac 搭建仓颉语言开发环境(Cangjie SDK)
macos·华为·鸿蒙
青柠_项目管理9 小时前
PMP证书持有者,在华为、腾讯一般能拿多少薪资?
华为·pmp
小强在此12 小时前
【基于开源鸿蒙(OpenHarmony)的智慧农业综合应用系统】
华为·开源·团队开发·智慧农业·harmonyos·开源鸿蒙
Reuuse14 小时前
【HCIA-Datacom】华为VRP系统
服务器·网络·华为
PlumCarefree16 小时前
基于鸿蒙API10的RTSP播放器(四:沉浸式播放窗口)
华为·harmonyos
中关村科金19 小时前
中关村科金推出得助音视频鸿蒙SDK,助力金融业务系统鸿蒙化提速
华为·音视频·harmonyos
繁依Fanyi19 小时前
828 华为云征文|华为 Flexus 云服务器部署 RustDesk Server,打造自己的远程桌面服务器
运维·服务器·开发语言·人工智能·pytorch·华为·华为云
小强在此1 天前
基于OpenHarmony(开源鸿蒙)的智慧医疗综合应用系统
华为·开源·团队开发·健康医疗·harmonyos·开源鸿蒙
奔跑的露西ly1 天前
【鸿蒙 HarmonyOS NEXT】popup弹窗
华为·harmonyos