import React, { useState } from 'react' import { makeStyles, createStyles, Theme } from '@material-ui/core/styles'; import Box from '@material-ui/core/Box'; import Button from '@material-ui/core/Button'; const useStyles = makeStyles((theme: Theme) => createStyles({ root: { margin: 0, padding: 0, marginBottom: '5px', fontSize: '0.8em', alignItems: 'center', justifyContent: 'flex-start', display: 'flex', flexWrap: 'wrap', userSelect: 'none' }, p: { display: 'flex', fontSize: '0.8em', padding: '2px 5px', margin: 2, borderRadius: 2, minWidth: 32, nowrap: 'true', textTransform: 'capitalize' }, text: { fontSize: '0.8em', lineHeight: '32px', padding: theme.spacing(0, 1) }, clearfix: { clear: 'both', }, current: { display: 'flex', flexWrap: 'wrap', background: '#0066cc', fontSize: '0.8em', color: '#fff', padding: '2px 5px', borderRadius: 2, margin: 2, minWidth: 32 }, skip: { float: 'left', display: 'flex', flexDirection: 'row', alignItems: 'center', marginLeft: theme.spacing(1) }, input: { float: 'left', padding: '3px 3px', border: '1px solid #dedede', borderRadius: 3, width: 30 } })) /** * 分页 * @param props */ const ListPagination = (props: any) => { const { total, page, pageSize, onPageChange, onPageSizeChange, maxShow } = props // 样式 const classes = useStyles() // 总页数 const pageTotal = Math.floor(total / pageSize); const [newPage, setNewPage] = useState(page) const [newPageSize, setNewPageSize] = useState(pageSize) // 计算开始页号,结束页号 const cal = (): any => { let max = maxShow % 2 == 0 ? maxShow + 1 : maxShow; let startpage = 1 let endpage = max; let showNum = max; let halfNum = (max - 1) / 2; // 一半显示数量 // stepNum:当前页前页数,或当前页后页数 // 当前页号 - stepNum 大于1,开始页号为page-halfNum if (page - halfNum > 1) { startpage = page - halfNum; } else { startpage = 1; } // 当前页号 + stepNum 小于总页数,结束页号为page+halfNum if (page + halfNum < pageTotal) { endpage = page + halfNum; } else { endpage = pageTotal; // 开始页号大于总页数-showNum,且总页数大于showNum,开始页号为总页-showNum startpage = startpage > pageTotal - showNum && pageTotal > showNum ? pageTotal - showNum : startpage; // 结束页号小于showNum(每页页数)且小于总页数,结束页号showNum endpage = endpage < showNum && endpage < pageTotal ? showNum : endpage; endpage = endpage > pageTotal ? pageTotal : endpage; } return { startpage, endpage } } const { startpage, endpage } = cal() // 显示数字页号 const renderNumpages = (props: any) => { const { startpage, endpage, page, onPageChange, classes } = props const nodes = [] for (let i = startpage; i <= endpage; i++) { nodes.push() } return nodes } return ( {total > 0 && ( 共{total}条, {page}/{pageTotal < page && total > 0 ? page : pageTotal}页. )} {page > 1 && (<> )} {startpage > 1 && (<> ... )} {pageTotal > 1 && renderNumpages({ startpage, endpage, page, onPageChange: (i: number) => { onPageChange(i) }, classes })} {endpage > 1 && endpage < pageTotal && (<> ... )} {page < pageTotal && (<> )} {pageTotal > 1 && ( { if (event.target.value) { setNewPage(Number(event.target.value)) } }} /> )} {total > 0 && ( { if (event.target.value) { setNewPageSize(Number(event.target.value)) } }} /> )} ) } export default ListPagination