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

解决Sortable拖动el-table表头时,由于选择列造成的拖拽顺序错乱的bug

  • 原因 由于我的表头是由数组循环遍历生成的,而选择列不在数组内,只能在循环外定义el-table-column,造成拖动时索引错乱
  • 错误代码
  <el-table@header-dragend="headerDragend"id="out-table":data="state.sliceTable"borderstriperef="TableRef":row-key="getRowKeys(pageData)"><el-table-column type="selection" width="55" fixed /> 
><template v-for="(item, index) in state.pageDataTitle" :key="index"> <el-table-column:prop="item.value":label="item.name":key="index"><template #default="scope"><slot :name="item.value" :scope="scope">{{ scope.row[item.value] }}</slot></template></el-table-column></template></el-table>
  • 解决办法  向数组开头push一条 type="selection" 的对象 并把el-table-column 写到循环体内
  <template v-for="(item, index) in state.pageDataTitle" :key="index"><el-table-column type="selection" v-if="item.type" width="55" fixed /><el-table-column:prop="item.value":label="item.name":key="index"><template #default="scope"><slot :name="item.value" :scope="scope">{{ scope.row[item.value] }}</slot></template></el-table-column></template>
  •  当拖动选择列 或 拖向选择列时 仍然会造成拖动顺序混乱 所以我们要禁止掉
  • 给el-table-column添加 class-name="allowdrag" 表示除了选择列之外都可以拖动
  <el-table-columnclass-name="allowdrag":label="item.name":key="index"><template #default="scope"><slot :name="item.value" :scope="scope">{{ scope.row[item.value] }}</slot></template></el-table-column>
//拖拽列
const columnDrop2 = (dom) => {if (!dom) returnSortable.create(dom.$el.querySelector('.el-table__header-wrapper>.el-table__header tr'), {handle: '.allowdrag',  //除了选择列都可以选择onEnd: (sortableEvent) => {const targetThElem = sortableEvent.item;const wrapperElem = targetThElem.parentNode;const newIndex = sortableEvent.newIndex;const oldIndex = sortableEvent.oldIndex;const oldTrElement = wrapperElem.children[oldIndex];const currRow = state.pageDataTitle?.splice(oldIndex, 1)[0];state.pageDataTitle?.splice(newIndex, 0, currRow);if (newIndex > oldIndex) {wrapperElem.insertBefore(targetThElem, oldTrElement)} else {wrapperElem.insertBefore(targetThElem,oldTrElement ? oldTrElement.nextElementSibling : oldTrElement)}},})
}
  • 这样解决了选择列向其他列拖动 ,但没有解决其他列向选择列拖动 
  • 解决办法 添加 :header-cell-class-name="tableRowClassName" 并添加onMove方法
  <el-table:header-cell-class-name="tableRowClassName"id="out-table":data="state.sliceTable"ref="TableRef"><template v-for="(item, index) in state.pageDataTitle" :key="index"><el-table-column type="selection" v-if="item.type" width="55" fixed /><el-table-columnclass-name="allowdrag":prop="item.value":label="item.name":key="index"><template #default="scope"><slot :name="item.value" :scope="scope">{{ scope.row[item.value] }}</slot></template></el-table-column></template></el-table>
//解决向选择列拖动的bugfunction tableRowClassName(row) {if (row.columnIndex == 0) {return "filtered";}return "";}
//拖拽列
const columnDrop2 = (dom) => {if (!dom) returnSortable.create(dom.$el.querySelector('.el-table__header-wrapper>.el-table__header tr'), {handle: '.allowdrag',onEnd: (sortableEvent) => {const targetThElem = sortableEvent.item;const wrapperElem = targetThElem.parentNode;const newIndex = sortableEvent.newIndex;const oldIndex = sortableEvent.oldIndex;const oldTrElement = wrapperElem.children[oldIndex];const currRow = state.pageDataTitle?.splice(oldIndex, 1)[0];state.pageDataTitle?.splice(newIndex, 0, currRow)if (newIndex > oldIndex) {wrapperElem.insertBefore(targetThElem, oldTrElement)} else {wrapperElem.insertBefore(targetThElem,oldTrElement ? oldTrElement.nextElementSibling : oldTrElement)}},//解决向选择列拖动的bugonMove(e) {return e.related.className.indexOf("filtered") === -1;}})
}

完整代码

  <el-table:header-cell-class-name="tableRowClassName"id="out-table":data="state.sliceTable"ref="TableRef"><template v-for="(item, index) in state.pageDataTitle" :key="index"><el-table-column type="selection" v-if="item.type" width="55" fixed /><el-table-columnclass-name="allowdrag":prop="item.value":label="item.name":key="index"><template #default="scope"><slot :name="item.value" :scope="scope">{{ scope.row[item.value] }}</slot></template></el-table-column></template></el-table>
//拖拽列
const columnDrop2 = (dom) => {if (!dom) returnSortable.create(dom.$el.querySelector('.el-table__header-wrapper>.el-table__header tr'), {handle: '.allowdrag',onEnd: (sortableEvent) => {const targetThElem = sortableEvent.item;const wrapperElem = targetThElem.parentNode;const newIndex = sortableEvent.newIndex;const oldIndex = sortableEvent.oldIndex;const oldTrElement = wrapperElem.children[oldIndex];const currRow = state.pageDataTitle?.splice(oldIndex, 1)[0];state.pageDataTitle?.splice(newIndex, 0, currRow)if (newIndex > oldIndex) {wrapperElem.insertBefore(targetThElem, oldTrElement)} else {wrapperElem.insertBefore(targetThElem,oldTrElement ? oldTrElement.nextElementSibling : oldTrElement)}},//解决向选择列拖动的bugonMove(e) {return e.related.className.indexOf("filtered") === -1;}})
}//解决向选择列拖动的bugfunction tableRowClassName(row) {if (row.columnIndex == 0) {return "filtered";}return "";}

效果图

QQ录屏20231211155823

相关文章:

  • 排序-选择排序与堆排序
  • ubuntu18.04配置cuda+cudnn+tensorrt+anconda+pytorch-gpu+pycharm
  • 开源治理典型案例分享(汇编转)
  • 使用BeautifulSoup 4和Pillow合并网页图片到一个PDF:一种高效的方式来处理网页图像
  • 2024 年 SEO 现状
  • IDEA版SSM入门到实战(Maven+MyBatis+Spring+SpringMVC) -Spring IOC底层实现
  • 2023最新vue安装(npm,yarn,国内镜像,vue安装,vue导包)全套教程2023年12月最新
  • 新网站如何被搜索引擎迅速收录
  • 如何写好PPT报告
  • 5.清除SVN用户账号两种方式
  • 亚信科技AntDB携手蓝凌软件,助推企业数字化办公转型升级
  • 打破空间限制,畅享真实生活
  • 【精选】算法设计与分析(第三章分治法)
  • [算法基础 ~排序] Golang 实现
  • 【Netty为什么适合做网络编程】
  • 【前端学习】-粗谈选择器
  • 【刷算法】从上往下打印二叉树
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • Django 博客开发教程 16 - 统计文章阅读量
  • Hibernate最全面试题
  • Vue官网教程学习过程中值得记录的一些事情
  • webgl (原生)基础入门指南【一】
  • 关于使用markdown的方法(引自CSDN教程)
  • 聊聊flink的BlobWriter
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 一、python与pycharm的安装
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • ​用户画像从0到100的构建思路
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • #DBA杂记1
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (C语言)逆序输出字符串
  • (DenseNet)Densely Connected Convolutional Networks--Gao Huang
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (八)Flask之app.route装饰器函数的参数
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (附源码)计算机毕业设计ssm电影分享网站
  • (论文阅读40-45)图像描述1
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (四)Controller接口控制器详解(三)
  • (算法)Game
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • .dwp和.webpart的区别
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
  • .NET 读取 JSON格式的数据
  • .NET/C# 项目如何优雅地设置条件编译符号?
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)...
  • .Net各种迷惑命名解释
  • .NET开源快速、强大、免费的电子表格组件
  • .net生成的类,跨工程调用显示注释
  • .NET值类型变量“活”在哪?
  • /etc/sudoer文件配置简析