「HarmonyOS」下拉刷新组件使用详情

前言:在客户端开发过程中,经常会出现下拉刷新的功能,用于重新加载数据和加载更多数据,通过查找相关资料,查找到一个refresh下拉刷新的第三方库,今天主要介绍一下其中比较常用的RefreshLayout形式下拉刷新使用方法

一、组件介绍

Harmony系统其实提供了一个Refresh组件,但是系统的功能与日常的开发,还是存在这个比较大的出入,比较难以满足我们实际的需求,所以我找到了一个开发者写的第三方库
相关链接:HarmonyOS开发:开源一个刷新加载组件

二、引入本地静态共享包har包

1.下载har包,点击下载
2.把har包复制到项目中,目录我这边创建了一个libs目录,复制进去,引入之后,在"oh-package.json5"文件中进行同步项目,点击右上角Sync Now即可
在这里插入图片描述
3.检查是否引入成功
如果引入成功,最终都会在使用的模块中,生成一个oh_modules文件,并创建源代码文件,有则成功,无则失效,如下图:
在这里插入图片描述

三、使用组件

目前库中主要提供的用法有三种。
1.ListView形式,单列表形式
2.GridView形式,网格列表形式
3.RefreshLayout形式,支持任何组件形式,如Column,Row等

在使用下来,个人最喜欢使用第三种形式,这种形式使用起来最为方便和容易实现预期样式,所以本文主要介绍第三种RefreshLayout形式,其他形式介绍可前往组件作者的博客:HarmonyOS开发:开源一个刷新加载组件,进行查看学习

import router from '@ohos.router'
import { NewsBean } from '../../bean/NewsBean'
import { RefreshController, RefreshLayout } from '@app/refresh'
import { HttpApiManager } from '../../http/HttpApiManager'

@Entry
@Component
export struct RefreshPage {
	@State pageNo: number = 1
	@State refreshController: RefreshController = new RefreshController()
	@State dataArray: Array<NewsBean> = []
  build() {
        Column() {
			RefreshLayout({
			            controller: this.refreshController,
			            onRefresh: () => {
			              //下拉刷新
			              this.getNewList()
			            },
			            onLoadMore: () => {
			              //上拉加载
			              this.getMoreNewList()
			            }
			          }) {
			          		//可以是任何组件 List/Grid/Column/Row/Text/……
			          		// 以List举例
			          		List() {...}
			          		.onScrollIndex((start: number, end: number) => {
			                //必须添加,用于控制下拉和上拉何时展示
			                this.refreshController.markLocation(start, end, this.dataArray.length + 1)
			              })
			          }
			 }
	  }

		// 重新加载数据
		getNewList() {
			// 数组清空
		    this.dataArray = []
   			// 参数重置
		    this.pageNo = 1
		
			// 获取数据 每次拿20个
		    HttpApiManager.getInstance().getNewsList('20', this.pageNo.toString())
		      .then((data: Array<NewsBean>) => {
		        this.refreshController.finishRefresh() //关闭下拉刷新
		        this.dataArray = data
		        this.pageNo++
				// 如果获取的数组少于20个,说明数据已全部取完了
		        if (data.length < 20) {
		          // 下拉控制器不再加载更多数据
		          this.refreshController.finishLoadMore(true)
		
		        } else {
     		       // 下拉控制器可以加载更多数据
		          this.refreshController.finishLoadMore(false)
		        }
		      })
		      .catch(error => {
		        ToastUtil.getInstance().showToast(error.message)
		      })
		  }

		// 加载更多数据
		getMoreNewList() {
		    HttpApiManager.getInstance().getNewsList('20', this.pageNo.toString())
		      .then((data: Array<NewsBean>) => {
		        this.refreshController.finishLoadMore() //关闭上拉加载
		        this.dataArray = this.dataArray.concat(data)
		        this.pageNo++
		        
		        if (data.length < 20) {
		          this.refreshController.finishLoadMore(true)
		
		        } else {
		          this.refreshController.finishLoadMore(false)
		        }
		      })
		      .catch(error => {
		        ToastUtil.getInstance().showToast(error.message)
		      })
		  }
}

四、效果展示

在这里插入图片描述

五、扩展

由上图可以看出,我在下拉加载器上方还有一个title,整体样式如下图所示,这样的样式实现方法,作者在博客中也有写到,具体是必须使用Stack作为根布局,让头组件覆盖在刷新组件上
在这里插入图片描述

具体代码实现:

build() {
      Stack() {
        Column() {
			// Title
          Text('汽车资讯')
            .fontColor($r('app.color.smart_24292B'))
            .fontSize(24)
            .fontWeight(FontWeight.Medium)
            .backgroundColor($r('app.color.smart_FFFFFF'))
            .padding({left: 32, top: 16, bottom: 14})
            .width(BaseUtils.screenWidth)
            .zIndex(1)

		RefreshLayout({
		            controller: this.refreshController,
		            onRefresh: () => {
		              //下拉刷新
		              this.getNewList()
		            },
		            onLoadMore: () => {
		              //上拉加载
		              this.getMoreNewList()
		            }
		          }) {
		          	List() {...}
			          	.onScrollIndex((start: number, end: number) => {
		                //必须添加,用于控制下拉和上拉何时展示
		                this.refreshController.markLocation(start, end, this.dataArray.length + 1)
		              })
		              .zIndex(0)
	              }
              }
           }
      }

因为为了代码的可读性,所以我在Title组件和RefreshLayout组件下方分别使用了zIndex属性,让title组件盖在RefreshLayout组件上,以实现样式

参考文档:

HarmonyOS开发:开源一个刷新加载组件

该文章主要介绍了使用程序员一鸣的刷新加载组件库,其github地址为https://github.com/AbnerMing888/HarmonyOsRefresh,认为对您有帮助的话,也帮作者点点Star

总结:

当前HarmonyOs仍在初步学习过程中,大家如果感兴趣或者有问题可以一起沟通交流
如果该文章对你有所帮助的话,可以点赞、收藏并关注一下!后续会持续更新更多技术内容

  • 23
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
微信小程序提供了下拉刷新组件`<scroll-view>`,可以在其中嵌套页面内容,实现下拉刷新的效果。 以下是一个示例代码: ```xml <scroll-view bindscrolltoupper="onPullDownRefresh" scroll-y="true" style="height: 100%;"> <!-- 页面内容 --> <!-- ... --> <!-- 下拉刷新区域 --> <view slot="down"> <view wx:if="{{refreshing}}"> <text>加载中...</text> </view> <view wx:else> <text>下拉刷新</text> </view> </view> </scroll-view> ``` 在上述代码中,我们使用`<scroll-view>`组件来作为页面的容器,通过设置`scroll-y="true"`来开启纵向滚动。 在`<scroll-view>`组件中,我们使用了`slot="down"`来指定下拉刷新区域。在这个区域内,我们可以根据状态来展示不同的内容,例如加载中的提示或者下拉刷新的提示。 同时,我们通过绑定`bindscrolltoupper`事件来监听用户下拉页面的操作。当用户下拉页面时,触发该事件,并执行对应的事件处理函数。 以下是一个简单的示例代码: ```javascript Page({ data: { refreshing: false }, onPullDownRefresh() { // 开始下拉刷新 this.setData({ refreshing: true }); // 在这里编写下拉刷新的逻辑,如请求新数据、更新页面等 // 例如: // 发起请求获取新数据 wx.request({ url: 'https://api.example.com/data', success: (res) => { // 更新页面数据 this.setData({ data: res.data, refreshing: false }); // 停止下拉刷新动画 wx.stopPullDownRefresh(); }, fail: (error) => { console.log(error); // 停止下拉刷新动画 wx.stopPullDownRefresh(); } }); } }); ``` 在上述代码中,`onPullDownRefresh`事件处理函数中可以编写下拉刷新的逻辑。首先设置`refreshing`为`true`,表示开始下拉刷新的状态。然后可以发起请求获取新的数据,并在请求成功后更新页面数据,最后使用`wx.stopPullDownRefresh()`方法停止下拉刷新动画,并将`refreshing`设置为`false`,表示下拉刷新完成。 希望对你有帮助!如有更多问题,请继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

淡酒交魂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值