import { useState, useEffect } from 'preact/hooks' interface IPagination { total: number onChange: (page: number) => void page: number pagesize: number } const Pagination = ({ total, onChange, page, pagesize, }: IPagination) => { const [value, setValue] = useState('1') const [num, setNum] = useState(1) const [seqNums, setSeqNums] = useState<[number, number][]>([]) useEffect(() => { setValue('1') setNum(1) }, []) useEffect(() => { if (page) { setValue(page.toString()); let nums: [number, number][] = [] for (let i = 1; i < total / pagesize + 1; i++) { if (i === 1) { nums.push([1, 1]) } else { nums.push([i, 0]) } } setSeqNums(nums) calSeqNums(nums, page) } }, [total, page]) const handleChange = (e: Event) => { const target = e.target as HTMLInputElement setValue(target.value) } const handleEnterPress = (e: KeyboardEvent) => { if (e.key === 'Enter') { if (parseInt(value) <= seqNums.length && parseInt(value) > 0) { handleChangeNum(parseInt(value)) } else if (parseInt(value) >= seqNums.length) { handleChangeNum(seqNums.length) } else if (parseInt(value) < seqNums.length) { handleChangeNum(1) } else { handleChangeNum(1) } } } const calSeqNums = (seqNums: [number, number][], num: number) => { const seqNumsTemp = seqNums.map((item): [number, number] => item[0] === num ? [item[0], 1] : [item[0], 0], ) setSeqNums(seqNumsTemp) setNum(num) } const handleChangeNum = (val: number|string) => { if (typeof val === 'number') { setValue(String(val)) if (val !== num) onChange(val) calSeqNums(seqNums, val) } else if (typeof val === 'string') { if (val === 'pre') { if (num > 1) { calSeqNums(seqNums, num - 1) setValue(String(num - 1)) onChange(num - 1) } } else if (val === 'next') { if (num < seqNums.length) { calSeqNums(seqNums, num + 1) setValue(String(num + 1)) onChange(num + 1) } } } } const calPaginationDom = () => { return seqNums.map((item) => ( handleChangeNum(item[0])} > {item[0]} )) } const calPaginationDomEtc = () => { return ( <> {num < 5 && ( <> {seqNums.slice(0, 5).map((item) => ( handleChangeNum(item[0])} > {item[0]} ))} ... handleChangeNum(seqNums.length)} > {seqNums.length} )} {num >= 5 && num <= seqNums.length - 4 && ( <> handleChangeNum(1)}> 1 ... {seqNums.slice(num - 3, num + 2).map((item) => ( handleChangeNum(item[0])} > {item[0]} ))} ... handleChangeNum(seqNums.length)} > {seqNums.length} )} {num > seqNums.length - 4 && ( <> handleChangeNum(1)} > 1 ... {seqNums.slice(seqNums.length - 5, seqNums.length).map((item) => ( handleChangeNum(item[0])} > {item[0]} ))} )} ) } return (
handleChangeNum('pre')} > {/* */} ◀ {seqNums.length < 10 ? calPaginationDom() : calPaginationDomEtc()} handleChangeNum('next')} > {/* */} ▶ 前往
) } export default Pagination