@nutui/nutui-react
Version:
京东风格的轻量级移动端 React 组件库,支持一套代码生成 H5 和小程序
90 lines (89 loc) • 2.91 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "usePagination", {
enumerable: true,
get: function() {
return usePagination;
}
});
var _object_spread = require("@swc/helpers/_/_object_spread");
var defaultPaginationOptions = {
current: 0,
itemsPerPage: 10,
displayCount: 5,
ellipse: false
};
function human2Machine(number) {
return --number;
}
function calculateNodes(options, nodesCount) {
// 分页器内部的索引从 0 开始,用户使用的索引从 1 开始
var halfIndex = Math.floor(options.displayCount / 2);
var buttonsCountIndex = human2Machine(nodesCount);
var displayCountIndex = human2Machine(options.displayCount);
var currentIndex = human2Machine(options.current);
var start;
var end;
if (buttonsCountIndex <= displayCountIndex) {
start = 0;
end = buttonsCountIndex;
} else {
start = Math.max(0, currentIndex - halfIndex);
end = Math.min(buttonsCountIndex, currentIndex + halfIndex);
if (end - start < displayCountIndex) {
if (start === 0) {
end = Math.min(start + displayCountIndex, buttonsCountIndex);
} else if (end === buttonsCountIndex) {
start = Math.max(end - displayCountIndex, 1);
}
} else if (end - start > displayCountIndex) {
end = start + displayCountIndex;
}
}
var buttons = [];
for(var i = start; i <= end; i++){
var humanPageNumber = i + 1;
buttons.push({
number: humanPageNumber,
text: humanPageNumber.toString(),
selected: options.current === humanPageNumber
});
}
return addEllipses(buttons, {
nodesCount: nodesCount,
ellipse: options.ellipse,
displayCount: options.displayCount
});
}
function addEllipses(nodes, param) {
var displayCount = param.displayCount, nodesCount = param.nodesCount, ellipse = param.ellipse;
if (nodesCount <= displayCount || !ellipse) return nodes;
var start = nodes[0];
var end = nodes[nodes.length - 1];
var leftEllipse = start.number > 1;
var rightEllipse = end.number < nodesCount;
if (leftEllipse) {
nodes.unshift({
number: start.number - 1,
text: '...'
});
}
if (rightEllipse) {
nodes.push({
number: end.number + 1,
text: '...'
});
}
return nodes;
}
var usePagination = function usePagination(options) {
var mergedOptions = (0, _object_spread._)({}, defaultPaginationOptions, options);
var total = mergedOptions.total, itemsPerPage = mergedOptions.itemsPerPage;
var nodesCount = Math.ceil((total || 0) / itemsPerPage) || 1;
return [
calculateNodes(mergedOptions, nodesCount),
nodesCount
];
};
;