@ivujs/i-utils
Version:
前端模块化 JavaScript 工具库
147 lines (144 loc) • 4.39 kB
JavaScript
;
/**
* @module 分页
*/
/**
* 获得分页起始数
* @param {Object} pagination 分页参数
* @returns {Array} 返回起始数
*/
function getLimit(pagination = {
page: 1,
pageSize: 10,
total: 0,
totalPage: 0,
pagerCount: 7,
}) {
return [pagination.pageSize * (pagination.page - 1), pagination.pageSize * pagination.page];
}
/**
* 获得总条数
* @param {Object} pagination 分页参数
* @returns {number} 返回总条数
*/
function getTotalPage(pagination = {
page: 1,
pageSize: 10,
total: 0,
totalPage: 0,
pagerCount: 7,
}) {
return Math.ceil((pagination.total || 0) / (pagination.pageSize || 0));
}
/**
* 获得彩虹分页器
* @param {Object} pagination 分页参数
* @param {Function} callback 回调函数
* @returns {Promise} 返回彩虹分页器数据
*/
function getRainbowPager(pagination = {
page: 1,
pageSize: 10,
total: 0,
totalPage: 0,
pagerCount: 7,
}, callback) {
return new Promise((resolve) => {
// 分页参数
const page = pagination.page || 1;
const totalPage = pagination.totalPage > 0 ? pagination.totalPage : getTotalPage(pagination);
const pagerCount = pagination.pagerCount || 7;
// 计算参数
const isEven = (pagerCount & 1) === 0;
const left = pagerCount >> 1;
let right = pagerCount >> 1;
let pagerLength = pagerCount;
// 计算生成的分页器数量
if (isEven) {
right++;
}
if (totalPage < pagerCount) {
pagerLength = totalPage;
}
// 分页器数组
const pager = new Array(pagerLength);
// 生成分页器
if (totalPage >= pagerCount) {
if (page <= left) {
for (let i = 0; i < pager.length; i++) {
pager[i] = i + 1;
}
}
else if (page > totalPage - right) {
for (let i = 0; i < pager.length; i++) {
pager[i] = i + totalPage - pagerCount + 1;
}
}
else {
for (let i = 0; i < pager.length; i++) {
pager[i] = i + page - left + (isEven ? 1 : 0);
}
}
}
else {
for (let i = 0; i < pager.length; i++) {
pager[i] = i + 1;
}
}
// 支持回调函数和Promise
callback && callback(pager);
resolve(pager);
});
}
/**
* 获得上一页
* @param {Object} pagination 分页参数
* @param {Function} callback 回调函数
* @returns {Promise} 返回上一页
*/
function getPrevPage(pagination = { page: 1, pageSize: 10, total: 0, totalPage: 0, pagerCount: 7 }, callback) {
return new Promise((resolve) => {
if (pagination.page > 1) {
pagination.page--;
}
else {
pagination.page = 1;
}
// 支持回调函数和Promise
callback && callback(pagination.page);
resolve(pagination.page);
});
}
/**
* 获得下一页
* @description 最后一页会根据totalPage参数判断,如果不传此参数,则会根据参数中pageSize和total重新计算总页数
* @param {Object} pagination 分页参数
* @param {Function} callback 回调函数
* @returns {Promise} 返回下一页
*/
function getNextPage(pagination = { page: 1, pageSize: 10, total: 0, totalPage: 0, pagerCount: 7 }, callback) {
return new Promise((resolve) => {
// 获得总页数,如果没有传totalPage,则需要根据传的pageSize和total计算
const totalPage = pagination.totalPage > 0 ? pagination.totalPage : getTotalPage(pagination);
// 计算当前页大于0和小与0的情况
if (pagination.page > 0) {
if (pagination.page < totalPage) {
pagination.page++;
}
else {
pagination.page = totalPage;
}
}
else {
pagination.page = 1;
}
// 支持回调函数和Promise
callback && callback(pagination.page);
resolve(pagination.page);
});
}
exports.getLimit = getLimit;
exports.getNextPage = getNextPage;
exports.getPrevPage = getPrevPage;
exports.getRainbowPager = getRainbowPager;
exports.getTotalPage = getTotalPage;