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

news2024/11/16 13:37:53

前言

这是一个基于 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” 的配置, 否则 可能会造成一些 奇怪的问题

 

 

完 

 

 

 

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

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

相关文章

数组的常见算法

数组的常见算法 数值型数组特征值统计 这里的特征值涉及到&#xff1a;平均值、最大值、最小值、总和等 举例1&#xff1a;数组统计&#xff1a;求总和、均值 public class TestArrayElementSum {public static void main(String[] args) {int[] arr {4,5,6,1,9};//求总和、…

污水处理迈入3D可视化新时代:智慧环保触手可及

在科技日新月异的今天&#xff0c;环保事业也迎来了前所未有的发展机遇。污水处理作为环保领域的重要组成部分&#xff0c;其技术的革新与进步&#xff0c;对于保护水资源、维护生态平衡具有重要意义。 传统的污水处理机组往往存在着操作复杂、监控困难等问题&#xff0c;使得污…

2024年【熔化焊接与热切割】报名考试及熔化焊接与热切割模拟试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 熔化焊接与热切割报名考试考前必练&#xff01;安全生产模拟考试一点通每个月更新熔化焊接与热切割模拟试题题目及答案&#xff01;多做几遍&#xff0c;其实通过熔化焊接与热切割作业考试题库很简单。 1、【单选题】…

ORA-04031 错误分析及处理方法

一、问题描述 使用普通用户登录数据库报ORA-04031错误 $ sqlplus / as sysdbaSQL*Plus: Release 11.2.0.1.0 Production on Mon Mar 25 09:14:59 2024Copyright (c) 1982, 2009, Oracle. All rights reserved.Connected to: Oracle Database 11g Enterprise Edition Releas…

学点儿Java_Day12_IO流

1 IO介绍以及分类 IO: Input Output 流是一组有顺序的&#xff0c;有起点和终点的字节集合&#xff0c;是对数据传输的总称或抽象。即数据在两设备间的传输称为流&#xff0c;流的本质是数据传输&#xff0c;根据数据传输特性将流抽象为各种类&#xff0c;方便更直观的进行数据…

详细分析Linux中的core dump异常(附 Demo排查)

目录 1. 基本知识2. 进阶知识3. Demo4. 彩蛋 1. 基本知识 Core dump 是指在程序异常终止时&#xff0c;操作系统将程序的内存映像保存到磁盘上的一种机制。 在 Linux 系统中&#xff0c;core dump 提供了一种调试程序错误的重要方式&#xff0c;它记录了程序在崩溃时的内存状态…

文献学习(自备)

收官大作&#xff0c;多组学融合的新套路发NC&#xff01;&#xff01; - 知乎 (zhihu.com) Hofbauer cell function in the term placenta associates with adult cardiovascular and depressive outcomes | Nature Communications 病理性胎盘炎症会增加几种成人疾病的风险&a…

CAD自动轻量化,工业仿真动画快速制作

随着现代工业的蓬勃发展&#xff0c;制造业企业在产品宣传展示、工作流程讲解、机械维修维护等方面对展示形式提出了更高的要求。工业动画以其直观、生动的特点&#xff0c;能够深入剖析产品的结构、工作原理和操作流程&#xff0c;为企业带来了全新的宣传展示方式。 但是由于…

Obsidian插件-高亮块(Admonition)

在插件市场里面搜索Admonition并安装插件&#xff0c;就可以使用高亮块了。 添加高亮块 用法稍微有一些不同。按照下面的格式&#xff0c;输入Markdown就可以创建一个高亮块。 内容内容内容输入*ad-*会出现相应的类型可以选择

【QGIS从shp文件中筛选目标区域导出为shp】

文章目录 1、写在前面2、QGIS将shp文件中目标区域输出为shp2.1、手动点选2.2、高级过滤 3、上述shp完成后&#xff0c;配合python的shp文件&#xff0c;即可凸显研究区域了 1、写在前面 利用shp文件制作研究区域mask&#xff0c;Matlab版本&#xff0c;请点击 Matlab利用shp文…

超分之SwinIR官方代码解读

文章目录 一、解读SwinIR模型文件&#xff1a;network_swinir.py1. 带有相对为位置偏置的(W-MSA)2. STL(Swin Transformer)3. RSTB&#xff08;Residual Swin Transformer Block&#xff09;4. SwinIR&#xff08;主框架网络&#xff09; 二、解读SwinIR测试主文件&#xff1a;…

企业员工培训考试系统开发方案

一、引言 在当今知识经济时代&#xff0c;企业对员工的综合素质和专业技能有着越来越高的要求。为了适应这一趋势&#xff0c;构建一个全面而高效的企业员工培训考试系统变得尤为重要。该系统旨在通过提供多样化的培训课程和全面的考核机制&#xff0c;促进员工持续学习和能力…

结构体,联合体,枚举( 1 )

目录 前言 1.结构体 1.1结构体的声明 1.2结构体变量的创建和初始化 1.3结构体成员的访问字符 1.4结构体的内存大小 1.4.1对齐规则 1.5结构体传参 前言 在编程的世界里&#xff0c;数据结构的选择对于程序的效率和可读性有着至关重要的影响。不同的数据结构适用于不同的…

手写SpringBoot(二)之动态切换Servlet容器

系列文章目录 手写SpringBoot&#xff08;一&#xff09;之简易版SpringBoot 手写SpringBoot&#xff08;二&#xff09;之动态切换Servlet容器 手写SpringBoot&#xff08;二&#xff09;之动态切换Servlet容器 文章目录 系列文章目录手写SpringBoot&#xff08;二&#xff…

面向图像分类的视觉Transformer

一种面向对象分类的视觉Transformer&#xff0c;即ViT。该模型避免了卷积带来的归纳偏置&#xff0c;弥补了卷积神经网络在超长周期建模的不足。 1、DeiT&#xff08;data-efficient image transformer&#xff09;采用了知识蒸馏策略&#xff08;将大型模型的复杂知识&#xf…

工厂数据分析系统用这个开源库准没错

ScottPlot是一款简单易用、高度定制、性能卓越的.NET绘图库&#xff0c;支持跨平台操作。除提供标准图表类型外&#xff0c;还支持交互式操作&#xff0c;呈现生动的数据展示。在工厂数字化系统中&#xff0c;可用于生产数据可视化、设备监测和质量控制。无论用于科学研究、数据…

蓝桥杯 2022 省A 选数异或

一种比较无脑暴力点的方法&#xff0c;时间复杂度是(nm)。 (注意的优先级比^高&#xff0c;记得加括号(a[i]^a[j])x&#xff09; #include <iostream> #include <vector> #include <bits/stdc.h> // 包含一些 C 标准库中未包含的特定实现的函数的头文件 usi…

ThreadLocal和Synchronized的区别

目录 背景过程ThreadLocal什么是ThreadLocal&#xff1f;既然都是保证线程访问的安全性&#xff0c;那么和Synchronized区别是什么呢&#xff1f;ThreadLocal的使用TheadLocal使用场景原理高并发场景下ThreadLocal会造成内存泄漏吗&#xff1f;什么原因导致&#xff1f;如何避免…

JavaScript 权威指南第七版(GPT 重译)(四)

第九章&#xff1a;类 JavaScript 对象在第六章中有所涉及。该章将每个对象视为一组独特的属性&#xff0c;与其他对象不同。然而&#xff0c;通常有必要定义一种共享某些属性的对象类。类的成员或实例具有自己的属性来保存或定义它们的状态&#xff0c;但它们还具有定义其行为…

蓝桥杯省三保底代码——数显+按键功能实现

目录 前言 一、为什么能保底省三 二、数显模块的实现 1.数码管显示​编辑 1&#xff09;断码表 2&#xff09;位选 3&#xff09;段选 4&#xff09;扫描 2.菜单 三、按键功能的实现 1.按键扫描 2.菜单切换 四、完整代码演示 五、结语 前言 上一期介绍全家桶时&…