index.tsx 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. import React, { useState } from 'react'
  2. import styles from './index.module.css'
  3. interface PagingProps {
  4. current: number,
  5. total: number,
  6. handleChange: Function,
  7. show: number,
  8. className?: string,
  9. number: number
  10. }
  11. function intercept(current: number, maxT: number, dis: number, minT = 1) {
  12. let cdis = Math.floor(dis / 2)
  13. let min = current - cdis
  14. let max = current + cdis
  15. if (min < minT) {
  16. max = max + (minT - min)
  17. min = minT
  18. } else if (max > maxT) {
  19. min = min - (max - maxT)
  20. max = maxT
  21. }
  22. min = min < minT ? minT : min
  23. max = max > maxT ? maxT : max
  24. return { min, max }
  25. }
  26. function Paging({ current = 1, show = 5, total, handleChange, className = '', number} : PagingProps) {
  27. const { min, max } = intercept(current, total, show)
  28. const [val, setVal] = useState(current)
  29. const clickHandle = (select: number) => {
  30. if (select < min || select > max) {
  31. select = current
  32. }
  33. setVal(select)
  34. handleChange(select)
  35. }
  36. let items = []
  37. for (let i = min; i <= max; i++) {
  38. items.push(<span key={i} onClick={() => clickHandle(i)} className={i === current ? styles.active: ''}>{i}</span>)
  39. }
  40. return (
  41. <div className={styles.paginglayer + ' ' + className}>
  42. <div className={styles.info}>共{number}条</div>
  43. <span className='icon-angle-left' onClick={() => clickHandle(current - 1)}></span>
  44. {items}
  45. <span className='icon-angle-right' onClick={() => clickHandle(current + 1)}></span>
  46. <div className={styles.goto}>
  47. 前往<input value={val} onChange={ev => setVal(Number(ev.target.value) || current)} onBlur={ev => clickHandle(Number(ev.target.value))} />页
  48. </div>
  49. </div>
  50. )
  51. }
  52. export default Paging