import React, { ReactNode, useEffect, useRef, useState } from 'react' import { Table, Tag, message } from 'antd'; import { Excle } from '@/utils/Excle' import style from './index.less' import './index.less' import { Resizable } from 'react-resizable' import { SortOrder } from 'antd/lib/table/interface'; export interface DataType { key: React.Key; name: string; age: string; address: string; } const ResizableHeader = (props: { [x: string]: any; onResize: any; width: any }) => { const { onResize, width, ...restProps } = props; if (!width) { return } return } /** * https://ant-design.gitee.io/components/table-cn/#API */ interface Props { dataSource: any[], columns: any[], excle?: { fillName: string,//文件名称 filter?: string[]//需要排除的数据,输入数据key }, total?: number, current?: number, pageSize?: number, rowSelection?: any,//选择 onRow?: {//行操作事件 onClick?: (event?: any) => void, // 点击行 onDoubleClick?: (event?: any) => void, onContextMenu?: (event?: any) => void, onMouseEnter?: (event?: any) => void, // 鼠标移入行 onMouseLeave?: (event?: any) => void, } pageChange?: (page: number, pageSize?: number) => void, sizeChange?: (current: number, size?: number) => void, rowClassName?: string | ((record: any, index: any) => string),//样式 expandedRowRender?: any,//子table scroll?: { x?: number, y?: number }, summary?: (data: readonly any[]) => ReactNode, size?: 'small' | 'middle' | 'large', loading?: boolean, defaultPageSize?: 10 | 20 | 30 | 100, bordered?: boolean, columnWidth?: string | number onChange?: (pagination: any, filters: any, sorter: any) => void//服务端排序回调 pagination?: boolean, showHeader?: boolean, hideOnSinglePage?: boolean, className?: string, handelResize?: (columns: any) => void//当表头被拖动改变宽度时回调设置对应的本地保存 sortDirections?: SortOrder[], isShowTotal?: boolean, // 是否展示总计 myKey?: any,//自定义要用哪个值做key } function Tables(props: Props) { // //导出数据 let { columns, dataSource, excle, total, handelResize, columnWidth, rowSelection, onRow, isShowTotal = true, hideOnSinglePage, rowClassName, className, expandedRowRender, scroll, summary, showHeader, bordered, size = 'small', onChange, sortDirections, pagination, myKey, ...prop } = props let handleExcle = () => { if (dataSource.length < 1) { message.error('请先搜索再导出'); return } let thName: any = {}; let obj = columns; obj.forEach((item: any) => { thName[item.key] = item.title }) let fillName = excle?.fillName || '' let filter = excle?.filter || [] Excle(thName, dataSource, fillName, filter) } let ww = document.body.clientWidth < 415 // 拖动宽逻辑 const [cols, setCols] = useState(columns) const colsRef = useRef([]) const components = { header: { cell: ResizableHeader }, } useEffect(() => { setCols(columns) }, [columns]) const handleResize = (index: any) => (e: any, { size }: any) => { const nextColumns = [...cols] nextColumns[index] = { ...nextColumns[index], width: size.width } setCols(nextColumns) handelResize && handelResize(nextColumns) } colsRef.current = (cols || []).map((col: any, index: any) => ({ ...col, onHeaderCell: (column: any) => ({ width: column.width, onResize: handleResize(index) }) })) return
{ excle && 导出数据 } { onChange && onChange(pagination, filters, sorter) }} bordered={bordered ? bordered : false} dataSource={dataSource} showHeader={showHeader} scroll={scroll ? { ...scroll, scrollToFirstRowOnChange: true } : undefined} size={size} rowKey={(a: any) => { if (myKey) { return JSON.stringify(a[myKey]) } return (JSON.stringify(a?.id) || JSON.stringify(a?.key)) }} rowSelection={rowSelection ? rowSelection : undefined} onRow={record => { return { onClick: onRow?.onClick && onRow?.onClick.bind('', record) || undefined, } }} summary={summary} className={className} expandable={expandedRowRender ? { defaultExpandedRowKeys: ['0'], expandRowByClick: false, columnWidth, expandedRowRender: (data) => { return expandedRowRender(data) } } : {}} pagination={ { total: total || 0,//总共多少条数据,服务器给,设置后分页自动计算页数 current: props.current,//当前页数,需state控制配合翻页 pageSize: props?.pageSize, defaultCurrent: 1,//默认初始的当前页数 defaultPageSize: props?.defaultPageSize || 20,//默认初始的每页条数 pageSizeOptions: ['10', '20', '30', '40', '50', '60', '70', '80', '90', '100'], showTotal: (total) => isShowTotal ? 总共{total}数据 : null, showSizeChanger: true, //手动开启条数筛选器,默认超过50条开启 // size:'small',//设置分页尺寸 //responsive:true,//当 size 未指定时,根据屏幕宽度自动调整尺寸 onChange: props.pageChange, //点击页码或条数筛选时触发获取当前页数和每页条数 onShowSizeChange: props.sizeChange,//点击条数筛选器触发 simple: ww ? true : false,//开启简单分页 hideOnSinglePage: hideOnSinglePage ? hideOnSinglePage : false,//只有一页数据隐藏分页 showLessItems: true } } {...prop} {...{ rowClassName: typeof rowClassName === 'string' ? (record: any) => { if (rowClassName && record[rowClassName as string] === 2) { return style.unfollow } if (rowClassName && !record[rowClassName as string]) { return style.unfollow } } : rowClassName }} /> } export default Tables