使用elementUI实现表格行拖拽改变顺序,无需引入外部库

news2025/1/5 9:11:59

前言:

使用vue2+element UI,且完全使用原生的拖拽事件,无需引入外部库。

如果表格数据量较大,或需要更多复杂功能,可以考虑使用 vuedraggable库,提供更多配置选项和拖拽功能。

思路:

1. 通过el-table的row-class-name设置行的自定义class类名

2. 在 mountedupdated 生命周期钩子中调用this.$nextTick,确保 DOM 元素渲染完成后,使用 document.querySelectorAll 获取所有 .drag-row 元素。

3. 设置dom的 draggable为true,并增加拖拽事件处理函数:

  • ondragstart:记录拖拽开始的索引,并设置拖拽效果。
  • ondragover:在拖拽经过时,阻止默认行为,允许放置。
  • ondrop:在拖拽放下时,交换源位置和目标位置的数据,并更新列表。

在拖拽事件内 通过 修改数据的index的方式实现 行位置的移动

  • handleDragStart 方法

    • 记录当前拖拽行的索引 draggingIndex
    • 使用 event.dataTransfer.setData 方法存储拖拽数据,方便在 ondrop 中使用。
  • handleDrop 方法

    • 获取拖拽的源索引 sourceIndex 和目标索引 targetIndex
    • 通过数组的 splice 方法删除源位置的项目,并插入到目标位置。
    • 更新组件的数据 projects,触发 Vue 的响应式更新,表格会重新渲染显示新的排序。

效果演示:

完整代码:

<template>
  <div class="sort-container">
    <span class="title">项目排序</span>
    <!-- 通过 row-class-name 为每一行动态添加行的类名 -->
    <el-table
      :data="projects"
      row-class-name="drag-row"
      @row-contextmenu.prevent
      border
    >
      <el-table-column prop="index" label="序号" width="200">
        <template slot-scope="scope">
          {{ scope.$index + 1 }}
        </template>
      </el-table-column>
      <el-table-column prop="name" label="项目名称"></el-table-column>
    </el-table>
  </div>
</template>

<script>
export default {
  data() {
    return {
      projects: [
        { id: '1', name: '男子10米气步枪' },
        { id: '2', name: '女子50米步枪三姿' },
        { id: '3', name: '男子双向飞碟' },
        { id: '4', name: '女子25米手枪' },
        { id: '5', name: '男子50米步枪卧射' },
      ],
      draggingIndex: null,// 当前正在拖拽的行索引
    };
  },
  mounted() {
    // 组件挂载后添加拖拽事件
    this.addDragEvents();
  },
  updated() {
    // 数据更新后重新添加拖拽事件
    // 使用 this.$nextTick 获取表格行的 DOM 元素
    this.$nextTick(() => {
      this.addDragEvents();
    });
  },
  methods: {
    // 添加拖拽事件
    addDragEvents() {
      // 获取所有带有类名 'drag-row' 的表格行
      const rows = document.querySelectorAll('.drag-row');
      // 遍历每一行,添加拖拽事件
      rows.forEach((row, index) => {
        row.draggable = true; // 设置行元素为可拖拽
        // 开始拖拽时的事件处理
        row.ondragstart = (event) => this.handleDragStart(event, index);
        // 拖拽经过时的事件处理
        row.ondragover = (event) => this.handleDragOver(event);
        // 拖拽放下时的事件处理
        row.ondrop = (event) => this.handleDrop(event, index);
      });
    },
    // 处理拖拽开始事件
    handleDragStart(event, index) {
      this.draggingIndex = index; // 记录当前拖拽行的索引
      event.dataTransfer.effectAllowed = 'move'; // 设置拖拽效果为移动
      event.dataTransfer.setData('text/plain', index); // 将索引存储到拖拽数据中
    },
    // 处理拖拽经过事件
    handleDragOver(event) {
      event.preventDefault(); // 阻止默认事件,允许放置
      event.dataTransfer.dropEffect = 'move'; // 设置拖拽效果为移动
    },
    // 处理拖拽放下事件
    handleDrop(event, targetIndex) {
      const sourceIndex = this.draggingIndex; // 获取开始拖拽时记录的索引

      // 如果源索引和目标索引相同,直接返回
      if (sourceIndex === targetIndex) return;

      // 创建项目列表的副本
      const projects = [...this.projects];
      // 删除源位置的项目,并存储被拖拽的项目
      const [movedItem] = projects.splice(sourceIndex, 1);
      // 在目标位置插入被拖拽的项目
      projects.splice(targetIndex, 0, movedItem);

      // 更新项目列表数据
      this.projects = projects;
      this.draggingIndex = null; // 重置拖拽索引
    },
  },
};
</script>

<style lang='scss' scoped>
.sort-container{
    padding: 15px;

    .title{
        font-size: 24px;
        font-weight: bold;
    }

    .el-table{
        margin-top: 20px;
    }
}
/* 自定义拖拽行样式 */
.drag-row {
  cursor: move;
  user-select: none;
}
.drag-row:hover {
  background-color: #f0f9ff;
}
</style>

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

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

相关文章

开源共建 | 长安链开发常见问题及规避

长安链开源社区鼓励社区成员参与社区共建&#xff0c;参与形式包括不限于代码贡献、文章撰写、社区答疑等。腾讯云区块链王燕飞在参与长安链测试工作过程中&#xff0c;深入细致地总结了长安链实际开发应用中的常见问题及其有效的规避方法&#xff0c;相关内容多次解答社区成员…

Python - 初识Python;Python解释器下载安装;Python IDE(一)

一、初识Python Python 是一种高级编程语言&#xff0c;Python是一种面向对象的解释型计算机程序设计语言&#xff0c;Python由荷兰国家数学与计算机科学研究中心的吉多范罗苏姆&#xff08;&#xff09;Guido van Rossum吉多范罗苏姆&#xff08;&#xff09;于1989 年底发明…

Linux入门攻坚——37、Linux防火墙-iptables-3

私网地址访问公网地址的问题&#xff0c;请求时&#xff0c;目标地址是公网地址&#xff0c;可以在公网路由器中进行路由&#xff0c;但是响应报文的目的地址是私网地址&#xff0c;此时在公网路由器上就会出现问题。公网地址访问私网地址的问题&#xff0c;需要先访问一个公网…

C语言的内存函数(文章后附gitee链接,模拟实现函数)

之前我们已经讲解过了字符型数据的一类字符串函数&#xff0c; 现在我们来讨论字符型以外的数据处理。 1&#xff1a;memcpy 的使用和模拟实现 void * memcpy ( void * destination, const void * source, size_t num )&#xff1b; 注意&#xff1a; 1&#xff1a;函数memcp…

Leetcode 整数转罗马数字

这段代码的算法思想是基于罗马数字的减法规则&#xff0c;将整数转换为罗马数字的字符串表示。下面是详细的解释&#xff1a; 算法步骤&#xff1a; 定义数值和符号对应关系&#xff1a;代码中定义了两个数组&#xff1a;values 和 symbols。values 数组包含了罗马数字的数值&…

【赵渝强老师】MySQL InnoDB的段、区和页

MySQL的InnoDB存储引擎的逻辑存储结构和Oracle大致相同&#xff0c;所有数据都被逻辑地存放在一个空间中&#xff0c;我们称之为表空间&#xff08;tablespace&#xff09;。表空间又由段&#xff08;segment&#xff09;、区&#xff08;extent&#xff09;、页&#xff08;pa…

element-ui-plus给头像avatar增加头像框

template部分&#xff1a; <el-avatar shape"square" :size"50" :fit"fit":src"avatarImg"class"avatar-with-border-image"/>style部分&#xff1a; .avatar-with-border-image {position: relative;margin-top: 5px…

MySQL 忘记 root 密码,使用跳过密码验证进行登录

操作系统版本&#xff1a;CentOS 7 MySQL 忘记 root 密码&#xff0c;使用跳过密码验证进行登录 修改 /etc/my.cnf 配置文件&#xff0c;在 [mysqld] 后面任意一行添加 skip-grant-tables vim /etc/my.cnf 重启 MySQL systemctl restart mysqld 登录 MySQL&#xff08;无 -…

飞书 富文本(Markdown)

飞书机器人webhook支持Markdown格式&#xff0c;包括表格 表格 |Syntax | Description |\n|-------- | -------- |\n|Header | Title |\n|Paragraph | Text |参考 富文本&#xff08;Markdown&#xff09;

jmeter常用配置元件介绍总结之用linux服务器压测

系列文章目录 安装jmeter jmeter常用配置元件介绍总结之用linux服务器压测 1.编写测试脚本2.执行测试脚本 1.编写测试脚本 在linux服务器上进行压测&#xff0c;由于是没有界面的&#xff0c;因此我们可以先在界面上把压测脚本写好&#xff1a; 如图&#xff1a;我这里简单的写…

记录日志中logback和log4j2不能共存的问题

本文章记录设置两个日志时候&#xff0c;控制台直接报错 标黄处就是错误原因&#xff1a;1. SLF4J(W)&#xff1a;类路径包含多个SLF4J提供程序。 SLF4J(W)&#xff1a;找到提供程序[org.apache.logging.slf4j. net]。 SLF4J(W)&#xff1a;找到提供程序[ch.qos.log .classi…

丹摩征文活动 |通过Pycharm复现命名实体识别模型--MECT模型

文章目录 &#x1f34b;1 引言&#x1f34b;2 平台优势&#x1f34b;3 丹摩平台服务器配置教程&#x1f34b;4 实操案例&#xff08; MECT4CNER-main&#xff09;&#x1f34b;4.1 MECT4CNER-main模型&#x1f34b;4.2 环境配置&#x1f34b;4.3 训练模型&#x1f34b;4.4 数据…

电脑浏览器打不开网页怎么办 浏览器无法访问网页解决方法

我们在使用电脑的时候&#xff0c;使用浏览器是经常的&#xff0c;很多用户在点开浏览器时&#xff0c;却遇到浏览器无法访问网页的情况。那么电脑浏览器打不开网页是什么原因呢&#xff1f;今天小编就给大家分享几个常见的原因和具体的解决方法&#xff0c;希望能对大家有所帮…

YOLOv11实战宠物狗分类

本文采用YOLOv11作为核心算法框架&#xff0c;结合PyQt5构建用户界面&#xff0c;使用Python3进行开发。YOLOv11以其高效的特征提取能力&#xff0c;在多个图像分类任务中展现出卓越性能。本研究针对5种宠物狗数据集进行训练和优化&#xff0c;该数据集包含丰富的宠物狗图像样本…

Struts源码阅读——三个常用的辅助类DispatchAction

Struts源码阅读——三个常用的辅助类 紧接前文&#xff0c;我们来阅读org.apache.struts.actions包中三个常用类的源码。 DispatchAction、LookupDispatchAction 和 MappingDispatchAction 是 Struts 1 框架中的三个常用的辅助类&#xff0c;用来简化 Action 类中的请求分发。…

Linux设置Nginx开机启动

操作系统环境&#xff1a;CentOS 7 【需要 root 权限&#xff0c;使用 root 用户进行操作】 原理&#xff1a;利用 systemctl 管理服务 设置 Nginx 开机启动 需要 root 权限&#xff0c;普通用户使用 sudo 进行命令操作 原理&#xff1a;利用 systemctl 管理服务 1、新建…

C# WPF 记录DataGrid的表头顺序,下次打开界面时应用到表格中

效果&#xff1a; 代码实现 前端 <DataGrid x:Name"DataGrid1"<!--定义当列位置变化后的触发事件-->CanUserReorderColumns"True"ColumnReordered"DataGrid_ColumnReordered"rubyer:ControlHelper.FocusedForegroundBrush"{Stati…

Transformer-BiLSTM、Transformer、CNN-BiLSTM、BiLSTM、CNN五模型多变量回归预测

Transformer-BiLSTM、Transformer、CNN-BiLSTM、BiLSTM、CNN五模型多变量回归预测 目录 Transformer-BiLSTM、Transformer、CNN-BiLSTM、BiLSTM、CNN五模型多变量回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 吐血售&#xff01;聚划算&#xff01;Transforme…

面试官:如何设计一个能够支持高并发的系统?

强烈推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站:人工智能 设计一个支持高并发的系统是一个系统工程&#xff0c;涉及多个层面的优化。以下逐一展开说明&#xff1a; 1. 分布式架…

企业数字化转型指南:如何通过价值流推动业务创新与变革

在全球企业加速数字化转型的浪潮中&#xff0c;企业领导者和技术人员必须理解数字化转型的核心不只是技术的应用&#xff0c;而是业务流程的彻底重塑。根据《价值流&#xff08;Value Streams&#xff09;》中的理论框架&#xff0c;数字化转型的关键在于价值流&#xff08;Val…