【鸿蒙实战开发】数据的下拉革新与上拉加载

打印 上一主题 下一主题

主题 820|帖子 820|积分 2460

本章介绍

本章主要介绍 ArkUI 开发中最常用的场景下拉革新, 上拉加载,在本章中介绍的内容在实际开发过程当中会高频的使用,以是同砚们要牢记本章的内容。下面就让我们开始本日的讲授吧!
List 组件

在 ArkUI 中List容器组件也可以实现数据滚动的效果, 这里为什么先介绍 List 组件,因为在本章节介绍的下拉革新和上拉加载用到了从此组件,以是一起讲授一下。
语法

  1. List(){
  2.   ListItem(){
  3.    
  4.   }
  5. }
复制代码
  留意: 在 List 组件中必须包含 ListItem 子组件才能正常渲染数据,可以明白为每一个 ListItem 对应的就是一条数据。
  示例


  1. @Entry
  2. @Component
  3. struct ListDemoPage {
  4.   build() {
  5.     Column() {
  6.       List() {
  7.         ListItem() {
  8.           Row() {
  9.             Text('测试数据 List')
  10.           }
  11.           .padding(10)
  12.           .width('100%')
  13.         }
  14.         ListItem() {
  15.           Row() {
  16.             Text('测试数据 List')
  17.           }
  18.           .padding(10)
  19.           .width('100%')
  20.         }
  21.         ListItem() {
  22.           Row() {
  23.             Text('测试数据 List')
  24.           }
  25.           .padding(10)
  26.           .width('100%')
  27.         }
  28.         ListItem() {
  29.           Row() {
  30.             Text('测试数据 List')
  31.           }
  32.           .padding(10)
  33.           .width('100%')
  34.         }
  35.         ListItem() {
  36.           Row() {
  37.             Text('测试数据 List')
  38.           }
  39.           .padding(10)
  40.           .width('100%')
  41.         }
  42.       }
  43.       .height(100)
  44.       .divider({strokeWidth:1,color:"#ededed"})
  45.     }
  46.     .height('100%')
  47.     .width('100%')
  48.   }
  49. }
复制代码
我们发现当页面元素超出了List组件设置的高度,屏幕上就会出现滚动条,并且下拉画面数据到顶部的时候,画面团体也会被下拉。并且上述代码有重复代码,这时我们就可以使用上一章节讲授的循环渲染ForEach组件去渲染列表让我们改造一下代码。

  1. @Entry
  2. @Component
  3. struct ListDemoPage {
  4.   // 定义一个类型为number,长度为 30 的数组,并且放入数据,数据为当前时间戳
  5.   @State
  6.   data:number[] = new Array(30).fill(Date.now())
  7.   build() {
  8.     Column() {
  9.       // 使用 List 组件
  10.       List() {
  11.         // 循环渲染
  12.         ForEach(this.data,(item:number)=>{
  13.           // 必须使用 ListItem 组件进行包裹
  14.           ListItem() {
  15.             Row() {
  16.               Text(item+"")
  17.             }
  18.             .padding(10)
  19.             .width('100%')
  20.           }
  21.         })
  22.       }
  23.       .height('100%')
  24.       .divider({strokeWidth:1,color:"#ededed"})
  25.     }
  26.     .height('100%')
  27.     .width('100%')
  28.   }
  29. }
复制代码
下面我们实现下拉革新添加数据
Refresh 组件

Refresh可以举行页面下拉操纵并显示革新动效的容器组件。Refresh子组件会跟随手势下拉而下移。我们使用这个组件将我们上面的代码举行包裹。
语法

  1. Refresh(){
  2.   
  3. }
复制代码
介绍一下 可以往Refresh组件传递的参数(先介绍两个)
●refreshing:当前组件是否正在革新。支持双向绑定
●builder:下拉时,自定义革新样式的组件。可以自定义下拉革新样式。
下拉革新

下面让我们使用Refresh组件实现下拉革新的功能。
示例

  1. @Entry
  2. @Component
  3. struct ListDemoPage {
  4.   // 定义数据
  5.   @State
  6.   data:number[] = new Array(30).fill(Date.now())
  7.   // 定义刷新状态 flag
  8.   @State
  9.   private refreshingFlag: boolean = false;
  10.   // 自定义下刷新页面
  11.   @Builder
  12.   private LoadingCustom() {
  13.     Stack() {
  14.       Row() {
  15.         // Loading 组件
  16.         LoadingProgress().width(30).color("#4095cb")
  17.       }
  18.     }.width('100%')
  19.   }
  20.   build() {
  21.     Column() {
  22.       // 使用刷新组件
  23.       Refresh({ refreshing: $$this.refreshingFlag, builder: this.LoadingCustom() }) {
  24.         List() {
  25.           ForEach(this.data, (item: number) => {
  26.             ListItem() {
  27.               Row() {
  28.                 Text(item + "")
  29.               }
  30.               .padding(10)
  31.               .width('100%')
  32.             }
  33.           })
  34.         }
  35.         .height('100%')
  36.         .divider({ strokeWidth: 1, color: "#ededed" })
  37.       }
  38.       // 进入刷新状态时触发回调。这里两后停止刷新状态
  39.       .onRefreshing(() => {
  40.         setTimeout(() => {
  41.           this.refreshingFlag = false
  42.         }, 2000)
  43.       })
  44.       // 设置触发刷新的下拉偏移量。
  45.       .refreshOffset(64)
  46.       // 设置当下拉距离超过refreshOffset时是否触发刷新。
  47.       .pullToRefresh(true)
  48.     }
  49.     .height('100%')
  50.     .width('100%')
  51.   }
  52. }
复制代码
上述代码中使用@builder 装饰器修饰的内容可以明白为一个子画面,实现了自定义革新页面,本章先不过多的说@builder 的作用。
现在只需在onRefreshing的方法中新增 List 的数据即可。
  1. .onRefreshing(() => {
  2.         setTimeout(() => {
  3.           this.refreshingFlag = false
  4.           // 添加数据
  5.           this.data.push(...Array(30).fill(Date.now()))
  6.         }, 2000)
  7. })
复制代码
效果:

如上图所示,每次下拉革新后画面会新增 30 条数据。
上拉加载

Refresh组件中没有提供上拉加载的功能,我们可以联合 List 组件的变瞎搅实现此功能。
示例

我们发现当页面的滚动条触底时,会触发加载数据的变乱,此时我们必要在代码中知道当前滚动条的状态。
  1. import { promptAction } from '@kit.ArkUI';
  2. @Entry
  3. @Component
  4. struct ListDemoPage {
  5.   @State
  6.   data:number[] = new Array(30).fill(Date.now())
  7.   @State
  8.   private refreshingFlag: boolean = false;
  9.   // 判断滚动条是否触底
  10.   @State
  11.   private isEnd: boolean = false;
  12.   // 使用Scroller对象
  13.   scroller: Scroller = new Scroller();
  14.   @Builder
  15.   private LoadingCustom() {
  16.     Stack() {
  17.       Row() {
  18.         LoadingProgress().width(30).color("#4095cb")
  19.       }
  20.     }.width('100%')
  21.   }
  22.   build() {
  23.     Column() {
  24.       Refresh({ refreshing: $$this.refreshingFlag, builder: this.LoadingCustom() }) {
  25.         List() {
  26.           ForEach(this.data, (item: number) => {
  27.             ListItem() {
  28.               Row() {
  29.                 Text(item + "")
  30.               }
  31.               .padding(10)
  32.               .width('100%')
  33.             }
  34.           })
  35.         }
  36.         .height('100%')
  37.         .divider({ strokeWidth: 1, color: "#ededed" })
  38.         // 当画面能滚动说明没有触底
  39.         .onScrollStart(() => {
  40.           this.isEnd = false
  41.         })
  42.         // 判断当前是否停止滚动
  43.         .onScrollStop(() => {
  44.           // 如果停止滚动并且满足滚动条已经在底部进行数据的加载。
  45.           if (this.isEnd) {
  46.             // 加载数据
  47.             promptAction.showToast({ message: '加载数据' })
  48.             setTimeout(()=>{
  49.               this.data.push(...Array(30).fill(Date.now()))
  50.               // 加载完数据把滚动条移至底部
  51.               this.scroller.scrollEdge(Edge.Bottom)
  52.             },1000)
  53.           }
  54.         })
  55.         // 当滚动条触底把 flag 设置成 true
  56.         .onReachEnd(() => {
  57.           this.isEnd = true
  58.         })
  59.       }
  60.       .onRefreshing(() => {
  61.         setTimeout(() => {
  62.           this.refreshingFlag = false
  63.           this.data.push(...Array(30).fill(Date.now()))
  64.         }, 2000)
  65.       })
  66.       .refreshOffset(64)
  67.       .pullToRefresh(true)
  68.     }
  69.     .height('100%')
  70.     .width('100%')
  71.   }
  72. }
复制代码
写在末了

有很多小同伴不知道学习哪些鸿蒙开发技能?不知道必要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,终极浪费大量时间。以是有一份实用的鸿蒙(HarmonyOS NEXT)文档用来跟着学习是非常有必要的。

这份鸿蒙(HarmonyOS NEXT)文档包含了鸿蒙开发必掌握的核心知识要点,内容包含了(ArkTS、ArkUI开发组件、Stage模子、多端摆设、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技能、Napi组件、OpenHarmony内核、OpenHarmony南向开发、鸿蒙项目实战等等)鸿蒙(HarmonyOS NEXT)技能知识点。
希望这一份鸿蒙学习文档能够给大家带来资助,有必要的小同伴自行领取,限时开源,先到先得~无套路领取!!

获取这份完整版高清学习路线,请点击→纯血版全套鸿蒙HarmonyOS学习文档

鸿蒙(HarmonyOS NEXT)5.0最新学习路线


有了路线图,怎么能没有学习文档呢,小编也准备了一份联合鸿蒙官方发布笔记整理收纳的一套体系性的鸿蒙(OpenHarmony )学习手册(共计1236页)与鸿蒙(OpenHarmony )开发入门讲授视频,内容包含:ArkTS、ArkUI、Web开发、应用模子、资源分类…等知识点。

获取以上完整版高清学习路线,请点击→纯血版全套鸿蒙HarmonyOS学习文档

《鸿蒙 (OpenHarmony)开发入门讲授视频》


《鸿蒙生态应用开发V3.0白皮书》


《鸿蒙 (OpenHarmony)开发基础到实战手册》

OpenHarmony北向、南向开发情况搭建

《鸿蒙开发基础》

●ArkTS语言
●安装DevEco Studio
●运用你的第一个ArkTS应用
●ArkUI声明式UI开发
.……

《鸿蒙开发进阶》

●Stage模子入门
●网络管理
●数据管理
●电话服务
●分布式应用开发
●通知与窗口管理
●多媒体技能
●安全技能
●使命管理
●WebGL
●国际化开发
●应用测试
●DFX面向未来计划
●鸿蒙体系移植和裁剪定制
……

《鸿蒙进阶实战》

●ArkTS实践
●UIAbility应用
●网络案例
……

获取以上完整鸿蒙HarmonyOS学习文档,请点击→纯血版全套鸿蒙HarmonyOS学习文档


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

农民

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表