所有数据列表页面都已实现滚动分页加载功能:
/plans) ✅/inventory) ✅/weighing) ✅/master-data) ✅/master-data) ✅/user) ✅每个列表页面都维护两个数据数组:
allData: 存储从 API 获取的完整数据tableData: 当前显示的数据(分页后的数据)currentPage: 当前页码(从 1 开始)pageSize: 每页数据量(默认 20 条)const loadData = async (reset = false) => {
// 重置时清空数据
if (reset) {
currentPage.value = 1
allData.value = []
tableData.value = []
finished.value = false
}
loading.value = true
try {
// 第一页或重置时,重新获取所有数据
if (reset || currentPage.value === 1) {
const data = await api.list(params)
allData.value = data
}
// 分页切片
const start = (currentPage.value - 1) * pageSize.value
const end = start + pageSize.value
const newData = allData.value.slice(start, end)
// 追加或替换数据
if (reset || currentPage.value === 1) {
tableData.value = newData
} else {
tableData.value.push(...newData)
}
// 判断是否加载完成
if (tableData.value.length >= allData.value.length) {
finished.value = true
} else {
currentPage.value++
}
} catch (error) {
Toast.fail('加载数据失败')
finished.value = true
} finally {
loading.value = false
}
}
使用 Vant 的 van-list 组件实现滚动加载:
<van-list
v-model:loading="loading"
:finished="finished"
finished-text="没有更多了"
@load="onLoad"
>
<!-- 列表内容 -->
</van-list>
const onLoad = () => {
if (!finished.value) {
loadData() // 加载下一页
}
}
onMounted(() => {
loadData(true) // 重置并加载第一页
})
const handleSearch = () => {
loadData(true) // 重置并重新加载
}
// 新增/编辑/删除后
await api.create(data)
Toast.success('操作成功')
loadData(true) // 重置并重新加载
allData 缓存完整数据,避免重复请求如果数据量很大,可以考虑:
vue-virtual-scroller)