当前位置: 首页 > news >正文

HarmonyOS:使用Refresh组件实现页面下拉刷新

一、前言

可以进行页面下拉操作并显示刷新动效的容器组件。

说明

  • 该组件从API Version 8开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。
  • 该组件从API Version 12开始支持与垂直滚动的Swiper和Web的联动。当Swiper设置loop属性为true时,Refresh无法和Swiper产生联动。

二、子组件

支持单个子组件。

从API version 11开始,Refresh子组件会跟随手势下拉而下移。

三、接口

Refresh(value: RefreshOptions)

创建Refresh容器。

参数:

参数名类型必填说明
valueRefreshOptions刷新组件参数。

四、属性

支持通用属性外,还支持以下属性:
refreshOffset12+
refreshOffset(value: number)

设置触发刷新的下拉偏移量,当下拉距离小于该属性设置值时离手不会触发刷新。

参数:

参数名类型必填说明
valuenumber下拉偏移量,单位vp。
默认值:未设置promptText参数时为64vp,设置了promptText参数时为96vp。
如果取值为0或负数的时候此接口采用默认值。

pullToRefresh12+
pullToRefresh(value: boolean)

设置当下拉距离超过refreshOffset时是否能触发刷新。

元服务API: 从API version 12开始,该接口支持在元服务中使用。

系统能力: SystemCapability.ArkUI.ArkUI.Full

参数:

参数名类型必填说明
valueboolean当下拉距离超过refreshOffset时是否能触发刷新。true表示能触发刷新,false表示不能触发刷新。
默认值:true

五、事件

除支持通用事件外,还支持以下事件:

onStateChange
onStateChange(callback: (state: RefreshStatus) => void)

当前刷新状态变更时,触发回调。

元服务API: 从API version 11开始,该接口支持在元服务中使用。

系统能力: SystemCapability.ArkUI.ArkUI.Full

参数

参数名类型必填说明
stateRefreshStatus刷新状态。

onRefreshing
onRefreshing(callback: () => void)

进入刷新状态时触发回调。

元服务API: 从API version 11开始,该接口支持在元服务中使用。

系统能力: SystemCapability.ArkUI.ArkUI.Full

onOffsetChange12+
onOffsetChange(callback: Callback)

下拉距离发生变化时触发回调。

元服务API: 从API version 12开始,该接口支持在元服务中使用。

系统能力: SystemCapability.ArkUI.ArkUI.Full

参数

参数名类型必填说明
callbackCallback下拉距离。
单位:vp

RefreshStatus枚举说明
Refresh刷新状态枚举。

元服务API: 从API version 11开始,该接口支持在元服务中使用。

系统能力: SystemCapability.ArkUI.ArkUI.Full

名称说明
Inactive0默认未下拉状态。
Drag1下拉中
OverDrag2下拉中,下拉距离超过刷新距离。
Refresh3下拉结束,回弹至刷新距离,进入刷新中状态。
Done4刷新结束,返回初始状态(顶部)。

六、示例

6.1 示例1(默认刷新样式)

刷新区域使用默认刷新样式。效果图如下


在这里插入图片描述

TestRefreshExample1.ets代码

@Entry
@Component
struct TestRefreshExample1 {
  @State isRefreshing: boolean = false
  @State arr: String[] = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10']

  build() {
    Column() {
      Refresh({ refreshing: $$this.isRefreshing }) {
        List() {
          ForEach(this.arr, (item: string) => {
            ListItem() {
              Text('' + item)
                .width('70%')
                .height(80)
                .fontSize(16)
                .margin(10)
                .textAlign(TextAlign.Center)
                .borderRadius(10)
                .backgroundColor(0xFFFFFF)
            }
          }, (item: string) => item)
        }
        .onScrollIndex((first: number) => {
          console.info(first.toString())
        })
        .width('100%')
        .height('100%')
        .alignListItem(ListItemAlign.Center)
        .scrollBar(BarState.Off)
      }
      .onStateChange((refreshStatus: RefreshStatus) => {
        console.info('Refresh onStatueChange state is ' + refreshStatus)
      })
      .onOffsetChange((value: number) => {
        console.info('Refresh onOffsetChange offset:' + value)
      })
      .onRefreshing(() => {
        setTimeout(() => {
          this.isRefreshing = false
        }, 2000)
        console.log('onRefreshing test')
      })
      .backgroundColor(0x89CFF0)
      .refreshOffset(64)
      .pullToRefresh(true)
    }
  }
}
6.2 示例2(设置刷新区域显示文本)

通过promptText参数设置刷新区域显示文本。

在这里插入图片描述

TestRefreshExample2.ets代码

@Entry
@Component
struct TestRefreshExample2 {
  @State isRefreshing: boolean = false
  @State promptText: string = "Refreshing..."
  @State arr: String[] = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10']

  build() {
    Column() {
      Refresh({ refreshing: $$this.isRefreshing, promptText: this.promptText }) {
        List() {
          ForEach(this.arr, (item: string) => {
            ListItem() {
              Text('' + item)
                .width('70%')
                .height(80)
                .fontSize(16)
                .margin(10)
                .textAlign(TextAlign.Center)
                .borderRadius(10)
                .backgroundColor(0xFFFFFF)
            }
          }, (item: string) => item)
        }
        .onScrollIndex((first: number) => {
          console.info(first.toString())
        })
        .width('100%')
        .height('100%')
        .alignListItem(ListItemAlign.Center)
        .scrollBar(BarState.Off)
      }
      .backgroundColor(0x89CFF0)
      .pullToRefresh(true)
      .refreshOffset(96)
      .onStateChange((refreshStatus: RefreshStatus) => {
        console.info('Refresh onStatueChange state is ' + refreshStatus)
      })
      .onOffsetChange((value: number) => {
        console.info('Refresh onOffsetChange offset:' + value)
      })
      .onRefreshing(() => {
        setTimeout(() => {
          this.isRefreshing = false
        }, 2000)
        console.log('onRefreshing test')
      })
    }
  }
}

相关文章:

  • css中的3d使用:深入理解 CSS Perspective 与 Transform-Style
  • Python Cookbook-6.2 定义常量
  • 数据结构考研复习
  • python蓝桥杯备赛常用算法模板
  • Firewalld服务
  • Spring MVC 请求处理流程详解
  • MySQL联合查询||多表查询
  • Ubuntu安装Docker容器,通过Tomcat部署项目
  • Linux服务之网络共享
  • 深度学习总结(13)
  • 抢票方案推荐(推荐语言)
  • C 语言中经典的数据结构
  • 鲲鹏+昇腾部署集群管理软件GPUStack,两台服务器搭建双节点集群【实战详细踩坑篇】
  • Redis存储“大数据对象”的常用策略及StackOverflowError错误解决方案
  • 第二十六:Mysql 慢查询 开启
  • Ollama模型显存管理机制解析与Flask部署方案对比
  • 【场景应用7】在TPU上使用Flax/JAX对Transformers模型进行语言模型预训练
  • TCPIP详解 卷1协议 六 DHCP和自动配置
  • WinForm真入门(16)——LinkLabel 控件详解
  • vue开发基础流程 (后20)
  • 中央政治局会议举行,传递三重确定性
  • 云南鲁甸县一河滩突然涨水致4死,有人在救人过程中遇难
  • 邮轮、无人机、水上运动……上海多区推动文旅商体展融合发展
  • 商务部就海外社交平台上发布从所谓中国“代工厂”低价购买国际知名品牌事答问
  • 魔都眼·上海车展⑤|被主播包围的新车
  • 国家市场监管总局:民生无小事,严打民生领域侵权假冒违法行为