HarmonyOS NEXT星河版之实战商城App瀑布流(含加载更多)

news/2025/4/21 10:12:46/

文章目录

    • 一、目标
    • 二、开撸
      • 2.1 声明商品对象
      • 2.2 mock数据
      • 2.3 主页面
      • 2.4 加载更多
      • 2.5 完整代码
    • 三、小结

一、目标

在这里插入图片描述

二、开撸

2.1 声明商品对象

export interface GoodsItem {title: stringimageUrl: string
}

2.2 mock数据

export const mockGoodsList: GoodsItem[] = [{title: '宁雨昔美式复古字母三条杠圆领短袖T恤女纯棉宽松2024夏季新款学生上衣 白色 M',imageUrl: 'https://img10.360buyimg.com/n2/s240x240_jfs/t1/145307/22/41197/71267/65b5d932Fb67b2c27/cd986ae610999146.jpg!q70.jpg.webp'},{title: '京东京造【抗菌小白T】5A抑菌抗发黄T恤男新疆棉t恤男夏短袖打底T 白色L',imageUrl: 'https://img10.360buyimg.com/n2/s370x370_jfs/t1/230742/32/2823/51634/65520517F4c4f8ffb/6b8d81f6664085c6.jpg!q70.jpg.webp'},{title: 'YOOOURTHING男士休闲夹克青年时尚休闲连帽外套男薄款春秋季夹克男装 XZ1402-2130-卡其色 2XL【建议120-150斤】',imageUrl: 'https://img13.360buyimg.com/n2/s370x370_jfs/t1/100084/4/36774/78306/6423d6a8F913e76ad/80a8cdf35c09e19c.jpg!q70.jpg.webp'},{title: 'ZARA女装夏季新款宽松短袖T恤女 黑色 M',imageUrl: 'https://img10.360buyimg.com/n2/s370x370_jfs/t1/134131/23/44409/75625/661c013dF4a6fba04/3166211e54969778.jpg!q70.jpg.webp'},{title: '优衣库UT印花T恤女款 纯棉舒适圆领短袖上衣 白色 S',imageUrl: 'https://img14.360buyimg.com/n2/s370x370_jfs/t1/103976/1/31353/115998/630cc1cdE3a4eede9/bc1bc0bc560b775e.jpg!q70.jpg.webp'},{title: '小米手环5 智能运动手表 血氧检测心率监测 多功能NFC 时尚简约 黑色',imageUrl: 'https://img14.360buyimg.com/n2/s370x370_jfs/t1/100923/8/44254/52554/64f03948Fe911c342/59bea895f9ebdd38.jpg!q70.jpg.webp'},{title: '华为荣耀X10 5G手机 双模5G全网通 6GB+128GB 蓝水翡翠 移动联通电信5G 双卡双待手机',imageUrl: 'https://img0.baidu.com/it/u=2707221971,2703286647&fm=253&fmt=auto&app=138&f=JPEG?w=499&h=287'},{title: 'Apple MacBook Air 13.3英寸笔记本电脑 银色(Core i5 处理器/8GB内存/256GB固态硬盘)',imageUrl: 'https://img01.yzcdn.cn/upload_files/2020/05/21/FjX6bDV0pc4jSBKXgbDcDvtErMzR.jpg%21middle.jpg'},{title: '华为MateBook D 14 2020款 14英寸轻薄笔记本电脑(AMD Ryzen 5 3500U处理器/8GB内存/512GB固态硬盘)深空灰',imageUrl: 'https://img01.yzcdn.cn/upload_files/2017/10/19/FlYiuiKI5L17wHoALIx_txbCeOME.jpg%21middle.jpg'},{title: '联想(Lenovo)小新Pro13高性能轻薄本笔记本电脑 13.3英寸全面屏学生办公商务便携轻薄本(标压R5-3550H 16G 512G FHD IPS)银',imageUrl: 'https://img2.baidu.com/it/u=1282939547,1976310423&fm=253&fmt=auto&app=138&f=JPEG?w=375&h=500'}
]

2.3 主页面

import { GoodsItem, mockGoodsList } from './modules';@Entry
@Component
struct WaterFlowGoodsPage {@State goodsList: GoodsItem[] = mockGoodsListbuild() {WaterFlow() {ForEach(this.goodsList, (item: GoodsItem, index: number) => {FlowItem() {Column({ space: 5 }) {Image(item.imageUrl).height(index % 2 ? 120 : 180).borderRadius(8)Text(item.title).fontSize(14).lineHeight(22).maxLines(3).textOverflow({ overflow: TextOverflow.Ellipsis })}}})}.height('100%').columnsTemplate('1fr 1fr').columnsGap(10).rowsGap(10).padding(10)}
}

2.4 加载更多

在滑动到底部时,加载更多数据,如下:
在这里插入图片描述
WaterFlow参数中有footer,代表了底部内容。增加getFooter方法,如下:

@Builder
getFooter() {Row() {Text('加载更多...')}.justifyContent(FlexAlign.Center).backgroundColor(Color.Pink).height(60).width('100%')}

WaterFlow设置footer

WaterFlow({ footer: this.getFooter }) {}

设置变量isLoadMore判断是否正在加载中:

@State isLoadMore: boolean = false

设置WaterFlow的滑动到底部事件:

// 滑动到底部
.onReachEnd(async () => {if (!this.isLoadMore) {try {this.isLoadMore = trueawait this.loadMore()this.isLoadMore = false} catch (error) {promptAction.showToast({ message: JSON.stringify(error) })}}
})

加载更多数据方法:

/*** 加载更多* @returns*/
loadMore() {return new Promise<boolean>((resolve, reject) => {// mock网络请求setTimeout(() => {this.goodsList.push(...this.goodsList.slice(0, 5))}, 2000)resolve(true)})
}

2.5 完整代码

import { GoodsItem, mockGoodsList } from './modules';
import { promptAction } from '@kit.ArkUI';@Entry
@Component
struct WaterFlowGoodsPage {@State goodsList: GoodsItem[] = mockGoodsList@State isLoadMore: boolean = false@BuildergetGoodsItemView(item: GoodsItem, index: number) {Column({ space: 5 }) {Image(item.imageUrl).height(index % 2 ? 120 : 180).borderRadius(8)Text(item.title).fontSize(14).lineHeight(22).maxLines(3).textOverflow({ overflow: TextOverflow.Ellipsis })}}@BuildergetFooter() {Row() {Text('加载更多...')}.justifyContent(FlexAlign.Center).backgroundColor(Color.Pink).height(60).width('100%')}build() {WaterFlow({ footer: this.getFooter }) {ForEach(this.goodsList, (item: GoodsItem, index: number) => {FlowItem() {this.getGoodsItemView(item, index)}})}.height('100%').columnsTemplate('1fr 1fr').columnsGap(10).rowsGap(10).padding(10)// 滑动到底部.onReachEnd(async () => {if (!this.isLoadMore) {try {this.isLoadMore = trueawait this.loadMore()this.isLoadMore = false} catch (error) {promptAction.showToast({ message: JSON.stringify(error) })}}})}/*** 加载更多* @returns*/loadMore() {return new Promise<boolean>((resolve, reject) => {// mock网络请求setTimeout(() => {this.goodsList.push(...this.goodsList.slice(0, 5))}, 2000)resolve(true)})}
}

三、小结

  • WaterFlow组件使用
  • 监听滑动底部事件onReachEnd
  • 加载更多处理

http://www.ppmy.cn/news/1434617.html

相关文章

Android判断应用是否在前台运行

Android判断应用是否在前台运行 /*** Android判断应用是否在前台运行* 0&#xff1a;异常&#xff1b;1&#xff1a;前台&#xff1b;2&#xff1a;后台&#xff1b;3&#xff1a;未运行&#xff1b;*/private int isFrontShow(Context context) {if (context null) {ret…

动力学重构/微分方程参数拟合 - 基于模型

这一篇文章&#xff0c;主要是给非线性动力学&#xff0c;对微分方程模型参数拟合感兴趣的朋友写的。笼统的来说&#xff0c;这与混沌系统的预测有关&#xff1b;传统的机器学习的模式识别虽然也会谈论预测结果&#xff0c;但他们一般不会涉及连续的预测。这里我们考虑的是&…

Linux读写文件

前言 学习了文件系统&#xff0c;就能理解为什么说Linux下一切皆文件。 语言层面的操作 在c语言的学习中我们可以使用fopen()函数对文件进行操作。 int main() {//FILE * fp fopen("./log.txt", "w");//FILE * fp fopen("./log.txt", "…

Music Tag Editor Pro for Mac:音乐标签编辑软件

Music Tag Editor Pro for Mac是一款功能强大的音乐标签编辑软件&#xff0c;专为Mac用户设计&#xff0c;旨在帮助用户轻松管理音乐库中的标签信息。 Music Tag Editor Pro for Mac v8.0.0中文激活版下载 该软件支持多种音频格式&#xff0c;包括MP3、M4A、FLAC、APE等&#x…

Midjourney如何实现人物角色的一致性?

在数字艺术和AI生成媒体的发展中&#xff0c;保持人物一致性是一个巨大的挑战。Midjourney作为一个先进的图像生成平台&#xff0c;它如何确保在连续的图像生成过程中&#xff0c;同一人物能保持一致的外观和特征呢&#xff1f;本文将深入探讨Midjourney如何通过技术手段实现这…

人工智能论文GPT-3(1):2020.5 Language Models are Few-Shot Learners;摘要;引言;scaling-law

摘要 近期的工作表明&#xff0c;在大量文本语料库上进行预训练&#xff0c;然后针对特定任务进行微调&#xff0c;可以在许多NLP任务和基准测试中取得实质性进展。虽然这种方法在架构上通常是与任务无关的&#xff0c;但仍然需要包含数千或数万示例的针对特定任务的微调数据集…

SpringMVC基础篇(二)

文章目录 1.Postman1.基本介绍Postman是什么&#xff1f; 2.Postman快速入门1.Postman下载点击安装自动安装在系统盘 2.基本操作1.修改字体大小2.ctrl “” 放大页面3.进入创建请求界面 2.需求分析3.具体操作4.保存请求到文件夹中1.点击保存2.创建新的文件夹3.保存成功 3.使用…

互联网轻量级框架整合之MyBatis动态SQL

MyBatis的动态SQL是一项强大且实用的功能&#xff0c;它允许开发者在XML映射文件中编写可灵活变化的SQL语句&#xff0c;这些语句能够根据传入参数的条件或值动态地调整其结构和内容。这样&#xff0c;程序可以在运行时生成适应特定业务场景的SQL&#xff0c;避免了手动拼接SQL…