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 demo
      this.weekPlan.sort((e1, e2) => e1.sort - e2.sort)
      console.log(this.weekPlan)
    },
    created() {
    },
    methods: {
      handleSortable() {
        let _this = this
        const 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 < oldIndex
            let oldEntry = _this.weekPlan[oldIndex]
            // 2 -> 0
            if(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] = oldEntry
            console.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” 的配置, 否则 可能会造成一些 奇怪的问题

 

 

完 

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

免费redis可视化工具windows/mac都可以使用,开源免费

官方地址&#xff1a;RedisInsight | The Best Redis GUI github开源地址&#xff1a;GitHub - RedisInsight/RedisDesktopManager Redis Desktop Manager – Redis可视化管理工具、redis图形化管理工具、redis可视化客户端、redis集群管理工具。 官方下载方式 滚动到页面底…

考研数学一——概率论真题——自我总结题型整理(总分393)

系列文章目录 终于考完研了&#xff0c;本人考的是南京航空航天大学的仪器科学与技术&#xff0c;英一数一电路&#xff0c;以下是成绩单&#xff1a; 平时习惯整理自己的学习体系&#xff0c;以下是一个记录。 其实&#xff0c;每个人都应该训练&#xff0c;看到某一类题目…

怎么开发水果店小程序_指尖上的新鲜果园

水果店小程序&#xff1a;指尖上的新鲜果园&#xff0c;让生活更甜美&#xff01; 在这个快节奏的现代生活中&#xff0c;人们对于便捷、高效的生活方式有着越来越高的追求。购物也不例外&#xff0c;我们都在寻找着一种更加轻松、快捷的购物方式。而水果店小程序&#xff0c;…

javaSwing连连看游戏

一、简介 基于java的连连看游戏设计和实现&#xff0c;基本功能包括&#xff1a;消除模块&#xff0c;重新开始模块&#xff0c;刷新模块&#xff0c;选择难度模块&#xff0c;计时模块。本系统结构如下&#xff1a; &#xff08;1&#xff09;消除模块&#xff1a; 完成连连…

Adobe Illustrator和Photoshop哪个难学?另一款好用设计软件上位!

当设计开始时&#xff0c;几乎没有人不知道。 Adobe 公司的两大设计软件&#xff1a;Adobe Illustrator 和 Photoshop。虽然 Adobe Illustrator和 Photoshop 很有名&#xff0c;有一定设计经验的设计师在前期探索使用后可以对 Adobe Illustrator和 Photoshop 的使用差异有一个大…

蓝桥杯JAVA-试题-基础练习

一、十六进制转八进制 资源限制 内存限制&#xff1a;512.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述   给定n个十六进制正整数&#xff0c;输出它们对应的八进制数。输入格式   输入的第一行为一个正整…

AI老人跌倒监测报警摄像机

AI老人跌倒监测报警摄像机是一种基于人工智能技术的智能监控设备&#xff0c;专门用于监测老年人的跌倒情况并提供实时报警功能&#xff0c;以及时处理紧急情况&#xff0c;保障老人安全。这种摄像机利用先进的AI算法和深度学习技术&#xff0c;能够实时监测老人的行为&#xf…

Linux下的I/O模型

目录 一、什么是IO&#xff1f; 二、IO操作的两个阶段 三、五种I/O模型 1、阻塞I/O(blocking I/O) 2、非阻塞I/O(non-blocking I/O) 3、多路复用I/O(multiplexing I/O) 4、信号驱动I/O(signal-driven I/O) 5、异步I/O(asynchronous I/O) 四、五种I/O模型比较 一、什么…

ElasticSearch启动报错:Exception in thread “main“ SettingsException

Exception in thread "main" SettingsException[Failed to load settings from [elasticsearch.yml]]; nested: ParsingException[Failed to parse object: expecting token of type [START_OBJECT] but found [VALUE_STRING]]; 这个报错说明elasticsearch.yml这个配…

Java虚拟机运行原理

在 Java 中新建一个类Test&#xff1a; class Test {int a; }在Main方法中创建两个 Test 对象&#xff0c;并给 a 赋不同的值。 写一个 exchange 方法&#xff0c;在方法中交换两个Test 对象&#xff0c;最后输出两个对象中 a 的值。 public class Main {public static void…

OpenCV4.9的是如何进行图像操作

返回&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;OpenCV4.9矩阵上的掩码操作 下一篇&#xff1a;使用 OpenCV 添加&#xff08;混合&#xff09;两个图像 输入/输出 C 图像 从文件加载图像 Mat img imread(filename); 如…

NVIDIA 宣布推出适用于人形机器人的 GR00T 项目基础模型和主要 Isaac 机器人平台更新

NVIDIA 宣布推出适用于人形机器人的 GR00T 项目基础模型和主要 Isaac 机器人平台更新 Isaac 机器人平台现为开发人员提供新的机器人训练模拟器、Jetson Thor 机器人计算机、生成式 AI 基础模型以及 CUDA 加速感知和操作库 GTC — NVIDIA 今天宣布推出 GR00T 项目&#xff0c;这…

【数据分享】1929-2023年全球站点的逐月平均露点(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、能见度等指标&#xff0c;说到气象数据&#xff0c;最详细的气象数据是具体到气象监测站点的数据&#xff01; 有关气象指标的监测站点数据&#xff0c;之前我们分享过1929-2023年全球气象站…

为什么有些网站会提示不安全,提示您与此网站之间建立的连接不安全

有时候当我们尝试访问一个网站时&#xff0c;浏览器会弹出一个警告&#xff0c;提示“您与此网站之间建立的连接不安全”。这是什么意思&#xff1f;这种网站真的不安全吗&#xff1f; 理解HTTP与HTTPS HTTP&#xff08;超文本传输协议&#xff09;是互联网上用于传输数据的基…

利用sin/cos原理驱动步进电机

利用sin/cos原理控制步进电机转动 前言什么是步进电机驱动器细分控制电机内部结构图片步进电机驱动原理&#xff08;重要&#xff09;步进电机参数&#xff11;、步距角&#xff1a;收到一个脉冲转动的角度&#xff12;、细分数 &#xff1a;&#xff11;&#xff0f;&#xf…

qrcode插件-生成二维码

安装 yarn add qrcodejs2 --save npm install qrcodejs2 --save 使用 <template><div><div id"qrcodeImg"></div><!-- 创建一个div&#xff0c;并设置id --></div> </template> <script> import QRCode from q…

【超图 SuperMap3D】【基础API使用示例】52、超图SuperMap3D - 绘制点|线|多边形面的缓冲区

前言 引擎下载地址&#xff1a;[添加链接描述](http://support.supermap.com.cn/DownloadCenter/DownloadPage.aspx?id2524) 绘制缓冲区主要依赖[turfjs](https://turfjs.org/docs/#buffer) 先根据点线面的数据turfjs计算得到缓冲区的坐标数据&#xff0c;再行绘制效果 完整代…

《深入Linux内核架构》第3章 内存管理(3)

目录 3.3 页表 3.3.1 数据结构 3.3.2 特定于PTE的信息 3.3.3 页表项的创建和操作 3.3 页表 页表作用&#xff1a; 将虚拟地址转换为物理地址。 内核总是使用四级页表。所以如果体系架构只支持两级页表&#xff0c;则需模拟第三和第四级页表。 四级页表&#xff1a; PGD&am…

pycharm连接服务器运行时找不到文件或目录

选择你要修改的python interpreter 进入下图界面&#xff0c;默认选择的是Deployment configuration,需要将其改成SSH。 再将上图python interpreter path和pycharm helpers path 配置成服务器上相应地址即可。 over

【Java项目】基于jspssm的高校二手交易平台

目录 背景 技术简介 系统简介 界面预览 背景 随着互联网技术的不断进步&#xff0c;高校二手交易市场通过网络平台得到了显著的扩展。开发这一平台时&#xff0c;首要任务是深入挖掘并满足用户的实际需求&#xff0c;通过精准把握用户需求来构建一个专门化的高校二手交易系…