gui-one-nutui-react-taro
Version:
京东风格的轻量级移动端 React 组件库,支持一套代码生成 H5 和小程序
170 lines (169 loc) • 7.31 kB
JavaScript
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
import _defineProperty from "@babel/runtime/helpers/defineProperty";
var _excluded = ["modelValue", "mode", "prevText", "nextText", "pageCount", "totalItems", "itemsPerPage", "showPageSize", "onChange", "updatecurrent", "forceEllipses", "pageNodeRender", "defaultValue", "className"];
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
import React__default, { useState, useEffect } from 'react';
import { u as useConfig } from './configprovider.taro-6c7b3056.js';
import { c as cn } from './bem-893ad28d.js';
var defaultProps = {
defaultValue: 1,
mode: 'multi',
prevText: '',
nextText: '',
pageCount: '',
totalItems: '0',
itemsPerPage: '10',
showPageSize: '5',
forceEllipses: false,
className: '',
pageNodeRender: function pageNodeRender(item) {
return item.text;
}
};
var Pagination = function Pagination(props) {
var _useConfig = useConfig(),
locale = _useConfig.locale;
_objectSpread(_objectSpread({}, defaultProps), props);
var modelValue = props.modelValue,
mode = props.mode,
prevText = props.prevText,
nextText = props.nextText,
pageCount = props.pageCount,
totalItems = props.totalItems,
itemsPerPage = props.itemsPerPage,
showPageSize = props.showPageSize,
onChange = props.onChange,
updatecurrent = props.updatecurrent,
forceEllipses = props.forceEllipses,
pageNodeRender = props.pageNodeRender,
defaultValue = props.defaultValue,
className = props.className,
rest = _objectWithoutProperties(props, _excluded);
var _useState = useState(1),
_useState2 = _slicedToArray(_useState, 2),
currentPage = _useState2[0],
setCurrent = _useState2[1];
var _useState3 = useState([]),
_useState4 = _slicedToArray(_useState3, 2),
pages = _useState4[0],
setPages = _useState4[1];
var _useState5 = useState(Number(pageCount)),
_useState6 = _slicedToArray(_useState5, 2),
countRef = _useState6[0],
setCountRef = _useState6[1];
var paginationBem = cn('pagination');
// 计算页面的数量
var computedCountRef = function computedCountRef() {
var num = Number(pageCount) || Math.ceil(Number(totalItems) / Number(itemsPerPage));
return Number.isNaN(num) ? 1 : Math.max(1, num);
};
// 生成pages数组,用来遍历
var computedPages = function computedPages(_currentPage, _countRef) {
if (mode === 'simple') return [];
var items = [];
var pageCount = _countRef || countRef; // 总的页面数量
var pageSize = Number(showPageSize); // 展示的页面个数
var _current = _currentPage || Number(currentPage); // 当前页
var startPage = 1;
var endPage = pageCount;
var partialShow = pageCount > pageSize;
if (partialShow) {
// 选中的page在展示的page中间
startPage = Math.max(_current - Math.floor(pageSize / 2), 1);
endPage = startPage + pageSize - 1;
if (endPage > pageCount) {
endPage = pageCount;
startPage = endPage - pageSize + 1;
}
}
// 遍历生成数组
for (var i = startPage; i <= endPage; i++) {
var page = setPage(i, i, _current === i);
items.push(page);
}
// 判断是否有折叠
if (partialShow && pageSize > 0 && forceEllipses) {
if (startPage > 1) {
var prevPage = setPage(startPage - 1, '...');
items.unshift(prevPage);
}
if (endPage < pageCount) {
var nextPage = setPage(endPage + 1, '...');
items.push(nextPage);
}
}
return items;
};
// 点击选择page
var selectPage = function selectPage(curPage, isSelect) {
if (curPage > countRef || curPage < 1) return;
// 是否传入modelValue
if (!('modelValue' in props)) {
setCurrent(Number(curPage));
if (curPage !== currentPage) {
setPages(computedPages(curPage));
}
}
if (curPage !== currentPage) {
updatecurrent && updatecurrent(curPage);
}
if (isSelect) onChange && onChange(curPage);
};
// set page 对象
var setPage = function setPage(number, text, active) {
return {
number: number,
text: text,
active: active
};
};
useEffect(function () {
// 初始化 判断是否传入值 计算 当前页,总页数,生成子节点
var currentValue = props.defaultValue || 1;
if ('modelValue' in props) {
currentValue = Number(props.modelValue);
}
var pageCount = computedCountRef();
setCountRef(pageCount);
setPages(computedPages(currentValue, pageCount));
}, []);
if ('modelValue' in props) {
var current = props.modelValue ? Number(props.modelValue) : 1;
if (current !== currentPage) {
setCurrent(current);
setPages(computedPages(Number(current)));
}
}
return React__default.createElement("div", _objectSpread({
className: "".concat(paginationBem(''), " ").concat(className)
}, rest), React__default.createElement("div", {
className: "".concat(paginationBem('prev'), " ").concat(mode === 'multi' ? '' : 'simple-border', " ").concat(currentPage === 1 ? 'disabled' : ''),
onClick: function onClick(e) {
return selectPage(Number(currentPage) - 1, true);
}
}, prevText || locale.pagination.prev), mode === 'multi' ? React__default.createElement("div", {
className: "".concat(paginationBem('contain'))
}, pages.map(function (item, index) {
return React__default.createElement("div", {
key: "".concat(index, "pagination"),
className: "".concat(paginationBem('item'), " ").concat(item.active ? 'active' : ''),
onClick: function onClick(e) {
return !item.active ? selectPage(item.number, true) : '';
}
}, pageNodeRender ? pageNodeRender(item) : item.text);
})) : '', mode === 'simple' ? React__default.createElement("div", {
className: "".concat(paginationBem('contain'))
}, React__default.createElement("div", {
className: "".concat(paginationBem('simple'))
}, currentPage, "/", countRef)) : '', React__default.createElement("div", {
className: "".concat(paginationBem('next'), " ").concat(Number(currentPage) >= countRef ? 'disabled' : ''),
onClick: function onClick(e) {
return selectPage(Number(currentPage) + 1, true);
}
}, nextText || locale.pagination.next));
};
Pagination.defaultProps = defaultProps;
Pagination.displayName = 'NutPagination';
export { Pagination as P };