HarmonyOS APP开发---"新鲜事"社交动态App,需要用到这个库

HarmonyOS APP开发---"新鲜事"社交动态App,需要用到这个库

做一个社交动态 App,信息流要下拉刷新最新动态、上拉加载历史内容。ArkUI 原生 List 不带这套交互------@ohos/pulltorefresh 一个组件包住 List,下拉上拉全搞定,还支持自定义动画。
📦 仓库地址:gitcode.com/CPF-Applica... | 安装:ohpm install @ohos/pulltorefresh


写在前面

"新鲜事"是一个社交动态 App,核心页面就是信息流:用户下拉刷新看最新动态,滑到底部上拉加载更早的内容。这个交互在微信朋友圈、微博、抖音里都是标配。

但 ArkUI 原生的 List / Scroll / Grid / WaterFlow 组件本身不带下拉刷新和上拉加载能力。如果你自己监听手势 + 写动画 + 处理数据加载,每个列表都要重复写一遍。

@ohos/pulltorefresh 用一个组件把你的列表"包"起来:

  • 下拉刷新onRefresh 回调返回 Promise,resolve 后动画收起
  • 上拉加载onLoadMore 回调返回 Promise,resolve 后加载状态消失
  • 5 大容器支持:List / Scroll / Tabs / Grid / WaterFlow
  • 自定义动画:内置精美动画,也可以完全自定义刷新/加载视图
  • LazyForEach 兼容:长列表懒加载性能不打折

这篇文章聊什么

  1. 基础信息流------PullToRefresh + List + 下拉/上拉
  2. 自定义动画------替换内置刷新动画
  3. V2 组件------@ComponentV2 新写法
flowchart TD A[信息流页面] --> B[PullToRefresh 包住 List] B --> C{用户手势} C -->|下拉| D[onRefresh 回调] D --> E[请求最新动态] E --> F[resolve 收起动画] F --> G[更新列表数据] C -->|滑到底部| H[onLoadMore 回调] H --> I[请求历史动态] I --> J[resolve 收起加载] J --> K[追加到列表尾部]

第一步:安装

bash 复制代码
ohpm install @ohos/pulltorefresh

第二步:信息流下拉刷新 + 上拉加载

typescript 复制代码
import { PullToRefresh } from '@ohos/pulltorefresh'

@Entry
@Component
struct FeedPage {
  private scroller: Scroller = new Scroller()
  @State feedList: string[] = ['动态1', '动态2', '动态3']
  private page: number = 1

  build() {
    PullToRefresh({
      // 必传:列表数据
      data: $feedList,
      // 必传:列表容器
      scroller: this.scroller,
      // 必传:自定义主体布局
      customList: () => { this.getListView() },

      // 下拉刷新
      onRefresh: () => {
        return new Promise<string>((resolve) => {
          // 请求最新动态
          fetchLatestFeed().then((data) => {
            this.feedList = data  // 替换列表
            this.page = 1
            resolve('刷新成功')     // 收起刷新动画
          })
        })
      },

      // 上拉加载更多
      onLoadMore: () => {
        return new Promise<string>((resolve) => {
          this.page++
          fetchMoreFeed(this.page).then((data) => {
            this.feedList = this.feedList.concat(data) // 追加到尾部
            resolve('')
          })
        })
      },
    })
  }

  @Builder
  getListView() {
    List({ scroller: this.scroller }) {
      ForEach(this.feedList, (item: string) => {
        ListItem() {
          // 每条动态的 UI
          Column({ space: 8 }) {
            Text(item).fontSize(16)
            Text('来自新鲜事').fontSize(12).fontColor('#999')
          }
          .width('100%').padding(16)
        }
      }, (item: string) => item)
    }
    .edgeEffect(EdgeEffect.None) // ⚠️ 必须设置!
  }
}

关键点

  • onRefresh / onLoadMore 都返回 Promise------组件内部根据 resolve 自动收/放动画
  • 容器的 edgeEffect 必须设为 EdgeEffect.None(否则弹簧效果冲突)
  • data 绑定让组件感知列表数据变化

第三步:自定义刷新动画

内置动画够用,但你也可以完全自定义:

typescript 复制代码
PullToRefresh({
  data: $feedList,
  scroller: this.scroller,
  customList: () => { this.getListView() },
  onRefresh: () => { /* ... */ },
  onLoadMore: () => { /* ... */ },

  // 自定义下拉刷新视图(替换内置动画)
  customRefresh: () => {
    this.CustomRefreshView()
  },
  // 自定义上拉加载视图
  customLoad: () => {
    this.CustomLoadView()
  },
})

@Builder
CustomRefreshView() {
  Row({ space: 8 }) {
    LoadingProgress().width(24).height(24)
    Text('正在刷新新鲜事...').fontSize(14).fontColor('#4ECDC4')
  }
  .height(60)
  .justifyContent(FlexAlign.Center)
}

第四步:V2 组件写法(@ComponentV2)

鸿蒙新推荐 @ComponentV2 写法,PullToRefresh 也支持:

typescript 复制代码
import { PullToRefreshV2 } from '@ohos/pulltorefresh'

@Entry
@ComponentV2
struct FeedPageV2 {
  private scroller: Scroller = new Scroller()
  @Local feedList: string[] = []

  build() {
    PullToRefreshV2({
      data: this.feedList,
      scroller: this.scroller,
      customList: () => { this.listView() },
      onRefresh: () => { /* ... */ },
      onLoadMore: () => { /* ... */ },
    })
  }

  @Builder
  listView() {
    List({ scroller: this.scroller }) {
      ForEach(this.feedList, (item: string) => {
        ListItem() { Text(item).height(80) }
      }, (item: string) => item)
    }
    .edgeEffect(EdgeEffect.None)
  }
}

为什么"新鲜事"选了 pulltorefresh?

需求 自己手写 @ohos/pulltorefresh
下拉刷新 手势监听+动画 ✅ onRefresh 一行
上拉加载 滚动监听+判断 ✅ onLoadMore 一行
List/Grid/WaterFlow 每个容器各写 ✅ 5 大容器通用
自定义动画 手写 ✅ customRefresh
LazyForEach 需适配 ✅ 完美兼容
V2 组件 --- ✅ PullToRefreshV2

总结

"新鲜事"这个场景里,@ohos/pulltorefresh 解决了三件事:

  1. 下拉刷新 ------onRefresh 返回 Promise,请求完成自动收起动画
  2. 上拉加载 ------onLoadMore 返回 Promise,加载完成自动收起状态
  3. 5 大容器通用------List / Scroll / Tabs / Grid / WaterFlow 一个组件全包

如果你也在做信息流、商品列表、聊天记录等任何"滚动 + 分页"的场景,@ohos/pulltorefresh 让你 5 分钟搞定刷新加载,把精力留给内容本身。

相关推荐
not coder1 小时前
我给鸿蒙原生 OFD 阅读器加了手写签批:手写笔防误触、矢量笔迹、批注追溯
华为·harmonyos·arkts·ofd
Magic-ZYJ2 小时前
HarmonyOS 页面生命周期完整梳理:aboutToAppear、onPageShow、onPageHide 别再混着用
华为·ts·harmonyos·移动应用开发·arcts·arcui
lilian2333 小时前
HarmonyOS 7 新特性(五)|ContainerReader 容器断点与自适应布局
前端·华为·harmonyos
less_121384 小时前
HarmonyOS WPS Open SDK:统一版二开接入主线与能力分层概述
华为·harmonyos·wps
大雷神4 小时前
HarmonyOS APP<<古今职鉴定>>开源教程第13篇:隔空投送:ShareKit 分享服务
华为·华为云·harmonyos
时光慢煮4 小时前
开源鸿蒙PC上手体验:从 Windows 和 macOS 切换过来,我被惊艳到了
windows·开源·harmonyos
tsqtsqtsq03094 小时前
鸿蒙电脑升级 HarmonyOS 7:深度解析与 API 26 全特性指南
华为·电脑·harmonyos
lilian2337 小时前
HarmonyOS 7 新特性(一)|API 26 Beta2 十项变化与应用适配路线
华为·harmonyos
HwJack207 小时前
鸿蒙ArkData键值型数据库实战:Schema 定义与商品库存同步案例
数据库·华为·harmonyos