当前位置: 首页 > article >正文

ant-design 1.x版本表格头部拖拽、可拖拽列实现

表格列宽拖拽调整 — 问题总结版本“vue”: “2.6.11”,“vue-draggable-resizable”: “^2.3.0”,ant-design “”1.7.0“问题 1thDom为 null 导致getBoundingClientRect报错现象TypeError: Cannot read properties of null (reading getBoundingClientRect)根因onDrag中this.$set(draggingState, key, 0)触发 Vue 响应式重渲染。旧th销毁时 Vue 2 的ref回调用null清理闭包中的thDom之后dragstop事件拿到的就是null。解决用非响应式对象this._dragX作为拖拽手柄x的数据源onDrag期间不触发重渲染仅在onDragstop时通过$set提交最终值。外加if (!thDom) return防御。问题 2vue-draggable-resizabletransform 不对、拖拽错列、拖拽点乱跑现象拖拽 handle 的transform位置计算错误拖拽 A 列实际改变了 B 列的宽度。根因vue-draggable-resizable内部用transform: translateX()驱动拖拽但 CSS 把 handle 固定在right: -5pxleft: auto !important。组件内部的x定位和 CSS 定位坐标系冲突onDrag上报的x值不可信。解决移除vue-draggable-resizable依赖改用原生mousedown/mousemove/mouseup实现。Handle 仅靠 CSSright: -5px定位用鼠标位移增量delta计算新宽度彻底消除坐标系冲突。问题 3拖拽一次后位置不确定刷新 / 跳动现象拖拽过程中 handle 位置跳动释放后列宽不确定。根因同问题 1onDrag触发重渲染导致vue-draggable-resizable的xprop 被重置。解决随问题 2 一并解决原生事件方案不依赖任何响应式状态驱动拖拽位置。问题 4Scoped 样式不生效 — handlewidth: 0导致无法展示拖拽按钮现象.table-draggable-handle的width: 10px不生效handle 宽度为 0无法拖拽。其他样式如position: absolute正常。根因Vue 2 scoped 样式通过data-v-xxx属性匹配但h()在 render 函数中创建的元素不在 template 里不会自动添加 scope 属性。scoped 块line 814的width对 handle 不生效实际走的是非 scoped 块line 1040而该块之前缺少width。解决在非 scoped 样式块中补充width: 10px; top: 0; z-index: 1去掉vue-draggable-resizable时代的残留样式height: 100% !important; left: auto !important。问题 5替换 header cell 后排序失效现象拖拽列无法点击排序。根因ant-design-vue 传给components.header.cell的props是完整 VNode data 对象含class、on、style等顶层属性但代码把所有属性塞进了attrs{ attrs: { ...restProps } }导致on.click排序回调、class排序样式丢失。解决改为正确分层// 之前错误{attrs:{...restProps,width:col.width},class:resize-table-th}// 之后正确{...restProps,attrs:{...restProps.attrs,width:col.width},class:[resize-table-th,restProps.class]}问题 6拖拽结束后触发了排序现象拖拽过程中sorter图标变化释放鼠标后触发了排序请求。根因mousedown之后会触发click事件click冒泡到th被 ant-design-vue 的排序逻辑捕获。解决在拖拽 handle 上添加click: e { e.stopPropagation() }阻止click事件冒泡到th。问题 7depColumns树形结构只遍历了顶层现象depColumns是树形结构{ title: 基本情况, children: [...] }叶子节点才有dataIndex和width。但created初始化和resizeableTitle查找都只处理了顶层数组。解决两处都改为递归遍历created—walkColumns递归展开所有层级只收集叶子节点无children或children为空的列resizeableTitle—findColumn递归搜索children找到匹配的列问题 8需要按列控制可拖拽 最大/最小宽度需求只有标记了isDraggable: true的列才出现拖拽手柄支持minWidth/maxWidth限制拖拽范围解决判断条件从!col.width改为!col.isDraggableonMouseMove中用Math.min(Math.max(newWidth, col.minWidth || 50), col.maxWidth || Infinity)限制范围minWidth 默认 50px最终列配置示例{title:业务线,dataIndex:serviceLine,width:70,isDraggable:true,// 显式开启拖拽minWidth:100,// 最小宽度默认 50maxWidth:400,// 最大宽度默认无上限}最终列代码示例templatea-table bordered:columnscolumns:componentstableComponents:data-sourcedata/a-table/templatescriptimportVuefromvue;constcolumns[{title:Date,dataIndex:date,width:200,},{title:Amount,dataIndex:amount,width:100,},{title:Type,dataIndex:type,width:100,},{title:Note,dataIndex:note,width:100,},{title:Action,key:action,isDraggable:true,// 显式开启拖拽minWidth:100,// 最小宽度默认 50maxWidth:400,// 最大宽度默认无上限},];constdata[{key:0,date:2018-02-11,amount:120,type:income,note:transfer,},{key:1,date:2018-03-11,amount:243,type:income,note:transfer,},{key:2,date:2018-04-11,amount:98,type:income,note:transfer,},];exportdefault{name:App,data(){return{depColumns:data,};},computed:{tableComponents(){return{header:{cell:this.resizeableTitle,},}},},created(){constdraggingMap{}constwalkColumns(cols){cols.forEach(col{if(col.childrencol.children.length){walkColumns(col.children)}else{constkcol.dataIndex||col.keyif(col.width){draggingMap[k]col.width}}})}walkColumns(this.depColumns)this.draggingStatedraggingMap},methods:{resizeableTitle(h,props,children){letthDomnullconst{key,...restProps}propsconstfindColumn(cols,key){for(constcolofcols){if(col.childrencol.children.length){constfoundfindColumn(col.children,key)if(found)returnfound}else{constkcol.dataIndex||col.keyif(kkey)returncol}}returnnull}constcolfindColumn(this.depColumns,key)if(!col||!col.isDraggable){returnh(th,{...restProps},children)}letstartX0letstartWidth0constonMouseDowne{e.preventDefault()e.stopPropagation()startXe.pageX startWidththDom?thDom.getBoundingClientRect().width:col.widthconstonMouseMovee{constdeltae.pageX-startXconstnewWidthstartWidthdeltaconstmincol.minWidth||50constmaxcol.maxWidth||Infinitycol.widthMath.min(Math.max(newWidth,min),max)}constonMouseUp(){document.removeEventListener(mousemove,onMouseMove)document.removeEventListener(mouseup,onMouseUp)document.body.style.cursordocument.body.style.userSelectconstfinalWidththDom?thDom.getBoundingClientRect().width:col.widththis.$set(this.draggingState,key,finalWidth)col.widthfinalWidth}document.addEventListener(mousemove,onMouseMove)document.addEventListener(mouseup,onMouseUp)document.body.style.cursorcol-resizedocument.body.style.userSelectnone}consthandleElh(div,{class:table-draggable-handle,on:{mousedown:onMouseDown,click:e{e.stopPropagation()},},})returnh(th,{...restProps,attrs:{...restProps.attrs,width:col.width},class:[resize-table-th,restProps.class],ref:r{thDomr},},[...(Array.isArray(children)?children:[children]),handleEl,])},}};/scriptstyle langless.resize-table-th{position:relative;.table-draggable-handle{position:absolute;top:0;right:-5px;bottom:0;width:10px;z-index:1;cursor:col-resize;touch-action:none;}}/style

相关文章:

ant-design 1.x版本表格头部拖拽、可拖拽列实现

表格列宽拖拽调整 — 问题总结 版本 “vue”: “2.6.11”,“vue-draggable-resizable”: “^2.3.0”,"ant-design “:”1.7.0“ 问题 1:thDom 为 null 导致 getBoundingClientRect 报错 现象: TypeError: Cannot read properties of nul…...

深兰科技签约乌兹别克斯坦智慧城市项目,推动中国AI出海规模化

2026年5月11日,深兰人工智能科技(上海)股份有限公司与乌兹别克斯坦合作方在上海张江总部举行签约仪式。双方将围绕乌兹别克斯坦新塔什干新城(Yangi Toshkent)智慧城市建设展开合作,深兰科技通过控股乌兹别克项目公司,围绕智慧城市、智慧住宅、…...

SpringBoot项目快速集成Taotoken多模型API的完整教程

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 SpringBoot项目快速集成Taotoken多模型API的完整教程 对于使用SpringBoot框架的Java开发者而言,接入不同的大模型服务通…...

Harness Engineering:用“确定性“驾驭AI的“不确定性“

上一篇 SDD 系列收尾时,留了一句话:“如何驾驭 AI 来赋能整个软件开发周期,将是另外一个值得深入探讨的话题。” 到现在有将近一个月没更新!期间除了偷懒,五一跑高速添堵之外,主要的原因是这个问题没怎么想…...

FPGA异构计算与模块化SoM:赋能边缘智能与工业应用实战

1. 项目概述:一次行业深度交流的契机最近,我作为Enclustra团队的一员,有幸受邀参加了今年的嵌入式计算大会。这不仅仅是一次简单的行业聚会,更是一个观察技术风向、碰撞思想火花、探寻合作机会的绝佳窗口。对于所有深耕于嵌入式系…...

国产LDO CN86L028实战:解决图像传感器电源噪声,兼容BL8062

1. 项目概述与核心需求解析最近在折腾一个老式录像机的修复与升级项目,目标很明确:提升其图像采集的稳定性。这台设备在运行中,画面时不时会出现条纹干扰,声音里也夹杂着微弱的底噪,尤其是在电源波动较大的环境下&…...

AI 写作进入长篇记忆时代,AI让小说创作更可控

AI 写小说最常被讨论的问题,是写得快不快、文笔好不好。但对于真正写长篇的作者来说,还有一个更重要的问题:AI 记不记得住。 一部网文写到几十章、几百章后,人物关系会越来越复杂,伏笔会越来越多,世界观设…...

从零到一:UniApp CLI 实战入门与避坑指南

1. 为什么需要UniApp CLI? 第一次接触UniApp的开发者可能会疑惑:明明有HBuilderX这样完善的图形化工具,为什么还要学习CLI?这个问题我也曾经纠结过。经过多个项目的实战验证,我发现CLI在以下场景中优势明显&#xff1a…...

如何用DS4Windows让PS4手柄在PC上完美运行?3步解锁专业游戏体验

如何用DS4Windows让PS4手柄在PC上完美运行?3步解锁专业游戏体验 【免费下载链接】DS4Windows Like those other ds4tools, but sexier 项目地址: https://gitcode.com/gh_mirrors/ds/DS4Windows 你是否曾经想过在PC上使用心爱的PS4手柄玩游戏,却发…...

基于ARM核心板的工业无线示教器开发全流程解析

1. 项目概述:当工业机器人遇上“掌上大脑”在工业自动化领域,示教器是人与机器人交互的核心枢纽。传统的示教器,往往体积庞大、线缆缠绕、成本高昂,并且高度依赖特定的控制器硬件。作为一名长期混迹于工控和嵌入式开发一线的工程师…...

workbuddy 来解决 华南x99-4mf 设置avx2的bois信息的问题

baidu 抖音 都搜索不到 华南x99-4mf 设置avx2的bois信息 默认bois没有这个选项,用workbuddy 来解决 The user wants to search for information about the “华南X99-4MF” motherboard, specifically whether it supports AVX2 settings in BIOS, and wants to do…...

纺织行业智能化升级进入深水区:AI验布机从“可选项”变为“必选项”

过去三年,走访过数十家纺织服装企业的行业观察者会发现一个明显的变化:2023年时,AI验布机还是展会上引人驻足的新奇设备;到了2025年,它已经成为越来越多工厂标准配置的一部分。这一转变背后,折射出整个纺织…...

2026届学术党必备的五大降AI率工具解析与推荐

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 每位学者以及学生,在学术研究的这条道路之上,都必然要跨越论文写作这…...

ElevenLabs奥里亚文语音合规性警告:印度《2023语言技术法案》生效后,这4类商用场景必须重做语音备案

更多请点击: https://intelliparadigm.com 第一章:ElevenLabs奥里亚文语音合规性警告的背景与紧迫性 ElevenLabs 作为领先的文本转语音(TTS)服务提供商,近期在其 API 文档与开发者控制台中新增了针对奥里亚文&#xf…...

如何轻松掌握res-downloader:高效下载网络资源的终极指南

如何轻松掌握res-downloader:高效下载网络资源的终极指南 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader 你是否曾…...

Arduino ESP32终极开发指南:从硬件抽象到物联网实战

Arduino ESP32终极开发指南:从硬件抽象到物联网实战 【免费下载链接】arduino-esp32 Arduino core for the ESP32 family of SoCs 项目地址: https://gitcode.com/GitHub_Trending/ar/arduino-esp32 ESP32作为物联网开发领域的明星芯片,以其强大的…...

靠谱的微晶电热板机构

在实验设备领域,微晶电热板是一款重要的工具,选择靠谱的机构至关重要。微晶电热板的重要性微晶电热板在环境监测、食品安全、农产品检测等分析实验室中应用广泛。它能够为样品前处理提供稳定的加热环境,保障实验结果的准确性。行业报告显示&a…...

手把手教你用STC89C52单片机驱动DS1302时钟模块(附完整代码)

STC89C52与DS1302时钟模块实战指南:从硬件搭建到代码实现 1. 项目概述与硬件准备 在嵌入式系统开发中,实时时钟(RTC)功能是许多项目的核心需求。STC89C52作为经典的51系列单片机,与DS1302时钟模块的组合,为开发者提供了经济实惠且…...

ESP32+LVGL8.3保姆级教程:搞定ST7789V屏幕和CST816T触摸(附完整代码)

ESP32LVGL8.3实战指南:ST7789V屏幕与CST816T触摸的深度适配 当一块240x280分辨率的ST7789V屏幕与CST816T触摸芯片组合遇到ESP32开发板,如何让LVGL8.3图形库完美驱动这套硬件?本文将带你从零开始,穿越配置迷宫,解决色彩…...

Kubernetes自动化运维最佳实践

Kubernetes自动化运维最佳实践 引言 自动化运维是云原生环境中的重要能力,它可以提高运维效率、减少人为错误、确保系统稳定性。本文将深入探讨Kubernetes中的自动化运维策略和最佳实践。 一、自动化运维架构 1.1 自动化运维层次 ┌────────────────…...

STM32单片机如何用IRIG-B解码模块实现10ns级高精度授时(附完整驱动代码)

STM32单片机如何用IRIG-B解码模块实现10ns级高精度授时(附完整驱动代码) 在工业自动化、电力系统同步、通信基站等对时间精度要求苛刻的领域,微秒级甚至毫秒级的时钟同步已经无法满足需求。IRIG-B作为一种标准时间码格式,通过解码…...

观察Taotoken用量看板如何帮助团队控制API成本

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 观察Taotoken用量看板如何帮助团队控制API成本 作为团队的技术负责人,引入大模型API后,成本的可观测性与可…...

扬州尊客酒店用品厂:十一年用心,值得信赖

扎根扬州,十一年用心:一家把 “靠谱” 刻进骨子里的酒店用品厂在扬州生态科技新城,有这样一家企业:没有花哨噱头,不玩虚头宣传,只埋头做一件事 —— 把酒店客房里那些不起眼的一次性用品,做到让…...

Dism++实战指南:一站式Windows系统维护的5大专业解决方案

Dism实战指南:一站式Windows系统维护的5大专业解决方案 【免费下载链接】Dism-Multi-language Dism Multi-language Support & BUG Report 项目地址: https://gitcode.com/gh_mirrors/di/Dism-Multi-language Dism作为Windows系统维护的专业工具&#xf…...

如何用GenshinPlayerQuery深度分析原神账号:3个维度掌握角色成长与战斗表现

如何用GenshinPlayerQuery深度分析原神账号:3个维度掌握角色成长与战斗表现 【免费下载链接】GenshinPlayerQuery 根据原神uid查询玩家信息(基础数据、角色&装备、深境螺旋战绩等) 项目地址: https://gitcode.com/gh_mirrors/ge/GenshinPlayerQuery 你是…...

图像处理入门避坑:拉普拉斯锐化中的‘标定’到底在做什么?用NumPy手撕一遍就懂了

图像处理入门避坑:拉普拉斯锐化中的‘标定’到底在做什么?用NumPy手撕一遍就懂了 当你第一次尝试用拉普拉斯算子锐化图像时,可能会遇到一个令人困惑的现象:明明按照教程写了代码,输出的却是一张全黑或全白的图片。这不…...

2026届学术党必备的降重复率神器实际效果

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 人工智能技术飞速发展着,学术研究和论文创作领域迎来了深刻变革,维普…...

Cesium实战:手把手教你用JavaScript实现5个酷炫的3D地图特效(雷达扫描/淹没分析/动态绘制)

Cesium实战:手把手教你用JavaScript实现5个酷炫的3D地图特效(雷达扫描/淹没分析/动态绘制) 在三维地理信息可视化领域,Cesium凭借其强大的WebGL渲染能力和灵活的JavaScript API,已成为开发者构建沉浸式空间应用的首选引…...

BoltAI 资源网关、Agent 平台重塑工业 AI 底

一、工业 AI 进入“基础设施竞争”新阶段2025—2026年,从单点试点、概念验证,快速走向平台化、规模化、体系化落地。过去“一个场景一个模型”的作坊式开发,成本高、复用差、运维乱,已难以支撑制造、能源、化工、装备等行业的全域…...

ISE FPGA开发全流程实战:从代码到比特流的经典设计指南

1. 项目概述与核心价值如果你正准备踏入FPGA开发的大门,或者已经用了一段时间的Vivado,想看看业界另一个主流工具ISE(Integrated Software Environment)到底怎么玩,那这个系列的内容就是为你准备的。ISE是Xilinx&#…...