一、下拉刷新功能详解
1. 功能说明
下拉刷新是移动应用中常见的交互方式,当用户手指从上往下拖动页面时会出现一个刷新动画,松手后会重新加载最新的数据。
graph LR
用户下拉 --> 触发onRefreshing回调 --> 数据请求 --> 解析响应数据更新 --> UI自动更新 --> 设置isRefreshing停止动画
2. 实现原理
使用了HarmonyOS中ArkUI提供的 Refresh 组件来实现这个功能。
代码解析:
@State isRefreshing: boolean = false
- 定义了一个状态变量用于控制刷新动画是否显示
Refresh({refreshing: $$this.isRefreshing}) {
// ...其他代码
}
.onRefreshing(async () => {
const result: IRes = await this.getJokeLis()
this.jokes = result.data
this.isRefreshing = false
})
Refresh是一个容器组件,包裹需要支持下拉刷新的内容refreshing属性绑定到isRefreshing状态变量,控制刷新状态onRefreshing是下拉刷新的回调函数,当用户触发下拉动作时会被调用
3. 数据更新流程
- 用户下拉页面 ->
- 触发
onRefreshing回调 -> - 调用
getJokeLis()方法请求新数据 -> - 收到响应后解析数据 ->
- 更新
jokes数据源 -> - 设置
isRefreshing = false停止刷新动画
二、上拉加载更多功能详解
1. 功能说明
上拉加载更多是在用户滚动到底部时自动加载更多数据的功能,常用于分页展示大量数据。
graph LR
列表滚动到底 --> 触发onReachEnd回调 --> 数据请求 --> 解析响应追加数据 --> UI自动更新
2. 实现原理
在本项目中,我们使用了HarmonyOS的 List 组件提供的 onReachEnd 方法。
代码解析:
jokeNum: number = 5
- 这个变量定义了每次请求的数据数量
.onReachEnd(async ()=>{
const result: IRes = await this.getJokeLis()
this.jokes = [...this.jokes, ...result.data]
})
onReachEnd是列表滚动到底部时触发的回调- 我们在这里再次调用
getJokeLis()获取更多数据 - 将新数据追加到现有列表中(使用了扩展运算符合并数组)
ListItem(){
LoadingProgress().width(50)
}
.width('100%')
- 列表底部添加加载进度条,提示用户正在加载更多数据
三、小贴士(常见问题)
1. 如何防止重复加载?
目前的实现没有防重机制,可以添加一个加载状态变量来避免重复请求:
@State isLoadingMore: boolean = false
// 在onReachEnd中添加判断
if (!this.isLoadingMore) {
this.isLoadingMore = true
const result: IRes = await this.getJokeLis()
// ...原有代码...
this.isLoadingMore = false
}
2. 如何显示"没有更多数据"提示?
可以添加一个标志位判断是否已加载完所有数据:
@State noMoreData: boolean = false
// 在getJokeLis返回空数据时
if (result.data.length === 0) {
this.noMoreData = true
} else {
// ...原有逻辑...
}
然后在列表底部根据状态显示不同内容:
if (this.noMoreData) {
ListItem() {
Text('没有更多数据了')
.fontSize(14)
.textAlign(TextAlign.Center)
.width('100%')
}
} else {
ListItem(){
LoadingProgress().width(50)
}
.width('100%')
}
四、总结
对于初学者来说,理解这两个功能的关键在于:
- 状态管理:通过
@State装饰器控制组件的状态变化 - 组件回调:利用
Refresh和List提供的内置回调方法 - 数据驱动视图:HarmonyOS采用声明式开发范式,数据变化会自动更新UI
建议新手开发者先理解整个数据流动的过程,再尝试自己修改参数或添加一些简单的功能,比如添加加载失败重试等功能。