php 分页下拉自动加载数据,网页中,列表数据的分页加载、自动加载

1 简单说明

实际开发中,当数据量很大时,分页(分段)加载是必要的,不能一次性加载所有数据。 同时,当用户浏览到页面底部时,自动加载下一段数据并展示,可以增快新页面内容展现速度,提升用户体验。

2 分页加载

分页加载时,需要额外维护几条相关数据:offsetPage(当前页数)、hasNext(标志是否还有), 另外,可选择性添加fetching字段,用于表示数据正在加载。

data Model 的简易格式设计如下:

{

list: [],

hasNext: 1,

offsetPage: 0,

fetching:true

}

(ps: 服务端需要提供支持分段获取数据的API,比如可以通过设置limit, offset参数来指定数据区间)

分页加载大体流程为:

根据offsetPage以及预定义好的「每次加载数据条数limit」,设置分段加载的参数

异步加载数据时,先将fetching属性置为true,用于显示loading效果

数据获取完成后,将结果拼接到list数组后面,同时将fetching置为false、offsetPage++

3 自动加载

分段加载的思路很简单,下面说说自动加载的一种实现方式,先上实际开发项目中的截图。

滚动到「接近列表底部」时,可以看到「加载更多」字样,

bVDvnH?w=300&h=108

当继续滚动页面到达底部时,则触发自动加载:

bVDvnJ?w=300&h=100

不难看出这里的实现思路就是「监听DOM的Scroll事件,当滚动到底部或者很接近的时候,触发下一页数据的加载」

具体到coding层面的实现,则需要先了解DOM元素的几个属性:scrollHeight、clientHeight、scrollTop等:

scrollHeight:容器元素中全部内容的高度(包括padding)

clientHeight:容器元素的可视区域(注意,这里不一定是浏览器窗口的高度)

借网上的图说明一下:

bVDvnN?w=266&h=262

bVDvnQ?w=335&h=262

scrollTop: 滚动位置距离顶部的高度,当尚未滚动时,该值为0.

通过上诉三个值,即可计算出是否已经滚动到容器元素的底部位置了, 伪代码示意如下:

scrollEventListener(){

let container = getContainerElement();

if(container.scrollHeight - container.clientHeight - container.scrollTop < [一个较小的值]){

//加载下一页

//getNextPageData()

}

}

4 小tips:

绑定Scroll事件时,先要确定Container Element, 也就是确定想要哪个容器元素有滚动条,这在DOM层级比较深的时候,容易混淆。一个容易犯的错误是没有给目标Container Element指定overflow样式的值,导致滚动条实际是父元素的,从而无法触发Scroll事件。

自动加载的页数可以视情况做出限制,比如设置为只自动加载前10页,再往后就需要手动点击「加载更多」。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Uniapp 实现下拉分页加载数据,可以通过以下步骤: 1. 首先,在页面引入下拉刷新组件和分页加载组件。 ```html <template> <view> <list :finished="finished" @load="loadData" > <refresh refresher-triggered="onRefresh"> <!-- 下拉刷新的内容 --> </refresh> <cell v-for="(item, index) in dataList" :key="index"> <!-- 显示数据项的内容 --> </cell> <loading v-if="loading"></loading> </list> </view> </template> ``` 2. 在页面的 `data` 定义数据相关的变量,如 `dataList` 用于存储加载数据,`loading` 用于标识数据加载,`finished` 用于标识是否已加载完所有数据。 ```javascript export default { data() { return { dataList: [], loading: false, finished: false, }; }, // ... }; ``` 3. 实现下拉刷新和分页加载的方法。 ```javascript export default { // ... methods: { // 下拉刷新 onRefresh() { // 清空数据列表 this.dataList = []; // 重置加载状态 this.finished = false; // 加载数据 this.loadData(); }, // 分页加载 loadData() { if (this.loading || this.finished) return; this.loading = true; // 发起网络请求获取数据 // 假设每页加载 10 条数据 // 模拟异步请求延迟 setTimeout(() => { // 模拟请求成功 const newData = [...]; // 新加载数据 if (newData.length > 0) { this.dataList = this.dataList.concat(newData); } else { this.finished = true; // 数据加载完 } this.loading = false; }, 1000); }, }, }; ``` 以上是一个简单的示例,实现了下拉刷新和分页加载数据的功能。当用户下拉刷新页面时,会触发 `onRefresh` 方法,清空数据并重新加载;当用户滚动到列表底部时,会触发 `loadData` 方法,加载更多数据并追加到列表。你可以根据你的实际需求进行修改和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值