记录原因
前端需要做一种下拉刷新的获取数据,然后将数据拼接到之前数据上,实现下拉无限滚动,直到后台数据全部展示完,我第一想法就是使用分页来对数据进行分段返回
出现问题
我这边是使用mybatisplus+mybatis的pagehelper来进行分页,正常配置,正常使用都没有什么问题;但是当前端传入的页数超出了数据库存储的条数,pagehelper分页器默认返回第一页的数据,这也算是某种意义上的“无线滚动”吧
比如说,数据库存在101条数据,按照分页,每页50条则一共3页;正常前端是知晓一共多少页,传入的页数也不会超出这个范围,但是下拉刷新是不知道一共多少页,传入的页数就会超过3,传入大于3的页数,后端使用PageHelper.startPage(page, limit)进行分页
以下是调用PageHelper.startPage(page, limit)的主要流程
可以很简单的看出,setTatal()方法执行了两次(第一次源码图没帖出来),第一次执行PageHelper.startPage(page, limit),会创建Page对象并将我们传入的page和limit保存且计算出startRow,pageSize,pages等参数,这个时候的参数和我们预期的一样;第二次执行setTatal()方法,就会去计算pages参数的值,来判断传入page是否超出
这个就是出现问题的原因了。
解决方法
1.直接不使用PageHelper.startPage(page, limit),后端自行计算startRow和limit,然后拼接到sql语句后边
2.前端下拉滚动的时候,判断一下页数是否超出