index.tsx 4.3 KB

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