43 带 fixed 列的 el-table 不兼容于 sortablejs

前言

这是一个基于 sortablejs 来实现的 el-table 的拖拽功能的基础实现 

然后 这个过程中遇到的一个比较特殊的问题是, 关于 el-table-column 的 fixed 的属性, 对于 sortablejs 这边来定位目标选择列 影响的一个问题 

在基础的用例中, 使用 “.el-table__body-wrapper tbody” 去定位目标元素, 然后 带 class 为 draggableClass 的元素作为可以拖拽的元素, 来实现 拖拽的交互

 

 

基础的拖拽的实现

测试用例如下 

<template><div class="testParent"><el-table :data="weekPlan" row-key="id"><el-table-column label="id" prop="id" ></el-table-column><el-table-column label="星期" prop="name" ></el-table-column><el-table-column label="移动" ><div class="draggableClass" style="width:20px; height:20px; background-color: blue; cursor:move;" ></div></el-table-column>
<!--      <el-table-column label="移动fixedLeft" :fixed="'left'" >-->
<!--        <div class="draggableClass" style="width:20px; height:20px; background-color: blue; cursor:move;" ></div>-->
<!--      </el-table-column>-->
<!--      <el-table-column label="移动fixedRight" :fixed="'right'" >-->
<!--        <div class="draggableClass" style="width:20px; height:20px; background-color: blue; cursor:move;" ></div>-->
<!--      </el-table-column>--></el-table></div></template><script>import Sortable from "sortablejs"export default {name: "HelloTableSortable",data() {return {weekPlan: [{id: "01",name: "monday",sort: 10,},{id: "02",name: "tuesday",sort: 22,},{id: "03",name: "wednesday",sort: 12,}],}},computed: {},mounted() {this.$nextTick(() => {setTimeout(this.handleSortable, 100)})// sort demothis.weekPlan.sort((e1, e2) => e1.sort - e2.sort)console.log(this.weekPlan)},created() {},methods: {handleSortable() {let _this = thisconst tbody = document.querySelector(".el-table__body-wrapper tbody")Sortable.create(tbody, {handle: ".draggableClass",animation: 350,easing: 'cubic-bezier(0.34,1.56,0.64,1)',onEnd: ({newIndex, oldIndex}) => {let isMoveUp = newIndex < oldIndexlet oldEntry = _this.weekPlan[oldIndex]// 2 -> 0if(isMoveUp) {for(let i=oldIndex; i>newIndex; i--) {_this.weekPlan[i] = _this.weekPlan[i-1]}// 0 -> 2} else {for(let i=oldIndex; i<newIndex; i++) {_this.weekPlan[i] = _this.weekPlan[i+1]}}_this.weekPlan[newIndex] = oldEntryconsole.log(_this.weekPlan.map(e => e.id))}})}},}
</script><style></style>

 

效果如下, console 里面打印的是 拖拽结束之后的一个最新的顺序 

具体的记录的 sort, 就是该元素的索引 

a897bdd3e7e948cf803d6d8ae622cf4b.png

 

从 dom 结构来看, 是一个单纯的一个 table, 然后下面是 th, 各个 tr 

然后 我们业务代码中基于 “.el-table__body-wrapper tbody . draggableClass” 可以正常的定位到目标拖拽元素 

ee0d9832ca7149c386295b6697a1751c.png

 

 

目标拖拽元素在 带fixed的 el-table-column 上面的异常情况 

基于上面的测试用例, 注释掉 “移动” 列, 解除注释 “移动fixedLeft”, “移动fixedRight” 列 

然后 这时候 你可以发现, 拖动 这两列 都不行了, 不管是拖拽 “移动fixedLeft”列, 还是 “移动fixedRight”列 

这个时候 页面 dom 结构如下

可以看到这时候 dom 树上面有三个 table, 一个在 el-table 下面, 一个在 el-table 下面的 el-table__fixed 下面, 一个在 el-table 下面的 el-table__fixed-right 下面 

el-table 下面的 el-table__fixed 下面 table, 主要是这部分配置了 fixed=’left‘ 的 el-table-column 的展示交互 

el-table 下面的 el-table__fixed-right 下面 table, 主要是这部分配置了 fixed=’right‘ 的 el-table-column 的展示交互 

d34cb08dd6f94197b7b5ff48dfd08964.png

 

页面上 “移动fixedRight“ 选择列右键查看元素, 可以看到 在最上层的元素是 使用的是包含在 el-table 下面的 el-table__fixed-right 下面 table 下面的元素 

b529f13797024e8899d883156fc33a0a.png

 

页面上 “移动fixedLeft“ 选择列右键查看元素, 可以看到 在最上层的元素是 使用的是包含在 el-table 下面的 el-table__fixed 下面 table 下面的元素 

4d9b16096ec1428ca2e3ab94a39c6403.png

 

页面上 数据中间列 选择列右键查看元素, 可以看到 在最上层的元素是 使用的是包含在 el-table 下面的 el-table__fixed 下面 table 下面的元素 

f1cbe16ef8524f62bd2622514916fcf2.png

 

然后 我们业务代码中拿到的元素是 数据中间列  

然后 它下面的 draggableClass 的元素在页面上, 不是 z-index 在最上面的元素, 页面的点击, 拖拽等等事件 选中的不是该元素 

const tbody = document.querySelector(".el-table__body-wrapper tbody")

 

所以 需要更新 Sortable.create 的时候选择的元素 

假设我们需要拖拽 “移动fixedRight” 的元素, 则我们更新 tbody 的 selector 如下 

const tbody = document.querySelector(".el-table__fixed-right tbody")

 

 

但是这样会存在一个问题就是, 因为 fixedLeft列 和 数据中间列 和 fixedRight列 是分开的, 然后 我这里将 fixedRight列 的 第二行 和 第一行 交换了位置

但是 fixedLeft列 和 数据中间列 的第二行 和 第一行 是没有交换位置的

这时候 就造成了数据的错位

545b0740b9d549baa3d616ce6d5b5a39.png

 

如下就使 拖拽中, 拖拽之后 的截图, 可以看到的是 第二行的 fixedLeft列 和 数据中间列 的 第二行 和 第一行 是没有交换位置的

造成了数据的展示错误 

47deea1afacd45778f75e0de77e13687.png

71b1243a3680454eb0282752cef55f30.png

 

所以再这种 el-table 中基于 sortablejs 来实现拖拽的场景下面 

需要尽量避免使用 fixed=”left”, fixed=”right” 的配置, 否则 可能会造成一些 奇怪的问题

 

 

完 

 

 

 

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

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

相关文章

力扣--931.下降路径最小和

给你一个 n x n 的 方形 整数数组 matrix &#xff0c;请你找出并返回通过 matrix 的下降路径 的 最小和 。 下降路径 可以从第一行中的任何元素开始&#xff0c;并从每一行中选择一个元素。在下一行选择的元素和当前行所选元素最多相隔一列&#xff08;即位于正下方或者沿对角…

2024/3/26 C++作业

定义一个矩形类&#xff08;Rectangle&#xff09;&#xff0c;包含私有成员&#xff1a;长(length)、宽&#xff08;width&#xff09;, 定义成员函数&#xff1a; 设置长度&#xff1a;void set_l(int l) 设置宽度&#xff1a;void set_w(int w) 获取长度&#xff1a;int…

嵌入式|蓝桥杯STM32G431(HAL库开发)——CT117E学习笔记11:数字电位器MCP4017

系列文章目录 嵌入式|蓝桥杯STM32G431&#xff08;HAL库开发&#xff09;——CT117E学习笔记01&#xff1a;赛事介绍与硬件平台 嵌入式|蓝桥杯STM32G431&#xff08;HAL库开发&#xff09;——CT117E学习笔记02&#xff1a;开发环境安装 嵌入式|蓝桥杯STM32G431&#xff08;…

【Linux】详细分析/dev/loop的基本知识 | 空间满了的解决方法

目录 前言1. 基本知识2. 内存满了2.1 清空2.2 扩增 3. 彩蛋 前言 服务器一直down机&#xff0c;翻找日志文件一直找不到缘由&#xff0c;最终发现是挂载的内存满了&#xff0c;那本身这个文件就什么用呢&#xff1f; 1. 基本知识 /dev/loop是一种特殊的设备文件&#xff0c;…

I2C系列(三):软件模拟I2C读写24C02

一.目标 PC 端的串口调试软件通过 RS-485 与单片机通信&#xff0c;控制单片机利用软件模拟 I2C 总线对 EEPROM&#xff08;24C02&#xff09; 进行任意读写。 二.硬件简述 2.1 24C02硬件参数 24C02器件地址为0x50&#xff0c;存储容量为256字节&#xff0c;存储单元地址位数…

【SpringBoot】java.lang.Exception: No tests found matching Method

目录 问题解决 问题 在运行SpringBootMaven工程时&#xff0c;创建了一个新的Test单元测试&#xff0c;在运行时遇到的问题如下&#xff1a; java.lang.Exception: No tests found matching Method test_chatGPT(cn.bugstack.chatbot.api.test.ApiTest) from org.junit.inter…

使用 Docker Swarm(集群) 和Docker Stack(堆栈)部署容器化应用

1、Docker Swarm简介 说到集群&#xff0c;第一个想到的就是k8s&#xff0c;但docker官方也提供了集群和编排解决方案&#xff0c;它允许你将多个 Docker 主机连接在一起&#xff0c;形成一个“群集”&#xff08;Swarm&#xff09;&#xff0c;并可以在这个 Swarm 上运行和管…

Python与供应链-2预测误差及指数平滑需求预测模型

主要介绍预测误差和指数平滑模型的相关理论,然后再通过Python的statsmodels封装的指数平滑函数预测需求。 1预测误差 预测误差是指预测结果与预测对象发展变化的真实结果之间的差距。这种误差分为绝对误差和相对误差。绝对误差是预测值与实际观测值的绝对差距,而相对误差则…

分期乐(乐信)与银行机构合伙放贷,谁是真正的受益者?

分期乐&#xff08;乐信&#xff09;与银行机构的合作放贷模式&#xff0c;无疑在金融领域引起了广泛关注。这种合作模式似乎为各方都带来了不小的利益&#xff0c;但究竟谁是真正的受益者呢&#xff1f; 银行受益&#xff1a;对于银行机构而言&#xff0c;与分期乐&#xff0…

C是用什么语言写出来的?

C是用什么语言写出来的? C语言的起源和发展是一个迭代过程&#xff1a; 1. 最初的C语言编译器的开发始于对B语言的改进。B语言是由Ken Thompson设计的&#xff0c;它是基于BCPL语言简化而来的。在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「 C语言的…

RocketMQ学习笔记:分布式事务

这是本人学习的总结&#xff0c;主要学习资料如下 马士兵教育rocketMq官方文档 目录 1、分布式事务的难题2、解决方式2.1、半事务消息和事务回查2.2、代码样例2.2.1、TransactionListener2.2.2、TransactionMQProducer2.2.3、MessageListenerConcurrently2.2.4、流程图 1、分布…

C++判断点是否在三角形内部

1.问题 判断点是否在三角形内部。 2.思路 计算向量AB和AP的叉积、向量BC和BP的叉积、向量CA和CP的叉积&#xff0c;如果所有的叉积符号相同&#xff0c;则点在三角形内部。 3.代码实现和注释 #include <iostream> #include <vector>// 计算两个二维向量的叉积 …

数据结构-队列-005

1链式队列 运行结果如下&#xff1a; 1.1链式队列结点定义 /*自定义一个数据类型*/ typedef struct student {char name[32];char sex;int age; }DATA_TYPE;/*定义一个链式队列结点*/ typedef struct link_queue_node {DATA_TYPE data;//数据域struct link_queue_node *pne…

什么是甲状腺相关眼病,四川眼科医院院长孙丰源教授这么说!

近年来&#xff0c;随着人们健康意识的逐渐增强&#xff0c;越来越多人开始关注甲状腺疾病。甲状腺是人体最大的内分泌腺&#xff0c;是维护人体健康的关键&#xff0c;它一旦发生异常&#xff0c;则会危害到多个器官和组织。不同的甲状腺疾病会呈现不同的症状&#xff0c;比如…

C# 快速将数据写入 Excel 单元格

目录 性能问题 Excel元素结构及写入原理 范例运行环境 配置Office DCOM 实现代码 组件库引入 核心代码 WriteArrayToExcel 神奇的 911 事件 小结 性能问题 将生成或查询到的数据&#xff0c;导出到 Excel 是应用中常用的一项功能。其中一些标准的写入单元格的方法如…

智慧公厕,让数据和技术更好服务社会生活

智慧公厕&#xff0c;作为智慧城市建设中不可忽视的一部分&#xff0c;正逐渐受到越来越多人的关注。随着科技的不断进步&#xff0c;智能化公厕已经成为一种趋势&#xff0c;通过数据的流转和技术的整合&#xff0c;为社会生活带来了更好的服务。本文以智慧公厕源头实力厂家广…

基于51单片机的酒精检测警报系统Proteus仿真

地址&#xff1a;https://pan.baidu.com/s/1gddplAxS_ZKyrHaWE93dog 提取码&#xff1a;1234 仿真图&#xff1a; 芯片/模块的特点&#xff1a; AT89C52简介&#xff1a; AT89C52是一款经典的8位单片机&#xff0c;是意法半导体&#xff08;STMicroelectronics&#xff09;公…

最新的Flutter3.x版本获取应用包名的方法

以前的flutter项目可以在 AndroidManifest.xml 中获取应用包名&#xff0c; 最新的Flutter3.x版本要获取应用包名可以找到build.gradle 更多内容参考&#xff1a;最新的Flutter3.x版本如何获取应用包名

Linux:Jenkins全自动持续集成持续部署(4)

在上一章部署好了之后&#xff0c;还需要点击一下才能进行部署&#xff0c;本章的效果是&#xff1a;当gitlab上的代码发生了变化后&#xff0c;我们不需要做任何事情不需要去点击构建按钮&#xff0c;Jenkins直接自动检测变化&#xff0c;然后自动去集成部署Linux&#xff1a;…

(一)手把手教你如何通过ARM DesignStart计划在FPGA上搭建一个Cortex-M3软核

&#xff08;一&#xff09;手把手教你如何通过ARM DesignStart计划在FPGA上搭建一个Cortex-M3软核 一、ARM DesignStart计划 1.1 如何下载ARM DesignStart Cortex-M3相关文件 ​ 关于ARM DesignStart计划的介绍:ARM DesignStart计划——私人定制一颗ARM处理器 - 知乎 (zhih…