分页是一种比较常见的功能,分页的原理其实也很简单,首先要知道没有需要展示的项目数量 pageSize,然后还得知道当前所在的页数 currentPage, 设所有的 item 都在一个数组 array 里,每页需要展示 5 个 item,那么当 currentPage = 1 时,第一页要展示的所有 item 为 array.slice(0, 4), 第二页要展示的 item 为 array.slice(5, 9), 以此类推,那么第 n(n >= 0) 页需要展示的 item 应该为:array.slice(5n, 5n+4),推而广之,基本数字的分页公式就出来了:

currentArray = array.slice(pageSize * (currentPage - 1), pageSize * 2(currentPage - 1) - 1);

除了基本的数字分页,我们还经常看到上一页,下一页,这种怎么实现呢?上一页就是 currentPage - 1, 那么下一页就是 currentPage + 1,吧这两个分别带入上述公式,我们就得到了上一页,下一页的公式了:

// 上一页
currentArray = array.slice(pageSize * (currentPage - 2), pageSize * 2(currentPage - 2) -1)
// 下一页
currentArray = array.slice(pageSize * currentPage, pageSize * 2currentPage -1)

分页中还常常看到跳转页面的功能,所要跳转的数字就是我们选择的页数,因此跟第一种同理,用第一个公式即可。

除此之外,在选择下一页的时候,页面的数字组合会往右偏移,选择上一页的时候,页面的数字组合往左偏移,实现的方法也很简单

// 设当前页面数字组合为数组 nums,
// nums 初始化为 [1, 2, 3, 4, 5],
// 那么选择上一页时,
nums = nums.map(item => {
return item++;
});
// 选择下一页时
nums = nums.map(item => {
return item--;
});

实现了上面的页面数字组合更新之后,还有一个问题,当点击最后一页,和最开始一页时,页面数字组合应该是不被更新的,优化一下上面的算法:

// 设当前页面数字组合为数组 nums,
// nums 初始化为 [1, 2, 3, 4, 5],
// 那么选择上一页时,
nums = nums.map(item => {
if (item !== 1) {
return item++;
} else {
return;
}
});
// 选择下一页时
nums = nums.map(item => {
if (item !== totalPage.length - 1) {
return item--;
} else {
return;
}
});

至此,我自己总结的分页算法就讲解完啦。