index.tsx 4.3 KB

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