element-ui table 表格组件实现可拖拽效果(行、列)

2023-10-26

前言

最近需要实现table表格,行拖拽的功能,参照了一些优秀文章,实现了一下

参考文章

Vue进阶(幺零五):elementUI 实现表格行列拖拽

实现思路

主要是借助sortablejs,关于sortablejs我简单写了篇文章,有兴趣的可以看一下

拖拽,draggable组件和sortablejs

安装

npm install draggable

需要注意的是element table务必指定row-key,且row-key必须是唯一的,如ID,不然会出现排序不对的情况。

实现思路
1、定义一个列的数组,用来放列的数据。然后循环将列渲染出来
2、定义一个拖拽列的数组,拖拽后改变列在数组中的排列顺序

代码

<template>
  <div>
    <el-table :data="tableData" row-key="id" border style="width: 50%">
      <el-table-column type="index" label="序号" width="100" align="center" />
      <el-table-column
        v-for="(item, index) in colList"
        align="center"
        show-overflow-tooltip
        :key="`col_${index}`"
        :prop="dropCol[index].prop"
        :label="item.label"
        :min-width="item.minWidth"
      >
        <template v-slot="scope">
          <span v-if="dropCol[index].prop == 'date'" style="color: blue">
            {{ scope.row[dropCol[index].prop] }}
          </span>
          <span v-else>
            {{ scope.row[dropCol[index].prop] }}
          </span>
        </template>
      </el-table-column>
    </el-table>
    <pre style="text-align: left">
      {{ dropCol }}
    </pre>
    <hr />
    <pre style="text-align: left">
      {{ tableData }}
    </pre>
  </div>
</template>

<script>
import Sortable from "sortablejs";
import colDrap from "./drag";
export default {
  data() {
    return {
      //动态列数组
      colList: [
        {
          label: "日期",
          prop: "date",
          minWidth: 100,
        },
        {
          label: "姓名",
          prop: "name",
          minWidth: 200,
        },
        {
          label: "地址",
          prop: "address",
          minWidth: 300,
        },
      ],
      //拖拽列
      dropCol: [
        {
          label: "日期",
          prop: "date",
          minWidth: 100,
        },
        {
          label: "姓名",
          prop: "name",
          minWidth: 200,
        },
        {
          label: "地址",
          prop: "address",
          minWidth: 300,
        },
      ],
      tableData: [
        {
          date: "2016-05-03",
          name: "A",
          address: "No. 189, Grove St, Los Angeles",
        },
        {
          date: "2016-05-02",
          name: "B",
          address: "No. 189, Grove St, Los Angeles",
        },
        {
          date: "2016-05-04",
          name: "C",
          address: "No. 189, Grove St, Los Angeles",
        },
        {
          date: "2016-05-01",
          name: "D",
          address: "No. 189, Grove St, Los Angeles",
        },
      ],
    };
  },
  mounted() {
     this.dropCol = colDrap(this.dropCol);
  },
  methods: {
  },
};
</script>

<style scoped lang="scss">
</style>
import Sortable from "sortablejs";

//列拖拽
function columnDrop(dropCol) {
  //获取dom节点
  const wrapperTr = document.querySelector(".el-table__header-wrapper tr");
  Sortable.create(wrapperTr, {
    animation: 180,
    delay: 0,
    onEnd: (evt) => {
      const oldItem = dropCol[evt.oldIndex - 1];
      dropCol.splice(evt.oldIndex - 1, 1);
      dropCol.splice(evt.newIndex - 1, 0, oldItem);
    },
  });
  return dropCol;
}

export default columnDrop;

关于插槽的使用,可以通过v-if来判断

<template v-slot="scope">
    <span v-if="dropCol[index].prop == 'date'" style="color: blue">
      {{ scope.row[dropCol[index].prop] }}
    </span>
    <span v-else>
      {{ scope.row[dropCol[index].prop] }}
    </span>
  </template>

效果
在这里插入图片描述

关于表头label为啥会变的原因

在这里感谢 ty6693 用户提出的问题,因为实际项目中并没有用到,所以写完了就一直没有再看。
表头为啥会变,是因为拖拽的过程sortablejs改变了表头的dom。sortablejs只是改变了拖拽的元素,而table内容会变是因为我们在拖拽的时候改变了属性列的属性。
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

element-ui table 表格组件实现可拖拽效果(行、列) 的相关文章

随机推荐

  • graylog日志分析管理系统入门教程

    日志分析系统可以实时收集 分析 监控日志并报警 当然也可以非实时的分析日志 splunk是功能强大且用起来最省心的 但是要收费 免费版有每天500M的限制 超过500M的日志就没法处理了 ELK系统是最常见的 缺点是配置麻烦一些 比较重量级
  • MySQL之InnoDB引擎(一)

    1 InnoDB介绍 InnoDB是一个通用的存储引擎 同时具备高可靠性与高性能的特性 除非用户指定存储引擎的类型 否则其作为MySQL Server的默认存储引擎 使用InnoDB存储引擎的优势包括如下几点 DML操作符合ACID模型 使
  • 编码技巧——事务提交后执行

    日常开发中 一些诸如 先读后写 先写A再写B 先写A再执行B 的场景 一般都会用到事务 这里的事务指的是本地事务 如果涉及RPC 一般我们通过异步补偿来保证最终一致性 本篇例举2个使用事务 先写A再执行B 的场景 1 订单场景 1 处理支付
  • MeshTextPro 自动换行和自动缩放问题

    如果启用了autosize MeshTextPro会优先显示完一个单词之后才会进行换行 当此时如果一个单词过于场的话 MeshTextPro会对其进行缩放 直至当前行可以显示完整单词之后 在进行换行处理 如果需要自动缩放 但是又想其填满一行
  • 一文读懂元宇宙--元宇宙含义

    元宇宙是 虚实融合的世界 包含模拟现实的虚拟世界 创新的虚拟世界 现实世界 也是元宇宙的一部分 虚拟和现实世界的融合 将高于 超越单一的虚拟或者现实世界 虚实融合的世界 图片来源于德勤 元宇宙的四层含义 图片来源于德勤 1 1 模拟现实的虚
  • 神经网络(三)—— 神经元多输出

    本系列为慕课网 深度学习之神经网络 CNN RNN GAN 算法原理 实战 视频笔记 希望自己能通过分享笔记的形式更好的掌握该部分内容 往期回顾 神经网络 一 机器学习 深度学习简介 神经网络 二 神经元 Logistic回归模型 多分类的
  • 优化算法 - RMSProp算法

    文章目录 RMSProp算法 1 算法 2 从零开始实现 3 简洁实现 4 小结 RMSProp算法 1 算法 import math import torch from d2l import torch as d2l d2l set fi
  • APP版本升级与服务器交互

    踏入程序媛旅程已经快一年了 学生生涯也即将结束 正式踏入工作岗位 万事开头难 只能多问多记 久病成医 遇到的问题多了自己的技术也会有所提高 博客也一年了 之前一直想写博 然后各种拖延 到现在才开始 希望自己能坚持 项目中加了一个APP版本升
  • 一种基于深度学习的全自动纸心电图数字化算法

    深度学习在医学检测仪方面的应用 人们越来越关注将深度学习方法应用于心电图 ECG 最近的研究表明 神经网络 NN 可以仅通过 ECG 预测未来的心力衰竭或心房颤动 然而 神经网络的训练需要大量的心电图 而目前很多心电图只是纸质的 不适合神经
  • win10安装pycocotools遇到的问题(gcc.exe failed with exit status 1)

    背景安装pycocotools一直过不去 一直报错 PS C Users peter gt pip install git https github com philferriere cocoapi git subdirectory Pyt
  • Java —— 有关存储学生信息数组的操作

    class Test public class Test public static void main String args TODO Auto generated method stub Student s s new Student
  • 启动elasticsearch报错处理方式

    启动elasticsearch报错 bootstrap check failure 1 of 1 memory locking requested for elasticsearch process but memory is not lo
  • Flask web页面加载很慢的原因

    直接上正题吧 Flask写了个简单的页面 居然加载超过30s 排查问题发现如下 能想象加载3分钟后还是失败的心情嘛 解决方法如下 添加CDN 就是让游览器加载moment js时 不需要中介直接找到moment js文件 做法 在momen
  • Vue动态改变title的标题及图标

    1 首先安装 vue wechat title包 npm install vue wechat title save 2 引入包 设置每个页面的标题 在mian js中引入 作为全局使用 import VueWechatTitle from
  • 串口命令出现>号(大于号),无法继续执行命令,如何退出

    如果在输入无法结束 提示 gt 符号 大于号 时 可以尝试按下该组合来结束输入 ctrl c 向当前进程发送 SIGINT 信号 用于终止一个进程 ctrl z 向当前进程发送 SIGSTOP 信号 用于挂起一个进程 ctrl d 不是发送
  • React 组件的分类和Render返回值

    组件化原因 随着web的发展 许多与客户端交互的逻辑放在的客户端 用户交互 数据渲染 数据交换等 前端代码数据增多 页面逻辑复杂 难以维护 以上导致前端代码耦合度高 复用性低 开发效率底下 以上问题可以使用组件化发发解决 优点 对代码进行封
  • Java内部类

    内部类 说简单点就是一个类里面还可以定义一个类 内部类可以定义在别一个类的任意位置上 包括成员位置和局部位置 私有属性 private在本类中有效 1 内部类可以直接访问外部类中的成员 私有和非私有的都可以 2 外部类如果想要访问内部类 必
  • Linux文件创建及查看方法

    1 文件创建 vi vim 原来有文件就打开 没有就创建再打开 回车后进入命令模式 w w保存 q退出 强制 这三个可以自由组合 记住前面有冒号哦 n光标移至第n行 dd 删一行 xx 删一个 光标移至行末 G光标移至文末 查找某个字符串
  • RabbitMQ 启动报错 Failed to check/redeclare auto-delete queue(s) access to vhost '/' refused for user

    RabbitMQ 启动报错 Failed to check redeclare auto delete queue s access to vhost refused for user rabbit 今天项目在新的服务器上启动 所有的配置文
  • element-ui table 表格组件实现可拖拽效果(行、列)

    前言 最近需要实现table表格 行拖拽的功能 参照了一些优秀文章 实现了一下 参考文章 Vue进阶 幺零五 elementUI 实现表格行列拖拽 实现思路 主要是借助sortablejs 关于sortablejs我简单写了篇文章 有兴趣的