ant Table伸缩列组件

resizeTable.tsx
import React, { useState, useEffect } from 'react';
import {Table} from 'antd';
import {ProTable,EditableProTable} from '@ant-design/pro-components';
import { Resizable } from 'react-resizable';
import './resizeTable.less';
/**
 * 20230811 表头伸缩组件 (wsf)
 * props:传递参数添加 => tableType(Table、ProTable、EditableProTable)
 */
const components = {
    header: {
        cell: (props) => {
            const { onResize, width, ...restProps } = props;
            if (!width) {
                return <th {...restProps} />;
            }
            let resizing = true;
            return (
                <Resizable width={width} height={0} onResize={onResize}
                   onResizeStart={() => (resizing = true)}
                   onResizeStop={() => {
                       setTimeout(() => {
                           resizing = false;
                       });
                   }}
                >
                    <th {...restProps} />
                </Resizable>
            );
        },
    },
};

function modifyDeepTreeNodeValueFn({ colList, modifyObj, indexes }) {
    let colList_ = colList;
    let tempArr = [...colList_];
    function modifyDeepTreeNodeValue(indexes) {
        const indexLen = indexes.length;
        for (let i = 0; i < indexLen; i++) {
            const index_ = indexes[i];
            if (i < indexLen - 1) {
                const targetArr = tempArr[index_];
                if (!targetArr) {
                    break;
                }
                tempArr = (tempArr[index_] && tempArr[index_].children) || [];
            } else {
                const target = tempArr[index_];
                if (!target) {
                    break;
                }
                tempArr[index_] = {
                    ...target,
                    ...modifyObj,
                };
            }
        }
    }
    if (indexes.length === 1) {
        const index_ = indexes[0];
        colList_[index_] = {
            ...colList_[index_],
            ...modifyObj,
        };
        return colList_;
    }
    modifyDeepTreeNodeValue(indexes);
    return colList_;
}

export default function ResizeTable(props) {
    // console.log("调用表头伸缩组件<ResizeTable>",props)
    const [selfColumns, setSelfColumns] = useState([]);
    const { columns } = props;
    const handleResize = (indexes) => {
        return (e, d) => {
            const { width } = d.size;
            const nextColumns = modifyDeepTreeNodeValueFn({
                colList: columns,
                modifyObj: { width },
                indexes,
            });
            setSelfColumns([...nextColumns]);
        };
    };
    const setColumnsResizeable = (cols, indexes = []) => {
        return [...cols].map((colItem, index) => {
            const { children, width } = colItem;
            const currentIndexes = [...indexes, index];
            const children_ = Array.isArray(children)
                ? setColumnsResizeable(children, currentIndexes)
                : null;
            return {
                ...colItem,
                onHeaderCell: () => ({
                    width,
                    onResize: handleResize(currentIndexes),
                }),
                children: children_,
                indexes: currentIndexes,
            };
        });
    };
    const columns_ = setColumnsResizeable(columns);
    /*
        说明:根据传递属性进行返回判断
     */
    let _tableType = props == null || props == void(0) || props.tableType == null || props.tableType == void(0)
        ? 'protable' : props.tableType.toString().toLowerCase()
    let newProps = {...props};
    newProps.columns = columns_;
    if(_tableType == 'table' ) {
        return <Table {...newProps}  components={components} />;
    } else if( _tableType == 'protable') {
        return <ProTable {...newProps}  components={components} />;
    } else if( _tableType == 'editableprotable') {
        return <EditableProTable {...newProps} components={components} />;
    }
}

resizeTable.less

.react-resizable {
  position: relative;
  background-clip: padding-box;
}

.react-resizable-handle {
  position: absolute;
  width: 10px;
  height: 100%;
  bottom: 0;
  right: -5px;
  cursor: col-resize;
  z-index: 1;
}

 

表格可伸缩组件使用说明

安装命令:npm i --save react-resizable

说明:

  1、组件包含三种样式返回:TableProTableEditableProTable

  2、组件调用方式:

    import ResizeTable from '@/pages/publicComponents/resizeTable/resizeTable';

    Table =(变为)=> ResizeTable tableType="Table"

    ProTable =(变为)=> ResizeTable tableType="ProTable"

    EditableProTable  =(变为)=> ResizeTable tableType="EditableProTable"

 

posted @ 2023-08-18 11:21  糖炒栗  阅读(154)  评论(0编辑  收藏  举报