分页器实现的基本原理

605 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第24天,点击查看活动详情juejin.cn/post/714765… Vue中的分页器实现过程

想要实现分页器,有四个点是我们必须要知道的。

  1. pageNum:当前页
  2. pageSize:每页展示几条信息
  3. total:信息总条数
  4. continues:连续页码个数 要实现的具体如下:

很多时候,这种分页器会是异步请求数据,也就是点击哪页就向服务器请求哪页的数据。 1.png

很多时候,数据都是从服务器请求回来的,请求回来的数据中会包含total属性,所以可以直接在模板里输出。

先来算出一共有多少页?

思路:总页码数如下

totalPage = Math.ceil(用信息总条数total / 每页展示的条数 pageSize) 

如果total/pageSize有余数,剩下的也要占满一页,所以利用Math.ceil方法向上取整。

计算连续页码数的具体数字

  • continues通常都是奇数,这样的话会比较美观。
  • 所以假设连续页码数需要展示5个。我们首先要计算出开始要展示的页码start和结束的end页码。
  • 计算时又分为正常情况和不正常的情况,具体如下:

正常情况:连续页码数continues < totalPage

思路:根据pageNum进行计算。start一定是pageNum-2,end是pageNum+2.但这种情况只是适合连续页码数为5的,所以我们应设置成动态的。

先假设start=0,end=0;再去计算连续页码的开始和结束
 start=pageNum-parseInt(continues/2);//parseInt向下取整
 end=pageNum+parseInt(continues/2);

特殊情况(1)continues > totalPage

有很多时候,会有一些特殊情况,先来说一说。如果continues的个数,大于要展示的总页码数totalPage的话,那么需要让start = 0end = totalPage

特殊情况(2):在正常情况下start < 0

如果start < 0,需要让 start = 1end = continues;

特殊情况(3):在正常情况下end > total

如果end大于要显示的总条数total,那么就让end = totalstart = total - continues + 1

  • 最后计算出来要把start和end返回。
  • 把以上的逻辑全都放在computed里进行处理,这样的话就会成为响应式实时更新。

具体实现代码如下

1.png ...的显示与隐藏

  1. 前面的...元素:添加v-if属性,根据上面返回的结果进行判断,也就是如果start>2的时候就显示
  2. 后面的...元素:添加v-if属性,通过end进行判断,如果end<totalPage-1时显示
  3. 上一页元素:在pageNum=1的时候添加disabled属性
  4. 下一页元素:在end=totalPage的时候添加disabled属性
  5. 中间的页码其实是通过遍历end生成的,给button绑定点击事件,并把page传到作为参数传到服务器,把请求回来的数据进行渲染。
  6. 我的例子中的pageNo就是pageNum,所有的数据都是父组件传过来的,注册在了props里进行了使用。所以做点击事件的时候又向父组件传了当前页page

代码如下

15.png