index.tsx 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. /*
  2. * @Author: your name
  3. * @Date: 2021-12-24 09:43:04
  4. * @LastEditTime: 2022-06-21 15:01:04
  5. * @LastEditors: code4eat awesomedema@gmail.com
  6. * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
  7. * @FilePath: /MedicalWisdomCheckSys/src/components/MccsLightTable/index.tsx
  8. */
  9. import React, { useEffect, useState } from 'react';
  10. import type { MccsLightTableTypes } from './typings';
  11. import { Empty, Tooltip, Pagination } from 'antd';
  12. import './style.less';
  13. const MccsLightTable: React.FC<{
  14. columns: MccsLightTableTypes.MccsLightTableColumn[],
  15. data?: [],
  16. request?: (current: number, pageSize: number) => Promise<{
  17. current: number,
  18. list: any[],
  19. pageSize: number,
  20. totalCount: number,
  21. }>,
  22. renderRow?: (data: any) => React.Component<any>,
  23. }> = props => {
  24. const {
  25. columns,
  26. renderRow,
  27. request
  28. } = props
  29. const [dataList, setDataList] = useState<any[]>([]);
  30. const [renderColumns, seRenderColumns] = useState<MccsLightTableTypes.MccsLightTableColumn[]>([]);
  31. const [pageData, setPageData] = useState<{ pageSize: number, current: number }>({ pageSize: 10, current: 1 });
  32. const [total, setTotal] = useState(0); // 数据总数
  33. const getData = async (current: number, size: number) => {
  34. if (!request) return [];
  35. const data = await request(current, size);
  36. if (data) {
  37. const { list = [], totalCount } = data;
  38. setTotal(totalCount);
  39. setDataList(list);
  40. } else {
  41. return []
  42. }
  43. }
  44. const onShowSizeChangeHandle = (current: number, size: number) => {
  45. setPageData({ ...pageData, current: current + 1, pageSize: size });
  46. getData(current + 1, size); // current 默认从0开始
  47. }
  48. const pageChangeHandle = (page: number, pageSize: number | undefined) => {
  49. // 分页页码变化时
  50. getData(page, pageSize || 10);
  51. }
  52. useEffect(() => {
  53. const _columns = columns.filter(item => !item.hideInTable);
  54. const hasSetWidColumns = _columns.filter(item => item.width);
  55. const needCountWidCloumnsNum = _columns.length - hasSetWidColumns.length;
  56. const widArray = hasSetWidColumns.map(item => item.width)
  57. const CountableWid = widArray.reduce((prev, curr) => (prev || 0) + (curr || 0), 0);
  58. // 初始化cell长度
  59. const a = _columns.map((item, index) => {
  60. if (index == 0) {
  61. // console.log({...item,width:(100-(CountableWid?CountableWid:0))/needCountWidCloumnsNum});
  62. return item.width ? item : { ...item, width: (100 - (CountableWid || 0)) / needCountWidCloumnsNum }
  63. }
  64. const beichushu = 100 - (CountableWid || 0);
  65. const chushu = needCountWidCloumnsNum;
  66. return item.width ? item : { ...item, width: (beichushu / chushu) }
  67. });
  68. seRenderColumns(a);
  69. }, [columns]);
  70. useEffect(() => {
  71. getData(pageData.current, pageData.pageSize);
  72. // setDataList([
  73. // {
  74. // gradeLevel:'A',
  75. // pfmDataDirectoryList:[
  76. // {
  77. // id:0,
  78. // numStr:'1.1.1.1',
  79. // directory:'directory',
  80. // accountType:'accountType',
  81. // accountStatus:0
  82. // },
  83. // {
  84. // id:3,
  85. // numStr:'1.1.1.1',
  86. // directory:'directory',
  87. // accountType:'accountType',
  88. // accountStatus:0
  89. // }
  90. // ]
  91. // },
  92. // {
  93. // gradeLevel:'B',
  94. // pfmDataDirectoryList:[
  95. // {
  96. // id:2,
  97. // numStr:'1.1.1.1',
  98. // directory:'directory',
  99. // accountType:'accountType',
  100. // accountStatus:0
  101. // }
  102. // ]
  103. // }
  104. // ]);
  105. }, []);
  106. // 自定义渲染表格内容
  107. const renderTableRow = (data: any) => {
  108. const { pfmDataDirectoryList: list, gradeLevel: grade } = data;
  109. const _cpcolumns = Object.assign([], renderColumns);
  110. _cpcolumns.splice(0, 1); // 剔除第一个
  111. const headWid = renderColumns[0] && renderColumns[0].width ? renderColumns[0].width : 0;
  112. return (
  113. <div className='list' >
  114. <div className='head' style={{ width: `${headWid}%` }}>{grade}</div>
  115. <div className='headRelaData' style={{ position: 'relative', left: `${headWid}%` }}>
  116. {
  117. (list).map((item: any, index: number) => {
  118. return (
  119. <div className='subList' key={index}>
  120. {
  121. _cpcolumns.map((v: any, k: any) => {
  122. let cellValue = item[v.key];
  123. // 自定义value结果
  124. if (v.render) {
  125. cellValue = v.render(item)
  126. }
  127. return (
  128. <div className='cell' key={k} style={{ width: `${v.width}%` }}>
  129. {
  130. item.valueType != 'option' ? (
  131. <Tooltip title={cellValue}>
  132. {cellValue}
  133. </Tooltip>
  134. ) : cellValue
  135. }
  136. </div>
  137. )
  138. })
  139. }
  140. </div>
  141. )
  142. })
  143. }
  144. </div>
  145. </div>
  146. )
  147. }
  148. return (
  149. <>
  150. <div className='mccsLighttable'>
  151. <div className='columns'>
  152. {
  153. renderColumns.map((item, index) => {
  154. return (
  155. <div key={index} className='columnBlock' style={{ width: `${item.width}%` }}>{item.title}</div>
  156. )
  157. })
  158. }
  159. </div>
  160. <div className='listWrap'>
  161. {dataList.length == 0 && <div className='empty'><Empty image={Empty.PRESENTED_IMAGE_SIMPLE} /></div>}
  162. {
  163. dataList.length > 0 && (
  164. <div className='listRow'>
  165. {
  166. dataList.map((item, index) => {
  167. return <React.Fragment key={index}>{renderTableRow(item)}</React.Fragment>
  168. })
  169. }
  170. </div>
  171. )
  172. }
  173. </div>
  174. </div>
  175. {
  176. request && (
  177. <div className='pagination'>
  178. <Pagination size="small"
  179. total={total}
  180. pageSize={pageData?.pageSize}
  181. showSizeChanger
  182. showQuickJumper
  183. onChange={(page, pageSize) => pageChangeHandle(page, pageSize)}
  184. onShowSizeChange={onShowSizeChangeHandle}
  185. />
  186. </div>
  187. )
  188. }
  189. </>
  190. )
  191. }
  192. export default MccsLightTable;