在 OpenHarmony(ArkUI) 中,“列表组件分页”通常有两种常见场景,分别使用不同的实现方式:
适用于数据量不大、已全部加载到本地的情况。
List + ForEach(手动分页)核心思路:
currentPagepageSize 截取数据@Entry
@Component
struct PageListExample {
private allData: number[] = Array.from({ length: 100 }, (_, i) => i + 1)
@State currentPage: number = 1
private pageSize: number = 10
get pageData() {
const start = (this.currentPage - 1) * this.pageSize
return this.allData.slice(start, start + this.pageSize)
}
build() {
Column() {
List() {
ForEach(this.pageData, (item: number) => {
ListItem() {
Text(`Item ${item}`)
.fontSize(20)
.padding(10)
}
})
}
Row() {
Button('上一页')
.enabled(this.currentPage > 1)
.onClick(() => this.currentPage--)
Button('下一页')
.enabled(this.currentPage * this.pageSize < this.allData.length)
.onClick(() => this.currentPage++)
}
.margin(10)
}
}
}
✅ 优点:简单直观
❌ 缺点:不适合大数据量
适用于数据量大、接口分页的情况(最常见)。
List + onReachEnd当列表滚动到底部时触发加载下一页。
@Entry
@Component
struct LazyListExample {
@State listData: string[] = []
private page: number = 1
private pageSize: number = 20
@State loading: boolean = false
aboutToAppear() {
this.loadData()
}
loadData() {
if (this.loading) return
this.loading = true
// 模拟网络请求
setTimeout(() => {
const newData = Array.from(
{ length: this.pageSize },
(_, i) => `第${this.page}页-数据${i + 1}`
)
this.listData = this.listData.concat(newData)
this.page++
this.loading = false
}, 500)
}
build() {
List() {
ForEach(this.listData, (item: string) => {
ListItem() {
Text(item)
.fontSize(18)
.padding(10)
}
})
if (this.loading) {
ListItem() {
LoadingProgress()
Text('加载中...')
}
}
}
.onReachEnd(() => {
this.loadData()
})
}
}
✅ 优点:性能好,适合真实业务
✅ 支持无限滚动
❌ 需要后端分页接口
LazyForEach(高性能分页推荐)如果数据量非常大(上千条),推荐使用 LazyForEach + IDataSource。
适合场景:
(如果你需要,我可以直接给你一个 LazyForEach 分页完整示例)
| 场景 | 推荐方式 |
|---|---|
| 小数据、简单分页 | ForEach + 页码 |
| 移动端常见列表 | onReachEnd 滚动加载 |
| 超长列表 | LazyForEach + 分页 |
如果你能告诉我:
我可以给你更贴合业务的示例代码。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。