react+antd Table实现列拖拽,列拉宽,自定义拉宽列

主要插件Resizable,dnd-kit/core,dnd-kit/sortable,dnd-kit/modifiers

其中官网有列拖拽,主要结合Resizable 实现列拉宽,isResizingRef 很重要防止拖拽相互影响

1.修改TableHeaderCell

   const isResizingRef = useRef(false);const TableHeaderCell = props => {const { onResize, width, datagridRef, stretchRef, ...restProps } = props;// 拖拽const dragState = useContext(DragIndexContext);const { attributes, listeners, setNodeRef, isDragging } = useSortable({ id: props.id });const isFixed = props['data-fixed'] && !isResizingRef.current;const style = {...props.style,...(isFixed ? {} : { cursor: 'move' }),...(isDragging ? { position: 'relative', userSelect: 'none' } : {}),...dragActiveStyle(dragState, props.id),};const [offset, setOffset] = useState(0);if (!width) {return <th {...restProps} />;}// 获取要减去的父元素距离左侧的宽度const getPosition = (element) => {let actualLeft = element.offsetLeft;let current = element.offsetParent;while (current !== null) {//当它上面有元素时就继续执行actualLeft += current.offsetLeft;current = current.offsetParent; //继续找父元素}return { x: actualLeft };};// 开始拖拽组织冒泡const handleResizeStart = (e, { size }) => {// console.log(233,e);e.stopPropagation()e.preventDefault()isResizingRef.current = true; // ✅ 开始 resize}const handleResize = (e, { size }) => {// 这里只更新偏移量,数据列表其实并没有伸缩isResizingRef.current = true; // ✅ 开始 resizesetOffset(size.width - width);let parentNodeX = getPosition(datagridRef.current).x;let stretchDom = stretchRef.current;stretchDom.style.display = 'block';stretchDom.style.left = `${e.clientX - parentNodeX + 2}px`;};const handleResizeStop = (...arg) => {// 拖拽结束以后偏移量归零isResizingRef.current = false; // ✅ 结束 resizesetOffset(0);let stretchDom = stretchRef.current;stretchDom.style.display = 'none';stretchDom.style.left = `0px`;// props传进来的事件,在外部是列数据中的onHeaderCell方法提供的事件// console.log(...arg, "arg9");onResize(...arg);};const _ResizableSpan = (<divclassName="react-resizable-handle"// 拖拽层偏移style={{ transform: `translateX(${offset}px)` }}onClick={(e) => {// 取消冒泡,不取消貌似容易触发排序事件e.stopPropagation();e.preventDefault();}}/>);// console.log(isResizingRef.current, "isResizingRef.current");return (<Resizablewidth={width + offset}handle={_ResizableSpan}height={0}// 拖拽事件实时更新onResize={handleResize}// 拖拽结束更新onResizeStop={handleResizeStop}draggableOpts={{ enableUserSelectHack: false }}onResizeStart={handleResizeStart}><th {...restProps}ref={isFixed && !isResizingRef.current ? undefined : setNodeRef}style={style}{...(isFixed && !isResizingRef.current ? {} : attributes)}{...(isFixed && !isResizingRef.current ? {} : listeners)} /></Resizable>);};

2.handleResize 拉宽后处理

    // 处理拖拽const handleResize =(key) =>(e, { size }) => {if (size.width < 140) {size.width = 140;}console.log(key, size.width, 9000);setColumns(prev => {const next = prev.map(col => {if (col.dataIndex === key) {return { ...col, width: size.width };}return col;});columRef.current = next;return next;});};

总结来说,样式丑点,目前预测还会碰到未知bug,拉宽的同时会出现回弹之类的bug,慢慢改吧

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

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

相关文章

光照解耦和重照明

项目地址&#xff1a; GitHub - NJU-3DV/Relightable3DGaussian&#xff1a; [ECCV2024] 可重新照明的 3D 高斯&#xff1a;使用 BRDF 分解和光线追踪的实时点云重新照明 可优化参数 gaussians.training_setup(opt) if is_pbr:&#xff1a; direct_env_light.training_setup…

Kafka 运维与调优篇:构建高可用生产环境的实战指南

&#x1f6e0;️ Kafka 运维与调优篇&#xff1a;构建高可用生产环境的实战指南 导语&#xff1a;在生产环境中&#xff0c;Kafka集群的稳定运行和高性能表现是业务成功的关键。本篇将深入探讨Kafka运维与调优的核心技术&#xff0c;从监控管理到性能优化&#xff0c;再到故障排…

AR 地产互动沙盘:为地产沙盘带来变革​

在科技飞速发展的今天&#xff0c;AR&#xff08;增强现实&#xff09;技术应运而生&#xff0c;为解决传统地产沙盘的困境提供了全新的思路和方法。AR 技术&#xff0c;简单来说&#xff0c;是一种将计算机生成的虚拟信息与真实环境相融合的技术。它通过摄像头、传感器等设备获…

端到端自动驾驶系统关键技术

一、感知决策一体化模型架构 单一神经网络整合全流程 端到端神经网络能够直接将传感器输入映射为控制输出&#xff0c;消除了传统模块化架构中感知、规划、控制等独立模块之间的割裂。传统架构中&#xff0c;感知模块负责识别环境信息&#xff0c;决策模块根据感知结果进行路…

Vue Vue-route (2)

Vue 渐进式JavaScript 框架 基于Vue2的学习笔记 - Vue-route重定向和声明式导航 目录 Vue-route路由 重定向 首页默认访问 不存在匹配 声明式导航 路由原理 使用示例 自定义class类 Tag设置 版本4路由 改变 示例 总结 Vue-route路由 重定向 首页默认访问 希望访…

Mabl 基于云端的智能化自动化测试平台

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 </

Linux/Dog

Dog Enumeration nmap 第一次扫描发现系统对外开放了22、80端口&#xff0c;端口详细信息如下 ┌──(kali㉿kali)-[~/Desktop/vegetable/HTB] └─$ nmap -sC -sV -p 22,80 -oA nmap 10.10.11.58 Starting Nmap 7.95 ( https://nmap.org ) at 2025-06-26 03:36 EDT Nmap s…

青少年编程与数学 02-022 专业应用软件简介 01 设计与创意类软件:Adobe Creative Cloud

青少年编程与数学 02-022 专业应用软件简介 01 设计与创意类软件&#xff1a;Adobe Creative Cloud **一、Adobe公司介绍**&#xff08;一&#xff09;Adobe的创立与早期发展&#xff08;二&#xff09;Adobe的市场地位与影响力&#xff08;三&#xff09;Adobe的创新文化 **二…

【亚马逊防关联攻略】多店铺运营如何做好环境隔离?

在亚马逊跨境电商中&#xff0c;多店运营的最大风险是账号关联。亚马逊规定&#xff0c;同一卖家在同一站点只能拥有一个店铺。平台会通过多种方式追踪注册信息、设备和网络环境等&#xff0c;如果发现关联因素&#xff0c;所有关联账号可能被批量封禁&#xff0c;这会导致资金…

She‘s Coming !

#好书推荐《一本书讲透汽车功能安全&#xff1a;标准详解与应用实践》 #功能安全应用指南 #功能安全实践参考宝典 Finally, shes coming ! 她来得有点晚&#xff0c;但 “好饭不怕晚”。 她就是刚出炉的新书《一本书讲透汽车功能安全&#xff1a;标准详解与应用实践》 京东…

如何用废弃电脑变成服务器搭建web网站(公网访问零成本)

文章目录 &#x1f4bb; 如何用废弃电脑变成服务器搭建 Web 网站&#xff08;公网访问零成本&#xff09;一、背景与目标✅ 本文目标&#xff1a; 二、准备工作&#xff08;软硬件需求&#xff09;&#x1f9f1; 1. 硬件需求&#x1f9f0; 2. 软件环境准备 三、快速搭建一个 Fl…

〔从零搭建〕指标体系平台部署指南

&#x1f525;&#x1f525; AllData大数据产品是可定义数据中台&#xff0c;以数据平台为底座&#xff0c;以数据中台为桥梁&#xff0c;以机器学习平台为中层框架&#xff0c;以大模型应用为上游产品&#xff0c;提供全链路数字化解决方案。 ✨杭州奥零数据科技官网&#xf…

Vue3 中watch和computed

Vue 3 中 computed 与 watch 深度解析 在 Vue 3 组合中&#xff0c;响应式工具的类型安全使用至关重要。以下是详细说明 一、watch 侦听器 1. 基础类型监听 <template><div>实际参数1{{count}}</div><div><button click"count">点…

.NET测试工具Parasoft dotTEST:全兼容RMS的测试解决方案

随着项目规模扩大&#xff0c;需求管理变得复杂&#xff0c;如何高效追溯需求与测试的关联性成为一大挑战。Parasoft dotTEST 提供了一套强大的需求追溯解决方案&#xff0c;不仅能自动关联单元测试结果与需求&#xff0c;还能兼容几乎所有需求管理系统&#xff08;RMS&#xf…

基于Jeecgboot3.8.1的vue3版本前后端分离的flowable流程管理平台

初步迁移完成了基于jeecgboot3.8.1的vue3版本的前后端流程管理平台,基于flowable6.8.0,同时支持bpmn流程设计器与仿钉钉流程设计器。 功能类似于3.6.3,但增加了一些以下功能: 1、支持多租户 2、支持并行网关的任意跳转、退回与驳回 3、流程表达式 这里流程表达式定义四…

IP 限流 vs. URI 限流

背景&#xff1a; 昨天调程序的时候遇到了一个 BUG&#xff0c;前端无法将文件正确传给后端&#xff0c;后端报错 EOFException&#xff08;EOF 代表 End Of File&#xff09;就是在程序尝试从一个数据流中读取数据时&#xff0c;发现已经到达了数据流的末尾&#xff0c;但它却…

2025年Java常见面试题(持续更新)

数据库事务特性。原子性、一致性、隔离性、持久性如何防止SQL注入&#xff1a;使用#不要使用$符号&#xff1b;对所有的入参做校验&#xff1b;使用存储过程&#xff1b;执行预处理语句和参数化查询&#xff1b;最低权限原则&#xff1b;微服务拆分的原则&#xff1a;微服务的拆…

Spring AI ——在springboot应用中实现基本聊天功能(ChatModel)

文章目录 前言项目版本依赖引入配置key信息编写测试接口注入ChatModel并普通返回注入ChatModel并流式返回自定义模型对象并直接返回总结前言 在Spring AI 中,CchatClient 是一个所有大模型通用性的调用方式,对绝大多数大模型的功能点都具备封装和见解调用性。 但这一点在部…

78、系统工程生命周期阶段及方法

一、系统工程生命周期的七大阶段 系统工程生命周期涵盖从概念萌芽到系统退役的全过程&#xff0c;通常分为以下七个阶段&#xff0c;每个阶段具有明确目标与核心任务&#xff1a; 1.探索性研究阶段 目标&#xff1a;识别利益相关者需求&#xff0c;探索技术可行性。任务&…

二十九、【用户体验篇】个人中心:用户资料展示与密码修改

二十九、【用户体验篇】个人中心:用户资料展示与密码修改 前言准备工作第一部分:后端实现 - 个人中心 API1. 修改 `UserDetailSerializer` 以支持密码修改2. 在 `api/views.py` 中添加 `UserMeView` 和 `PasswordChangeView`3. 注册个人中心相关 API 路由4. 后端初步测试第二…