ElementuiPlus的table组件实现行拖动与列拖动

借助了插件sortablejs。这种方法只适合做非树状table。如果想实现树状table,并且可拖动。可以试一下aggridVue3这个插件

<template><div class="draggable" style="padding: 20px"><el-table row-key="id" :data="tableData" style="width: 100%"><el-table-column v-for="(item, index) in oldList" :key="`col_${index}`" :prop="newList[index].prop":label="item.label" align="center"></el-table-column></el-table></div>
</template><script setup lang="ts">
import Sortable from 'sortablejs'
import { onMounted, ref } from 'vue'// 只适合做平级的table行和列拖动const oldList = ref()
const newList = ref()// 表头
const tableItems = ref([{label: '姓名',prop: 'name',},{label: '性别',prop: 'gender',},{label: '年龄',prop: 'age',},
])// 表体数据
const tableData = ref([{id: 1,name: '李四',gender: '男',age: 20,},{id: 2,name: '王五',gender: '未知',age: 18,},{id: 3,name: '张三',gender: '男',age: 22,},]
)// 行拖拽
const rowDrop = function () {// 要拖拽元素的父容器 tbodyconst tbody = document.querySelector('.draggable .el-table__body-wrapper tbody')Sortable.create(tbody, {//  可被拖拽的子元素draggable: ".draggable .el-table__row",onEnd({ newIndex, oldIndex }) {// newIndex 拖动到的新的索引// oldIndex 没拖动前的索引const currRow = tableData.value.splice(oldIndex, 1)[0]tableData.value.splice(newIndex, 0, currRow)}});
}// 列拖拽
const columnDrop = function () {// 要拖拽元素的父容器 头部的trconst wrapperTr = document.querySelector('.draggable .el-table__header-wrapper tr');Sortable.create(wrapperTr, {animation: 180,delay: 0,onEnd: (evt: any) => {const oldItem = newList.value[evt.oldIndex];newList.value.splice(evt.oldIndex, 1);newList.value.splice(evt.newIndex, 0, oldItem);}})
}onMounted(() => {oldList.value = JSON.parse(JSON.stringify(tableItems.value))newList.value = JSON.parse(JSON.stringify(tableItems.value))columnDrop()rowDrop()
})
</script>

效果如下

我试了加操作列,通过el-table-column的默认插槽进行实现,但是列拖动的时候,操作列的内容一直在最后一列,并没有跟着移动

代码如下,如果不需要列拖动的话,可以采取这种方式

<template><div class="draggable" style="padding: 20px"><el-table row-key="id" :data="tableData" style="width: 100%"><el-table-column v-for="(item, index) in oldList" :key="`col_${index}`":label="item.label" align="center"><template #default="{ row, column, $index }"><div v-if="column.label !== '操作'">{{ row[newList[index].prop] }}</div><div v-else><el-button size="small">操作</el-button></div></template></el-table-column></el-table></div>
</template><script setup lang="ts">
import Sortable from 'sortablejs'
import { onMounted, ref } from 'vue'// 只适合做平级的table行和列拖动const oldList = ref()
const newList = ref()// 表头
const tableItems = ref([{label: '姓名',prop: 'name',},{label: '性别',prop: 'gender',},{label: '年龄',prop: 'age',},{label: '操作',prop: 'operate',},
])// 表体数据
const tableData = ref([{id: 1,name: '李四',gender: '男',age: 20,},{id: 2,name: '王五',gender: '未知',age: 18,},{id: 3,name: '张三',gender: '男',age: 22,},]
)// 行拖拽
const rowDrop = function () {// 要拖拽元素的父容器 tbodyconst tbody = document.querySelector('.draggable .el-table__body-wrapper tbody')Sortable.create(tbody, {//  可被拖拽的子元素draggable: ".draggable .el-table__row",onEnd({ newIndex, oldIndex }) {// newIndex 拖动到的新的索引// oldIndex 没拖动前的索引const currRow = tableData.value.splice(oldIndex, 1)[0]tableData.value.splice(newIndex, 0, currRow)}});
}// 列拖拽
const columnDrop = function () {// 要拖拽元素的父容器 头部的trconst wrapperTr = document.querySelector('.draggable .el-table__header-wrapper tr');Sortable.create(wrapperTr, {animation: 180,delay: 0,onEnd: (evt: any) => {const oldItem = newList.value[evt.oldIndex];newList.value.splice(evt.oldIndex, 1);newList.value.splice(evt.newIndex, 0, oldItem);}})
}onMounted(() => {oldList.value = JSON.parse(JSON.stringify(tableItems.value))newList.value = JSON.parse(JSON.stringify(tableItems.value))columnDrop()rowDrop()
})
</script>

还有一种解决办法就是,把操作放到弹窗操作,比如双击某一行的时候,弹出弹窗,传入这行的数据,在弹窗里面进行操作,这样就不需要添加操作内一列了。行拖动和列拖动也都能使用

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

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

相关文章

【3D图像分割】基于 Pytorch 的 VNet 3D 图像分割3(3D UNet 模型篇)

在本文中&#xff0c;主要是对3D UNet 进行一个学习和梳理。对于3D UNet 网上的资料和GitHub直接获取的代码很多&#xff0c;不需要自己从0开始。那么本文的目的是啥呢&#xff1f; 本文就是想拆解下其中的结构&#xff0c;看看对于一个3D的UNet&#xff0c;和2D的UNet&#x…

keepalived与nginx与MySQL

keepalived VRRP介绍 集群&#xff08;cluster&#xff09;技术是一种较新的技术&#xff0c;通过集群技术&#xff0c;可以在付出较低成本的情况下获得在性能、可靠性、灵活性方面的相对较高的收益&#xff0c;其任务调度则是集群系统中的核心技术。 集群组成后&#xff0c;可…

IMU漂移相关

个人对IMU的漂移一直以来都很困惑&#xff0c;总结整理了这些材料&#xff0c;希望能理清楚一点思路。 总的来讲&#xff0c;IMU的漂移可建模为三部分&#xff0c;随机常值相关漂移白噪声&#xff0c; 但实际使用时&#xff0c;三者都出现的用法很少。严恭敏老师在博客中有相关…

【软件测试】工作内容

测试工程师工作&#xff1a; 阶段&#xff1a;编写测试计划测试用例、测试缺陷报告并执行测试用例&#xff1b;搭建Windows测试环境熟练&#xff1b;使用Bugzilla 提交软件缺陷报告 使用测试技术及工具&#xff1a;白盒测试黑盒测试 Loadrunner、Winrunner 能够运用边界值、等…

【ArcGIS Pro二次开发】(74):Python、C#实现Excel截图导出图片

以村庄规划制图为例&#xff0c;通过对现状和规划用地的统计&#xff0c;生成Excel格式的【空间功能结构调整表】后&#xff0c;需要进一步将表格导出成图片&#xff0c;并嵌入到图集中&#xff0c;这样可以实现全流程不用手动参与&#xff0c;让制图的流程完全自动化。 关于E…

【Mybatis小白从0到90%精讲】09:Mybatis动态SQL:if、where、set标签

文章目录 前言一、if 标签二、where 标签三、set 标签前言 动态SQL 是 Mybatis的亮点功能之一,如果你经历过 拼接SQL 的繁琐痛苦,那么你就能切身感受到动态SQL到底有多爽!真香哈~ 另外,Mybatis将动态SQL设计的如此自然,让人看看就能理解和接受,我想这也是Mybaits如此深…

CCF-CSP真题《202305-4 电力网络》思路+python,c++满分题解

想查看其他题的真题及题解的同学可以前往查看&#xff1a;CCF-CSP真题附题解大全 试题编号&#xff1a;202305-4试题名称&#xff1a;电力网络时间限制&#xff1a;1.0s内存限制&#xff1a;512.0MB问题描述&#xff1a; 问题描述 西西艾弗岛电力公司需要修建一套电网对岛上的众…

LIME低亮度图像增强

LIME低亮度图像增强 main.cpp #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <iostream> #include <opencv2/imgproc/imgproc.hpp> #include "lime.h"int main() {cv::Mat img_in cv::imread("…

二维空间与三维空间的姿态表示法

二维空间与三维空间的姿态表示法 一、2D空间姿态表示法二、3D空间姿态表示法2.1 三个数表示空间姿态问题 2.2 九个数表示空间姿态问题 2.3 四个数表示空间姿态 结语Reference 假设&#xff0c;你有志成为我空军某航空旅歼-20飞行员&#xff0c;但要想开好飞机&#xff0c;那就得…

简单-【1 绪论】

关键字&#xff1a; 数据类型、数据结构定义、递归关键、线性结构、非线性结构、算法特性、算法目标、时间复杂度排序

【Vue.js】Vue3全局配置Axios并解决跨域请求问题

系列文章目录 文章目录 系列文章目录背景一、部署Axios1. npm 安装 axios2. 创建 request.js&#xff0c;创建axios实例3. 在main.js中全局注册axios4. 在页面中使用axios 二、后端解决跨域请求问题方法一 解决单Contoller跨域访问方法二 全局解决跨域问题 背景 对于前后端分离…

JavaEE-博客系统2(功能设计)

本部分内容&#xff1a;实现博客列表页&#xff1b;web程序问题的分析方法&#xff1b;实现博客详情页&#xff1b; 该部分的代码如下&#xff1a; WebServlet("/blog") public class BlogServlet extends HttpServlet {//Jackson ObjectMapper类(com.fasterxml.jac…