UNPKG

@nutui/nutui-react

Version:

京东风格的轻量级移动端 React 组件库,支持一套代码生成 H5 和小程序

90 lines (89 loc) 2.91 kB
"use strict"; 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 ]; };