【Ant Design Table + React】表格列伸缩实现

需求背景:需要实现Antd Table 组件的列伸缩,宽度可以拖拽

在Antd 3.x 的版本中是保留的列伸缩的Demo例子的:
在这里插入图片描述
借助 react-resizable 可以实现伸缩列。

# npm 安装
npm install react-resizable --save# yarn 安装
yarn add react-resizable

参考官方的Demo,封装一个ResizableTable组件:

import { Table } from 'antd';
import type { ColumnsType } from 'antd/lib/table';
import { useEffect,useState } from 'react';
import { Resizable } from 'react-resizable';
import styles from './resizableTable.less';/*** 处理松开鼠标还会拖动的问题* 参考思路:在点击拖动时,使用浏览器API Selection.removeAllRanges 清空原本误选的文本。*/
const clearSelection = () => {if (window.getSelection) {const selection = window.getSelection();if (selection) {if (selection.empty) {// Chromeselection.empty();} else if (selection.removeAllRanges) {// Firefoxselection.removeAllRanges();}}} else if (document.selection && document.selection.empty) {// IEdocument.selection.empty();}
};export const ResizableTitle = (props: any) => {const { onResize, width, minWidth, maxWidth, ...restProps } = props;// 没有原始宽度的列,不支持伸缩;会出现从自适应宽度一下子跳到拖动位置;也可以自行增加参数,如 disableResizeif (!width) {return <th {...restProps} />;}const minConstraints: [number, number] | undefined = minWidth? [minWidth, -Infinity]: undefined;const maxConstraints: [number, number] | undefined = maxWidth? [maxWidth, +Infinity]: undefined;return (<Resizablewidth={width}height={0} // 不需要调整高度,设为 0minConstraints={minConstraints}maxConstraints={maxConstraints}handle={<spanclassName="react-resizable-handle"onClick={(e) => {// 阻止冒泡e.stopPropagation();}}/>}onResize={onResize}draggableOpts={{enableUserSelectHack: false,onMouseDown: () => {// 处理在 Windows Chrome 和 Edge 松开鼠标依然能拖动clearSelection();},}}><th {...restProps} /></Resizable>);
};interface DataType {name: {first: string;last: string;};gender: string;email: string;login: {uuid: string;};
}
const columnsData: ColumnsType<DataType> = [{title: 'Name',dataIndex: 'name',sorter: true,render: (name) => `${name.first} ${name.last}`,width: '20%',},{title: 'Gender',dataIndex: 'gender',filters: [{ text: 'Male', value: 'male' },{ text: 'Female', value: 'female' },],width: '20%',},{title: 'Email',dataIndex: 'email',},
];const ResizableTable = () => {const curColumns: ColumnsType<DataType> = columnsData; // 可以是通过props 传进来的,这里用常量做例子const [column, setColumns] = useState<ColumnsType<any>>([]);// 拖动时更新表格列const handleResize = (index: number) => {return (_e: any, { size }: any) => {const newCols = [...column];newCols[index] = {...newCols[index],width: size.width || '100%',};setColumns(newCols);};};const mergeColumns = column.map((col, index) => ({...col,onHeaderCell: (column: any) => ({width: column.width ?? 100,// 每一列增加 minWidth, maxWidth 作为 ResizableTitle 的 propsminWidth: 50,// maxWidth: 1000,onResize: handleResize(index),}),}));useEffect(() => {console.log('变化', curColumns);if (curColumns) {setColumns(curColumns);}}, [curColumns]);return (<div className={styles.resizeTable}><Tablesize="small"components={{header: {cell: ResizableTitle,},}}columns={mergeColumns}dataSource={[]}/></div>);
};
export default ResizableTable;

必须引入样式 resizableTable.less

.resizeTable {:global {.react-resizable {position: relative;background-clip: padding-box;}.react-resizable-handle {position: absolute;width: 10px;height: 100%;bottom: 0;right: -5px;cursor: col-resize;background-image: none;z-index: 1;}.ant-table-filter-column,.ant-table-column-sorters {display: flex;/* co1umn 从上到下 */align-items: center;/* center代表水平方向 */justify-content: space-around;min-width: 70px;}.ant-table-thead>tr>th .ant-table-column-sorter {// margin-top: -21px;display: table-cell;vertical-align: middle;}}
}

必须保持一列宽度不设置,自适应。否则效果不对。

但我用这个插件后还是不太 OK,总有一些bug,比如如果拖动了不设置宽的列,整个伸缩就会变形;而且如果列数很多的情况下,自适应列效果不理想。

所有这个方案能用但不是很好用。
可以参考:https://juejin.cn/post/7182423243553734717


后续解决方案:

在查阅资料时,看到有个大佬封装好了一个伸缩hook use-antd-resizable-header,使用起来方便简单。遂引入项目。
https://github.com/hemengke1997/use-antd-resizable-header

pnpm add @minko-fe/use-antd-resizable-header

在这里插入图片描述
引入封装组件示例:

import { Table } from 'antd';
import { useAntdResizableHeader } from '@minko-fe/use-antd-resizable-header';
import '@minko-fe/use-antd-resizable-header/dist/style.css';/** 自定义函数 */
import { isLocaleEn } from '@/utils/commont_rely';/** type 类申明 */
import type { IProps } from '..'; // 自己封装的表格propsType, 仅作参考/** 自定义样式 */
import './style.less';/** ===================================* @name: 可伸缩列的表格组件* 注意:至少一列不能拖动(width 不设置即可),请保持至少一列的宽自适应*======================================*/interface ResizableTableProps extends IProps {// 特殊配置defaultWidth?: number; // 设置不能拖动列的最小宽度 默认 120minConstraints?: number; // 拖动最小宽度 默认 60maxConstraints?: number; // 拖动最大宽度 默认800 可设置无穷
}export default function ResizableTable(props: ResizableTableProps) {const { title, defaultWidth, minConstraints, maxConstraints } = props;const columns = props?.columns || []; // 组件传过来的columsconst { components, resizableColumns, tableWidth } = useAntdResizableHeader({columns,defaultWidth: defaultWidth || 120,minConstraints: minConstraints || 60,maxConstraints: maxConstraints || 800,});return (<div className="resizableTable"><Tabletitle={title}size="small"dataSource={data} // 组件传过来的datacolumns={resizableColumns}components={components}scroll={{ x: tableWidth }}/></div>);
}

使用方便,效果理想,推荐使用这个插件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/165547.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Simple JWT提供认证服务(详细介绍access_token和refresh_token的使用)

文章目录 基本概念JSON Web Token&#xff08;JWT&#xff09;Simple JWT 主要用途Cookie、Session、Token的区别CookieSessionToken Token续签access_token 和 refresh_token时效设置 基本概念 JSON Web Token&#xff08;JWT&#xff09; JSON Web Token&#xff08;JWT&am…

Python 自动化测试框架unittest与pytest的区别!

引言 这篇文章主要讲unittest与pytest的区别&#xff0c;pytest相对unittest而言&#xff0c;代码简洁&#xff0c;使用便捷灵活&#xff0c;并且插件很丰富。 Unittest vs Pytest 主要从用例编写规则、用例的前置和后置、参数化、断言、用例执行、失败重运行和报告这几个方面…

从手动操作到自动化管理,如何实现企业身份业务全面自动化?

在数字化时代&#xff0c;身份管理已经成为了企业和组织不可或缺的一部分&#xff0c;企业对于管理员工、客户和合作伙伴的身份信息和访问权限的需求变得愈发复杂。身份管理不仅仅是一项必要的任务&#xff0c;更是确保业务流畅运营和数据安全的关键因素。然而&#xff0c;传统…

ESP32C3 LuatOS TM1650②动态显示累加整数

--注意:因使用了sys.wait()所有api需要在协程中使用 -- 用法实例 PROJECT "ESP32C3_TM1650" VERSION "1.0.0" _G.sys require("sys") local tm1650 require "tm1650"-- 拆分整数&#xff0c;并把最低位数存放在数组最大索引处 loc…

冒泡排序、插入排序、选择排序和快速排序的原理

下面是对冒泡排序、插入排序、选择排序和快速排序的原理的简要解释&#xff1a; 冒泡排序&#xff08;Bubble Sort&#xff09;&#xff1a;冒泡排序是一种简单的排序算法。它通过多次迭代比较相邻的元素&#xff0c;并交换它们的位置&#xff0c;使得较大&#xff08;或较小&…

中间件安全-CVE复现IISApacheTomcatNginx漏洞复现

目录 中间件安全&CVE复现&IIS&Apache&Tomcat&Nginx漏洞复现中间件-IIS安全问题中间件-Nginx安全问题漏洞复现Nginx 解析漏洞复现Nginx 文件名逻辑漏洞 中间件-Apache-RCE&目录遍历&文件解析等安全问题漏洞复现漏洞复现CVE_2021_42013 RCE代码执行&…

python二次开发Solidworks:读取立方体的高度

在SW中新建一个零件文档&#xff0c;建立一个立方体&#xff0c;长度和宽度自定义&#xff0c;高度100mm&#xff0c;下面通过python实现读取该立方体的高度&#xff1a; import win32com.client as win32 import pythoncomswApp win32.Dispatch(sldworks.application) swApp.…

kafka、zookeeper、flink测试环境、docker

1、kafka环境单点 根据官网版本说明(3.6.0)发布&#xff0c;zookeeper依旧在使用状态&#xff0c;预期在4.0.0大版本的时候彻底抛弃zookeeper使用KRaft(Apache Kafka)官方并给出了zk迁移KR的文档 2、使用docker启动单点kafka 1、首先将kafka启动命令&#xff0c;存储为.servi…

选择最佳的项目管理工具:推荐哪一个?

项目管理工具推荐哪个&#xff1f;Zoho Projects项目管理工具为各类团队提供卓越的项目管理解决方案。 1、全面管理各类团队项目 Zoho Projects是一款全面的项目管理工具&#xff0c;具备简化工作流程和提高团队生产力的功能。无论是软件开发与DevOps&#xff0c;还是人力资源与…

Elasticsearch学习笔记

1.核心概念 bucket: 一个数据分组&#xff08;类似于sql group by以后的数据&#xff09;metric&#xff1a;对bucket执行的某种聚合分析的操作&#xff0c;比如说求平均值&#xff0c;最大值&#xff0c;最小值。一些系列的统计方法(类似 select count(1) MAX MIN AVG) 请…

后台交互-首页->与后台数据进行交互,wsx的使用

与后台数据进行交互wsx的使用 1.与后台数据进行交互 // index.js // 获取应用实例 const app getApp() const apirequire("../../config/app.js") const utilrequire("../../utils/util.js") Page({data: {imgSrcs:[{"img": "https://cd…

三辊闸机的应用领域和特点

三辊闸机是一种常用于门禁控制的设备&#xff0c;它具有以下应用和优点&#xff1a; 应用&#xff1a; 门禁控制&#xff1a;三辊闸机可以用于各种场合的门禁控制&#xff0c;如小区、写字楼、学校、医院等。考勤管理&#xff1a;三辊闸机可以与考勤系统集成&#xff0c;用于…

【数据结构】算法的时间复杂度和空间复杂度

目录 1. 什么是数据结构&#xff1f; 2.什么是算法&#xff1f; 3.算法效率 4.时间复杂度 4.1时间复杂度的概念 4.2大O的渐进表示法 4.3常见时间复杂度计算举例 4.3.1冒泡排序&#xff1a; 4.3.2二分查找&#xff1a; 4.3.3递归阶乘 4.3.4斐波那契数列 4.4例题&…

Elasticsearch实践:ELK+Kafka+Beats对日志收集平台的实现

可以在短时间内搜索和分析大量数据。 Elasticsearch 不仅仅是一个全文搜索引擎&#xff0c;它还提供了分布式的多用户能力&#xff0c;实时的分析&#xff0c;以及对复杂搜索语句的处理能力&#xff0c;使其在众多场景下&#xff0c;如企业搜索&#xff0c;日志和事件数据分析等…

stable diffusion和midjourney哪个好

midjourney和stable diffusion哪个好&#xff1f;midjourney和stable diffusion的区别&#xff1f;那么今天就从这2款软件入手&#xff0c;来探索一下他们的功能的各项区别吧&#xff0c;让你选择更适合你的一款ai软件。 截至目前&#xff0c;我们目睹了生成式人工智能工具的在…

复杂的菱形继承及菱形虚拟继承(详解)

复杂的菱形继承及菱形虚拟继承 复杂的菱形继承及菱形虚拟继承虚拟继承解决数据冗余和二义性的原理笔试面试题 复杂的菱形继承及菱形虚拟继承 单继承&#xff1a;一个子类只有一个直接父类时称这个继承关系为单继承 多继承&#xff1a;一个子类有两个或以上直接父类时称这个继…

Leetcode—2525.根据规则将箱子分类【简单】

2023每日刷题&#xff08;五&#xff09; Leetcode—2525.根据规则将箱子分类 实现代码 char * categorizeBox(int length, int width, int height, int mass){long long volume;long long len (long long)length;long long wid (long long)width;long long heig (long lo…

ssrf漏洞学习

目录 ssrf漏洞 相关函数 相关协议 file协议 dict协议 gopher协议 ctfshow ssrf web351 web352 web353 web354过滤01 web355五位长度 web356 三位长度 web357 DNS重定向 web358 正则 ssrf漏洞 SSRF&#xff08;Server-Side Request Forgery&#xff0c;服务器端请…

搭建伪分布式Hadoop

文章目录 一、Hadoop部署模式&#xff08;一&#xff09;独立模式&#xff08;二&#xff09;伪分布式模式&#xff08;三&#xff09;完全分布式模式 二、搭建伪分布式Hadoop&#xff08;一&#xff09;登录虚拟机&#xff08;二&#xff09;上传安装包&#xff08;三&#xf…

(矩阵) 289. 生命游戏 ——【Leetcode每日一题】

❓ 289. 生命游戏 难度&#xff1a;中等 根据 百度百科 &#xff0c; 生命游戏 &#xff0c;简称为 生命 &#xff0c;是英国数学家约翰何顿康威在 1970 年发明的细胞自动机。 给定一个包含 m n 个格子的面板&#xff0c;每一个格子都可以看成是一个细胞。每个细胞都具有一…