鸿蒙--下拉刷新+上拉加载

概述

Refresh组件支持下拉刷新,包裹list组件,下拉事件中更新列表

这里我们需要提前了解一下 @Builder装饰器 的基本用法

ArkUI提供了一种轻量的UI元素复用机制@Builder,该自定义组件内部UI结构固定,仅与使用方进行数据传递,开发者可以将重复使用的UI元素抽象成一个方法,在build方法里调用。

为了简化语言,我们将@Builder装饰的函数也称为“自定义构建函数”。

具体用法可参考官网文档:文档中心

在后面我们也会去详细的讲解 @Builder装饰器 的使用

对于滚动有List和Scroll,List适合数量不确定的滚动,比如评论列表等;Scroll适合数量确定的滚动

上拉刷新

这里主要用到 Refresh组件 的 onRefreshing 函数

@Entry
@Component
struct Index {// 是否需要刷新@Staterefreshing: boolean = false// 自定义构建函数--给组件传递@BuilderrefreshContent() {// Text('正在玩命加载中...')//   .width('100%')//   .textAlign(TextAlign.Center)//   .backgroundColor(Color.Pink)Row({space: 8}) {LoadingProgress().height(24)Text('正在玩命加载中...')}.width('100%').padding(12).justifyContent(FlexAlign.Center)}// 定义随机数据@Statelist: number[] = Array(20).fill(Date.now())// 下拉加载用到scroller:Scroller = new Scroller()@StateisEnd: boolean = falsebuild() {RelativeContainer() {// Refresh 刷新组件// 参数说明:refreshing 组件当前是否处于刷新中状态;builder 自定义刷新区域显示内容(结构体),参数可选Refresh({refreshing: $$this.refreshing, builder: this.refreshContent}) {List() {ForEach(this.list, (item: number) => {ListItem() {Row() {Text(item.toString()).width('100%').padding(20).border({width: {bottom: 1},style: {bottom: BorderStyle.Dashed},color: Color.Gray})}}})}}// 监听是否刷新完毕(真正的刷新操作)-从而进行数据更新操作.onRefreshing(() => {setTimeout(() => {// 更新数据this.list = Array(20).fill(Date.now())// 手动关闭刷新状态this.refreshing = false}, 1000)})}.width('100%').height('100%')}
}

 

下拉加载

注册三个事件,开始滚动,滚动结束,滚动至列表尾部(触发两次,滚动至+回弹)

设置变量是否滚动底部,开始滚动false,滚动至列表尾部true,滚动结束判断变量进行数据追加

触底了--只有触底了才会进行数据加载,这里会出现加载两次的情况,因此在这里不适合进行数据的请求操作

对于数据的请求我们需要利用 onScrollStart 和 onScrollStop 和 onReachEnd 三个进行联合判断,从而进行数据请求操作

数据请求逻辑:1.开始滚动,更新状态为没有触底不进行数据加载;2.停止滚动,是否触底了触底了才加载数据,反之不加载数据;3.触底,记录触底了

下拉加载数据完成了应该让滚动条滚动到底部去,不然不知道是否已经加载成功了

import { promptAction } from '@kit.ArkUI'
import HmLoading from './components/HmLoading'@Entry
@Component
struct Index {// 是否需要刷新@Staterefreshing: boolean = false// 自定义构建函数--给组件传递@BuilderrefreshContent() {// Text('正在玩命加载中...')//   .width('100%')//   .textAlign(TextAlign.Center)//   .backgroundColor(Color.Pink)Row({space: 8}) {LoadingProgress().height(24)Text('正在玩命加载中...')}.width('100%').padding(12).justifyContent(FlexAlign.Center)}// 定义随机数据@Statelist: number[] = Array(20).fill(Date.now())// 下拉加载用到:用于下拉加载成功后让滚动条滚动到底部自动scroller:Scroller = new Scroller()@StateisEnd: boolean = false@StateisLoading: boolean = falsetotal:number = 43build() {Stack() {RelativeContainer() {// Refresh 刷新组件// 参数说明:refreshing 组件当前是否处于刷新中状态;builder 自定义刷新区域显示内容(结构体),参数可选Refresh({refreshing: $$this.refreshing, builder: this.refreshContent}) {List({scroller: this.scroller}) {ForEach(this.list, (item: number) => {ListItem() {Row() {Text(item.toString()).width('100%').padding(20).border({width: {bottom: 1},style: {bottom: BorderStyle.Dashed},color: Color.Gray})}}})if(this.list.length > this.total) {ListItem() {Row() {Text('我是有底线的~')}.width('100%').padding(12).justifyContent(FlexAlign.Center)}}}// 开始滚动.onScrollStart(() => {promptAction.showToast({message: '开始滚动'})this.isEnd = false;})// 停止滚动.onScrollStop(() => {// 节流效果if(this.isLoading || this.list.length > this.total) return;promptAction.showToast({message: '停止滚动'})if(this.isEnd) {this.isLoading = true;// 数据加载setTimeout(() => {const list:number[] = Array(10).fill(Math.random())this.list.push(...list)this.scroller.scrollEdge(Edge.Bottom)this.isLoading = false;}, 1000)}})// 触底了--只有触底了才会进行数据加载,这里会出现加载两次的情况,因此在这里不适合进行数据的请求操作// 对于数据的请求我们需要利用 onScrollStart 和 onScrollStop 和 onReachEnd 三个进行联合判断,从而进行数据请求操作// 数据请求逻辑:1.开始滚动,更新状态为没有触底不进行数据加载;2.停止滚动,是否触底了触底了才加载数据,反之不加载数据;3.触底,记录触底了.onReachEnd(() => {promptAction.showToast({message: '触底了'})this.isEnd = true;})}// 监听是否刷新完毕(真正的刷新操作)-从而进行数据更新操作.onRefreshing(() => {setTimeout(() => {// 更新数据this.list = Array(20).fill(Date.now())// 手动关闭刷新状态this.refreshing = false}, 1000)})}.width('100%').height('100%')if(this.isLoading) {Column() {HmLoading()}.height('100%').width('100%').backgroundColor('#ba0a0000').justifyContent(FlexAlign.Center)}}}
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1560654.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

如何在SU中添加建筑分层线?

建筑体块拉伸后,为增家一些表现效果,建筑分层线是有效的方法。但如果建筑是高层,一个个复制分层线很麻烦,这里就教会大家一个利用复制给建筑增加分层线的小技巧。 解决方案: 1、建筑分层线:导入建筑的线框…

DBO-BP回归预测 | MATLAB实现DBO-BP蜣螂优化算法优化神经网络多输入单输出回归预测

回归预测 | MATLAB实现DBO-BP蜣螂优化算法优化神经网络多输入单输出回归预测 目录 回归预测 | MATLAB实现DBO-BP蜣螂优化算法优化神经网络多输入单输出回归预测基本介绍程序设计参考资料基本介绍 MATLAB实现DBO-BP蜣螂优化算法优化神经网络多输入单输出回归预测。 蜣螂优化群优…

vue3--通用组件 popup 封装

在业务场景中,假设这里我们要实现点击 汉堡 后,会有一个自下而上的popup弹出层 因此这里我们需要先实现这样的一个公共的popup弹出层 那么我们这里的popup弹出层需要具备以下能力: 当popup展开时,内容视图应该不属于任何一个组件内部,而应该直接被插入到body下,这里需要…

网络资源模板--Android Studio 实现简易计算器App

目录 一、项目演示 二、项目测试环境 三、项目详情 四、完整的项目源码 一、项目演示 网络资源模板--基于Android studio 实现的简易计算器 二、项目测试环境 三、项目详情 动态绑定按钮: 使用循环遍历 buttons 数组,根据动态生成的按钮 ID (btn_0, …

Jenkins整合Docker实现CICD自动化部署(若依项目)

前期准备 提前准备好jenkins环境 并且jenkins能使用docker命令,并且已经配置好了jdk、node、maven环境,我之前写了安装jenkins的博客,里面讲得比较详细,推荐用我这种方式安装 docker安装jenkins,并配置jdk、node和m…

在自己的vue项目中使用luckysheet

按照官网的教程总是报$的错误&#xff0c;还有也不符合vue的规范&#xff0c;于是使用AI先生成了个demo <template><div id"luckysheet" style"margin:0px;padding:0px;position:absolute;width:100%;height:100%;left: 0px;top: 0px;"></…

apache.poi读取.xls文件时The content of an excel record cannot exceed 8224 bytes

目录 问题描述版本定位&#xff1a;打印size最大的Record定位&#xff1a;RefSubRecord解决代码 问题描述 使用apache.poi读取.xls文件时有The content of an excel record cannot exceed 8224 bytes的报错。待读取的文件的内容也是通过apache.poi写入的&#xff0c;我的文件修…

Vue3 集成Monaco Editor编辑器

Vue3 集成Monaco Editor编辑器 1. 安装依赖2. 使用3. 效果 Monaco Editor &#xff08;官方链接 https://microsoft.github.io/monaco-editor/&#xff09;是一个由微软开发的功能强大的在线代码编辑器&#xff0c;被广泛应用于各种 Web 开发场景中。以下是对 Monaco Editor 的…

继承--C++

文章目录 一、继承的概念及定义1、继承的概念 二、继承定义1、定义格式2、继承基类成员访问方式的变化3、继承类模板 三、基类和派生类间的转换1、继承中的作用域2、隐藏规则&#xff1a; 四、派生类的默认成员函数1、4个常见默认成员函数2、实现⼀个不能被继承的类 五、继承与…

基于s32ds平台指定变量储存位置

开启一段ram空间 打开ld文件 配置一段ram空间 开辟一个段 .shareable_data1 : {. ALIGN(4);KEEP(*(.mcal_shared_data1)) . ALIGN(4);} > int_sram_shareable1定义一个变量并将变量指定在段中 volatile uint32 u32SbcmGenState __attribute__((section (".mcal_s…

Spring MVC:精通JSON数据返回的几种高效方式

前言 在实际开发中&#xff0c;我们在前后端传送数据通常使用Json格式&#xff0c;而在Spring MVC中返回Json格式的方式有多种&#xff0c;接下来我将介绍其中一些。 准备工作 为了演示Json格式的数据&#xff0c;我们准备一个实体类&#xff0c;例如User&#xff0c;这些可以测…

HUAWEI_HCIA_实验指南_Lib2.1_交换机基础配置

1、原理概述 交换机之间通过以太网电接口对接时需要协商一些接口参数&#xff0c;比如速率、双工模式等。交换机的全双工是指交换机在发送数据的同时也能够接收数据&#xff0c;两者同时进行。就如平时打电话一样&#xff0c;说话的同时也能够听到对方的声音。而半双工指在同一…

Json-Rpc框架(项目设计 —— 服务端客户端 模块功能划分简介)

阅读导航 引言一、理解项目功能⭕分布式RPC服务发现/注册/订阅/创建 结构图⭕项目三大核心功能 二、服务端模块划分简介三、客户端模块划分简介 引言 在上一篇文章中&#xff0c;我们深入探讨了Json-Rpc框架中不可或缺的序列化与反序列化利器——JsonCpp库。 在本篇文章中&am…

Github 2024-10-11 Java开源项目日报 Top9

根据Github Trendings的统计,今日(2024-10-11统计)共有9个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Java项目9TypeScript项目1Vue项目1C++项目1JeecgBoot 企业级低代码开发平台 创建周期:2062 天开发语言:Java, Vue协议类型:Apache License 2.…

性能测试流程规范测试准备阶段

目录 1.目的 2.工作内容 3.材料 1)《性能测试脚本规范》。 2)《性能测试参数文件检查备份指南》。 3)《性能测试资源监控操作指南》。 4)《脚本开发参数化》。 5)《脚本开发异常捕获处理》。 6)测试脚本文件。 7)模拟器代码文件。 8)生产环境参数配置文件。 9)《XX…

解决 IntelliJ IDEA 运行时 “Command line is too long“ 问题

文章目录 文章标题&#xff1a;解决 IntelliJ IDEA 运行时 "Command line is too long" 问题简介问题描述解决方案代码示例代码示例1&#xff1a;使用JAR Manifest代码示例2&#xff1a;使用Classpath File代码示例3&#xff1a;优化项目依赖 结论进一步的资源 文章标…

【C++入门篇 - 1】:C++编程等演示环境介绍

文章目录 C编程等演示环境介绍VS2022的下载创建项目运行一个基本程序 Visual Studio中程序的调试方法普通的断点调试调试时查看内存中的内容调试中查看反汇编窗口 开启isual Studio 2019对C最新标准的编译支持 C编程等演示环境介绍 VS2022的下载 官网&#xff1a;VS下载官网 …

ProtoBuf 安装

一、ProtoBuf 在 window 下的安装 1.1、下载 ProtoBuf 编译器 下载地址&#xff1a;https://github.com/protocolbuffers/protobuf/releases 可以不⽤下载最新版本&#xff0c;具体的下载根据电脑情况选择。 下载之后将压缩包解压到本地⽬录下。解压后的⽂件内包含 bin、in…

利用网络流量分析仪进行网络故障排除:提升IT运维效率的关键工具

目录 一、什么是网络流量分析仪&#xff1f; 主要功能&#xff1a; 二、为什么网络流量分析仪在网络故障排除中如此重要&#xff1f; 三、实际案例&#xff1a;使用网络流量分析仪快速排查网络故障 案例一&#xff1a;流量拥塞导致的带宽不足 案例二&#xff1a;服务器响…

【Kubernets】容器网络基础二:通讲CNI(Container Network Interface)容器网络接口实现方案

文章目录 背景知识Underlay网络Overlay网络一、基本概念二、工作原理三、实现方案四、应用场景 两者对比示意图 CNI实现有哪些&#xff1f;FlannelFlannel 的工作原理Flannel 的主要组件数据传输机制总结 Calico一、架构基础二、核心组件与功能三、路由与数据包转发四、安全策略…