index.tsx 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. import React, { useCallback, useEffect, useMemo } from 'react'
  2. import styles from './index.module.scss'
  3. import { Table } from 'antd'
  4. import ImageLazy from '../ImageLazy'
  5. type Props = {
  6. yHeight?: number //设置表格的高度
  7. list: any //表格数据
  8. frontBtn?: any[]
  9. columnsTemp: any[][] //表格展示
  10. total?: number //总数
  11. pageNum?: number
  12. pageSize?: number
  13. pagingInfo?: any | boolean
  14. onChange?: (pageNum: number, pageSize: number) => void
  15. lastBtn?: any
  16. classKey?: string //一个组件多次使用的时候要传递,分别设置style
  17. // 表格简单的合并
  18. merge?: { type: string; num: number; loc: 'rowSpan' | 'colSpan' }
  19. // 定制化表头
  20. myTitle?: { name: string; Com: React.ReactNode }
  21. // 宽度设置
  22. widthSet?: any
  23. }
  24. function MyTable({
  25. yHeight,
  26. list,
  27. frontBtn = [],
  28. columnsTemp,
  29. total,
  30. pageNum = 1,
  31. pageSize = 10,
  32. pagingInfo = {
  33. showQuickJumper: true,
  34. position: ['bottomCenter'],
  35. showSizeChanger: true
  36. },
  37. onChange,
  38. lastBtn = [],
  39. classKey = '',
  40. merge,
  41. myTitle,
  42. widthSet
  43. }: Props) {
  44. useEffect(() => {
  45. const dom = document.querySelector(`.MyTable${classKey} .ant-table-body`) as HTMLDivElement
  46. if (dom && yHeight) dom.style.height = yHeight + 'px'
  47. }, [classKey, yHeight])
  48. // 页码变化
  49. const paginationChange = useCallback(
  50. () => (pageNum: number, pageSize: number) => {
  51. if (onChange) {
  52. onChange(pageNum, pageSize)
  53. }
  54. },
  55. [onChange]
  56. )
  57. const dataChangeFu = useCallback(
  58. (v: any) => {
  59. const nullTxt = '(空)'
  60. /**
  61. * index:序号
  62. * txt:正常数据
  63. * img:图片
  64. * txtChange:判断显示不同字段
  65. * text:文字比较多的情况
  66. */
  67. const obj = {
  68. index: (_: any, __: any, index: number) => index + 1 + (pageNum - 1) * pageSize,
  69. txt: (item: any) => item[v[2]] || nullTxt,
  70. img: (item: any) => (
  71. <div className='tableImgAuto'>
  72. <ImageLazy
  73. width={60}
  74. height={60}
  75. src={item.thumb || item.thumbPc}
  76. srcBig={item.thumbPc || item.thumb}
  77. />
  78. </div>
  79. ),
  80. txtChange: (item: any) => Reflect.get(v[3], item[v[2]]) || v[4] || nullTxt,
  81. text: (item: any) =>
  82. item[v[2]] ? (
  83. item[v[2]].length >= v[3] ? (
  84. <span style={{ cursor: 'pointer' }} title={item[v[2]]}>
  85. {item[v[2]].substring(0, v[3]) + '...'}
  86. </span>
  87. ) : (
  88. item[v[2]]
  89. )
  90. ) : (
  91. nullTxt
  92. )
  93. }
  94. return Reflect.get(obj, v[0])
  95. },
  96. [pageNum, pageSize]
  97. )
  98. const columns = useMemo(() => {
  99. const arr: any = columnsTemp.map((v: any) => ({
  100. title: myTitle && v.includes(myTitle.name) ? myTitle.Com : v[1],
  101. render: dataChangeFu(v),
  102. width: widthSet && Reflect.get(widthSet, v[2]) ? Reflect.get(widthSet, v[2]) : 'auto',
  103. onCell:
  104. merge && v.includes(merge.type)
  105. ? // {rowSpan:3}
  106. (item: any, index: number) => ({
  107. rowSpan: index === 0 ? merge.num : 0
  108. })
  109. : ''
  110. }))
  111. return arr
  112. }, [columnsTemp, dataChangeFu, merge, myTitle, widthSet])
  113. return (
  114. <Table
  115. className={`${styles.MyTable} MyTable${classKey}`}
  116. scroll={{ y: yHeight ? yHeight : '' }}
  117. dataSource={list}
  118. columns={[...frontBtn, ...columns, ...lastBtn]}
  119. rowKey='id'
  120. pagination={
  121. pagingInfo
  122. ? {
  123. ...pagingInfo,
  124. current: pageNum,
  125. pageSize: pageSize,
  126. total: total,
  127. onChange: paginationChange()
  128. }
  129. : false
  130. }
  131. />
  132. )
  133. }
  134. const MemoMyTable = React.memo(MyTable)
  135. export default MemoMyTable