首页 > 其他分享 >【ArkTS】列表组件的“下拉刷新”和“上拉加载”

【ArkTS】列表组件的“下拉刷新”和“上拉加载”

时间:2024-12-08 21:57:00浏览次数:13  
标签:ets ArkTS ... 上拉 刷新 加载

系列文章目录

【ArkTS】关于ForEach的第三个参数键值
【ArkTS】“一篇带你读懂ForEach和LazyForEach” 【小白拓展】
【ArkTS】“一篇带你掌握TaskPool与Worker两种多线程并发方案”
【ArkTS】 一篇带你掌握“语音转文字技术” --内附详细代码
【ArkTS】技能提高–“用户授权”跳转设置页的两种方式详解
【ArkTS】使用AVRecorder录制音频 --内附录音机开发详细代码


文章目录


前言

当我们需要渲染大量的数据时,全部加载不仅会降低我们的性能,还会占用大量内存,可能会造成应用使用的卡顿、闪退。

页面的下拉刷新与上拉加载功能在移动应用中十分常见,例如,新闻页面的内容刷新和加载。这两种操作的原理都是通过响应用户的触摸事件,在顶部或者底部显示一个刷新或加载视图,完成后再将此视图隐藏。

代码结构解读:

├──entry/src/main/ets                   // ArkTS代码区
│  ├──common
│  │  ├──constant
│  │  │  └──CommonConstant.ets          // 公共常量类
│  │  └──utils
│  │     ├──HttpUtil.ets                // 网络请求方法
│  │     ├──Logger.ets                  // 日志打印工具
│  │     ├──PullDownRefresh.ets         // 下拉刷新方法
│  │     └──PullUpLoadMore.ets          // 上拉加载更多方法
│  ├──entryability
│  │  └──EntryAbility.ets               // 程序入口类
│  ├──pages
│  │  └──Index.ets                      // 入口文件
│  ├──view
│  │  ├──CustomRefreshLoadLayout.ets    // 下拉刷新、上拉加载布局文件
│  │  ├──LoadMoreLayout.ets             // 上拉加载布局封装
│  │  ├──NewsItem.ets                   // 新闻数据
│  │  ├──NewsList.ets                   // 新闻列表
│  │  ├──NoMoreLayout.ets               // 没有更多数据封装
│  │  ├──RefreshLayout.ets              // 下拉刷新布局封装
│  │  └──TabBar.ets                     // 新闻类型页签
│  └──viewmodel
│     ├──NewsData.ets                   // 新闻数据实体类
│     ├──NewsModel.ets                  // 新闻数据模块信息
│     ├──NewsTypeModel.ets              // 新闻类型实体类
│     ├──NewsViewModel.ets              // 新闻数据获取模块
│     └──ResponseResult.ets             // 请求结果实体类
└──entry/src/main/resources             // 资源文件目录

一、下拉刷新

下拉刷新的实现主要分成三步:

  1. 监听手指按下事件,记录其初始位置的值。
  2. 监听手指按压移动事件,记录并计算当前移动的位置与初始值的差值,大于0表示向下移动,同时设置一个允许移动的最大值。
  3. 监听手指抬起事件,若此时移动达到最大值,则触发数据加载并显示刷新视图,加载完成后将此视图隐藏

页面的下拉刷新操作推荐使用Refresh组件实现。

在这里插入图片描述

//refreshing组件当前是否处于刷新中状态。true表示处于刷新中状态,false表示未处于刷新中状态。
Refresh({ refreshing: $$this.isRefreshing }){
	 List() {
    	ListItem() {
        ...
    }
  }
}
属性作用
refreshOffset设置触发刷新的下拉偏移量,当下拉距离小于该属性设置值时离手不会触发刷新。
pullToRefresh设置当下拉距离超过refreshOffset时是否能触发刷新。
pullDownRatio设置下拉跟手系数。

二、上拉加载(触底加载更多)

1.使用List组件结合onReachEnd方法实现触底加载更多

代码如下(示例):

List() {
      ForEach(this.questionList, (item: QuestionItem) => {
        ListItem() {
           ...
        }
    })
}
.onReachEnd(() => {
// 2. 监听触底事件
this.onLoadMore()
})

2.防抖优化

定义变量判断是否正在发送加载请求,写在监视触底事件里。

async onl oadMore() {
    // 4. 判断如果正在请求, 不许再次发请求
    if (this.isRequesting === true) {
      return
    }

    // 2. 每次请求前, 标记正在请求
    this.isRequesting = true

    this.page++
    console.log('请求的页数 -----> ', this.page)
    const res = await request<iListData>({
      url: '...',
      params: {
        questionBankType: ...,
        type: ...,
        page: ...
      }
    });
    this.questionList.push(...res.data.data.rows);

    // 3. 每次请求后, 标记请求结束
    this.isRequesting = false
  }

三、封装一个等待加载小组件

  1. 创建一个下拉刷新布局CustomLayout,动态传入刷新图片和刷新文字描述。
// CustomRefreshLoadLayout.ets
import { CustomRefreshLoadLayoutClass } from '../viewmodel/NewsData';
import { CommonConstant as Const } from '../common/constant/CommonConstant';

@Component
export default struct CustomLayout {
  @ObjectLink customRefreshLoadClass: CustomRefreshLoadLayoutClass;

  build() {
    Row() {
      // 下拉刷新图片
      Image(this.customRefreshLoadClass.imageSrc)
      ...
      // 下拉刷新文字
      Text(this.customRefreshLoadClass.textValue)
      ...
    }
    ...
  }
}

将下拉刷新的布局添加到NewsList.ets文件中新闻列表布局ListLayout里面,监听ListLayout组件的onTouch事件实现下拉刷新。

// NewsList.ets
build() {
  Column() {
   ...
  }
  ...
  .onTouch((event: TouchEvent | undefined) => {
    if (event) {
      if (this.newsModel.pageState === PageState.Success) {
        listTouchEvent(this.newsModel, event);
      }
    }
  })
}
@Builder ListLayout() {
  List() {
    // 下拉刷新布局
    ListItem() {
      RefreshLayout({
        refreshLayoutClass: new CustomRefreshLoadLayoutClass(this.newsModel.isVisiblePullDown, this.newsModel.pullDownRefreshImage,
          this.newsModel.pullDownRefreshText, this.newsModel.pullDownRefreshHeight)
      })
    }
  }
  ...
}

效果展示:
在这里插入图片描述


总结

以上就是今天要讲的内容,本文仅仅简单介绍了列表组件的“下拉刷新”和“上拉加载”的方法。

标签:ets,ArkTS,...,上拉,刷新,加载
From: https://blog.csdn.net/i20021209/article/details/144305244

相关文章

  • 【鸿蒙开发】ArkTS --“必备”面试题
    系列文章目录【鸿蒙开发】ArkTS--“必备”面试题【鸿蒙开发】ArkTS--“必备”面试题文章目录系列文章目录前言一、什么是类型断言?二、装饰器介绍前言一、什么是类型断言?类型断言允许程序员手动指定一个值的类型。这在需要明确告诉编译器某个值的类型时非常有......
  • 高级java每日一道面试题-2024年12月08日-JVM篇-什么是类加载器?
    如果有遗漏,评论区告诉我进行补充面试官:什么是类加载器?我回答:在Java高级面试中,类加载器(ClassLoader)是一个重要的概念,它涉及到Java类的加载和初始化机制。以下是对类加载器的详细解释:定义与作用类加载器是Java虚拟机(JVM)提供的一种机制,用于将Java类的字节码(.class文......
  • Ajax实现异步加载数据例子解析
    代码示例:Ajax(AsynchronousJavaScriptandXML)是一种在无需重新加载整个页面的情况下,能够更新部分网页的技术。通过在后台与服务器进行少量数据交换,Ajax可以使网页实现异步更新。下面我将提供一个详细的Ajax实现异步加载数据的例子。1.HTML部分首先,我们需要一个简单的H......
  • js延迟加载的方式中,只有IE浏览器支持的是哪一种方式
    只有IE浏览器支持的延迟加载方式是defer属性。虽然其他浏览器也支持defer,但只有IE浏览器(版本小于11)会以特定的方式处理defer,使其与其他浏览器的行为略有不同。具体来说,在IE(<11)中,defer脚本的执行顺序是按照它们在HTML文档中出现的顺序执行的,即使这些脚本依赖于其他defer脚本。......
  • 请实现一个网站加载进度条
    <!DOCTYPEhtml><html><head><title>LoadingProgressBar</title><style>body{margin:0;/*Removedefaultbodymargin*/}#progress-container{width:100%;height:10px;background-color:#e0e0e0;/*Light......
  • 神经网络入门实战:(十七)VGG16模型的加载、保存与修改,可以应用到其他网络模型上
    VGG16模型的加载、保存与修改该模型主要是用来识别ImageNet数据集的。16的由来:该模型包含16个权重层(13个卷积层和3个全连接层),因此得名VGG16。模型官网:vgg16—Torchvision0.20documentation(一)从官网加载VGG16模型①在pycharm中加载官网已经训练好的......
  • 视频聊天源码,提升首屏加载性能优化使用体验
    视频聊天源码,提升首屏加载性能优化使用体验我们可以通过以下三种手段实现视频聊天源码的首屏加载性能优化:一、CSS优化避免使用过多的CSS文件和行内样式,尽量减少CSS文件的大小。另外,可以将CSS放在页面头部,以便尽早渲染页面。<!DOCTYPEhtml><html><head><title......
  • 短视频php源码,如何实现关键资源的预加载?
    短视频php源码,如何实现关键资源的预加载?通过预加载短视频php源码中的关键资源(如字体文件、重要的CSS和JavaScript文件等),可以在首屏展示之前提前加载这些资源,加快后续页面加载的速度。要实现预加载关键资源,可以使用HTML中的link和script标签的rel属性来指定资源的加载方式。举个示......
  • 开源短视频源码,别让图片影响首屏加载速度
    开源短视频源码,别让图片影响首屏加载速度使用适当的图片格式(如JPEG、PNG、WebP)和压缩算法,对开源短视频源码中的图片进行优化,减小图片文件大小,提高加载速度。同时,可以使用懒加载技术,延迟加载非首屏可见区域的图片,减少首屏的加载时间。举例一个懒加载示例<!DOCTYPEhtml><html><......
  • 短视频源码php,解决首屏加载阻塞的重要方法
    短视频源码php,解决首屏加载阻塞的重要方法异步加载将不影响首屏展示的资源(如统计代码、广告等)使用异步加载方式引入,避免阻塞首屏内容的加载。可以使用JavaScript的动态脚本加载技术。通过动态创建<script>标签,并将其插入到文档中,可以实现异步加载资源而不阻塞首屏内容的加载。举......