Vue + Element UI el-table + sortablejs 行、列拖拽排序

实现Element UI中的el-table表格组件的行和列的拖拽排序

使用 Vue3 + Element Plus UI + sortablejs

安装sortablejs

pnpm install sortablejs

行拖拽

基本实现

效果
在这里插入图片描述

<script setup>
import { onMounted, ref } from "vue";
import Sortable from "sortablejs";const tableData = ref([{id: 1,date: "2016-05-02",name: "王小虎111",age: 21,address: "上海市普陀区金沙江路 1518 弄",},{id: 2,date: "2016-05-04",name: "王小虎222",age: 22,address: "上海市普陀区金沙江路 1517 弄",},{id: 3,date: "2016-05-01",name: "王小虎333",age: 23,address: "上海市普陀区金沙江路 1519 弄",},{id: 4,date: "2016-05-03",name: "王小虎444",age: 24,address: "上海市普陀区金沙江路 1516 弄",},{id: 5,date: "2016-05-08",name: "王小虎555",age: 25,address: "上海市普陀区金沙江路 1518 弄",},
]);onMounted(() => {rowDrop();
});/*** 行拖拽排序*/
function rowDrop() {// 要侦听拖拽响应的DOM对象const tbody = document.querySelector(".el-table__body-wrapper tbody");const data = tableData.value;Sortable.create(tbody, {// handle: ".el-icon-rank",ghostClass: "target-row-class",// 结束拖拽后的回调函数onEnd({ newIndex, oldIndex }) {// 将oldIndex位置的数据删除并取出,oldIndex后面位置的数据会依次前移一位const currentRow = data.splice(oldIndex, 1)[0];// 将被删除元素插入到新位置(currRow表示上面的被删除数据)data.splice(newIndex, 0, currentRow);},});
}
</script><template><el-tableref="table":data="tableData"style="width: 100%"borderrow-key="id"><el-table-column prop="date" label="日期" /><el-table-column prop="name" label="姓名" /><el-table-column prop="age" label="年龄" /><el-table-column prop="address" label="地址" /><!--<el-table-column align="center" width="55">--><!--  <i class="el-icon-rank" />--><!--</el-table-column>--></el-table>
</template><style scoped lang="less">
.el-table {::v-deep {.target-row-class {background: #f0f9eb;}}
}
</style>

禁止某几行拖拽

效果
在这里插入图片描述

<script setup>
import { onMounted, ref } from "vue";
import Sortable from "sortablejs";const tableData = ref([{id: 1,date: "2016-05-02",name: "王小虎111",age: 21,address: "上海市普陀区金沙江路 1518 弄",},{id: 2,date: "2016-05-04",name: "王小虎222",age: 22,address: "上海市普陀区金沙江路 1517 弄",},{id: 3,date: "2016-05-01",name: "王小虎333",age: 23,address: "上海市普陀区金沙江路 1519 弄",},{id: 4,date: "2016-05-03",name: "王小虎444",age: 24,address: "上海市普陀区金沙江路 1516 弄",},{id: 5,date: "2016-05-08",name: "王小虎555",age: 25,address: "上海市普陀区金沙江路 1518 弄",},
]);onMounted(() => {rowDrop();
});/*** 行拖拽排序*/
function rowDrop() {// 要侦听拖拽响应的DOM对象const tbody = document.querySelector(".el-table__body-wrapper tbody");const data = tableData.value;Sortable.create(tbody, {// handle: ".el-icon-rank",ghostClass: "target-row-class",// 匹配的元素将不会触发拖动filter: ".filtered",// 拖拽移动事件,返回false取消移动onMove: function ({ related }) {return related.className.indexOf("filtered") === -1;},// 结束拖拽后的回调函数onEnd({ newIndex, oldIndex }) {// 将oldIndex位置的数据删除并取出,oldIndex后面位置的数据会依次前移一位const currentRow = data.splice(oldIndex, 1)[0];// 将被删除元素插入到新位置(currRow表示上面的被删除数据)data.splice(newIndex, 0, currentRow);},});
}// 设置ID为1和5的行禁止拖拽
function tableRowClassName({ row, rowIndex }) {const freezeList = [1, 5];return freezeList.includes(row.id) ? "filtered" : "";
}
</script><template><el-tableref="table":data="tableData"style="width: 100%"borderrow-key="id":row-class-name="tableRowClassName"><el-table-column prop="date" label="日期" /><el-table-column prop="name" label="姓名" /><el-table-column prop="age" label="年龄" /><el-table-column prop="address" label="地址" /><!--<el-table-column align="center" width="55">--><!--  <i class="el-icon-rank" />--><!--</el-table-column>--></el-table>
</template><style scoped lang="less">
.el-table {::v-deep {.target-row-class {background: #f0f9eb;}// 禁止拖拽行背景色.filtered {background-color: #1db1e7 !important;}}
}
</style>

列拖拽

基本实现

效果
在这里插入图片描述

<script setup>
import { onMounted, ref } from "vue";
import Sortable from "sortablejs";const columns = ref([{ label: "日期", prop: "date" },{ label: "姓名", prop: "name" },{ label: "年龄", prop: "age" },{ label: "地址", prop: "address" },
]);const tableData = ref([{id: 1,date: "2016-05-02",name: "王小虎111",age: 21,address: "上海市普陀区金沙江路 1518 弄",},{id: 2,date: "2016-05-04",name: "王小虎222",age: 22,address: "上海市普陀区金沙江路 1517 弄",},{id: 3,date: "2016-05-01",name: "王小虎333",age: 23,address: "上海市普陀区金沙江路 1519 弄",},{id: 4,date: "2016-05-03",name: "王小虎444",age: 24,address: "上海市普陀区金沙江路 1516 弄",},{id: 5,date: "2016-05-08",name: "王小虎555",age: 25,address: "上海市普陀区金沙江路 1518 弄",},
]);onMounted(() => {columnDrop();
});/*** 列拖拽排序*/
function columnDrop() {// 要侦听拖拽响应的DOM对象const wrapperTr = document.querySelector(".el-table__header-wrapper tr");Sortable.create(wrapperTr, {animation: 180,delay: 0,onEnd({ newIndex, oldIndex }) {const draggedItem = columns.value.splice(oldIndex, 1)[0];columns.value.splice(newIndex, 0, draggedItem);},});
}
</script><template><el-tableref="table":data="tableData"style="width: 100%"borderrow-key="id"><el-table-columnv-for="(column, index) in columns":key="index":prop="column.prop":label="column.label"/></el-table>
</template>

禁止某几行拖拽

效果
在这里插入图片描述

<script setup>
import { onMounted, ref } from "vue";
import Sortable from "sortablejs";const columns = ref([{ label: "日期", prop: "date" },{ label: "姓名", prop: "name", draggable: true },{ label: "年龄", prop: "age", draggable: true },{ label: "地址", prop: "address" },
]);const columnsDrop = ref([{ label: "日期", prop: "date" },{ label: "姓名", prop: "name" },{ label: "年龄", prop: "age" },{ label: "地址", prop: "address" },
]);const tableData = ref([{id: 1,date: "2016-05-02",name: "王小虎111",age: 21,address: "上海市普陀区金沙江路 1518 弄",},{id: 2,date: "2016-05-04",name: "王小虎222",age: 22,address: "上海市普陀区金沙江路 1517 弄",},{id: 3,date: "2016-05-01",name: "王小虎333",age: 23,address: "上海市普陀区金沙江路 1519 弄",},{id: 4,date: "2016-05-03",name: "王小虎444",age: 24,address: "上海市普陀区金沙江路 1516 弄",},{id: 5,date: "2016-05-08",name: "王小虎555",age: 25,address: "上海市普陀区金沙江路 1518 弄",},
]);// 定义变量来记录固定列的class名
const fixedColumnClass = "filtered";onMounted(() => {columnDrop();
});function setHeaderCellClass({ column }) {const columnLabels = columns.value.filter((column) => column.draggable).map((column) => column.label);return !columnLabels.includes(column.label) ? fixedColumnClass : "";
}/*** 列拖拽排序*/
function columnDrop() {// 要侦听拖拽响应的DOM对象const wrapperTr = document.querySelector(".el-table__header-wrapper tr");Sortable.create(wrapperTr, {animation: 180,delay: 0,ghostClass: "target-row-class",filter: `.${fixedColumnClass}`,// filter: (event, item) => {//   // 也可以根据item的类名、id或其他属性来决定是否应该被排除//   return !item.classList.contains("draggable");// },onMove: function ({ related }) {return related.className.indexOf(fixedColumnClass) === -1;},onEnd({ newIndex, oldIndex }) {const draggedItem = columnsDrop.value.splice(oldIndex, 1)[0];columnsDrop.value.splice(newIndex, 0, draggedItem);},});
}
</script><template><el-tableref="table":data="tableData"style="width: 100%"borderrow-key="id":header-cell-class-name="setHeaderCellClass"><el-table-columnv-for="(column, index) in columns":key="column.prop":prop="columnsDrop[index].prop":label="column.label"/></el-table>
</template><style scoped lang="less">
.el-table {::v-deep {.target-row-class {background: #f0f9eb;}.filtered {background-color: #1db1e7 !important;}}
}
</style>

封装Vue指令

未完待续

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

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

相关文章

蓝桥杯每日一练(python)B组

###来源于dotcpp的蓝桥杯真题 题目 2735: 蓝桥杯2022年第十三届决赛真题-取模&#xff08;Python组&#xff09; 给定 n, m &#xff0c;问是否存在两个不同的数 x, y 使得 1 ≤ x < y ≤ m 且 n mod x n mod y 。 输入格式&#xff1a; 输入包含多组独立的询问。 第一…

关于在分布式环境中RVN和使用场景的介绍3

简介 在《关于在分布式环境中RVN和使用场景的介绍2》和《关于在分布式环境中RVN和使用场景的介绍1》中我们介绍了RVN的概念和在一些具体用例中的使用。在本文中我们讨论一下在分布式环境中使用RVN需要注意的问题。 问题 我们在收到一条待处理的事件时&#xff0c;需要检查该…

绝大部分人都不知道如何鉴定Oracle OCP/OCM和MySQL OCP证书的真伪

知道如何鉴定自己的Oracle OCP/OCM和MySQL OCP证书的真伪很重要&#xff0c;因为目前的IT证书基本都是电子的&#xff0c;很少有纸质的证书。如果要验证这些电子证书的真伪&#xff0c;通常可以到发证机构的网站输入证书ID号进行查询。Oracle公司的Oracle和MySQL数据库的OCP/OC…

springboot173疫苗发布和接种预约系统

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

FT2232调试记录(1)

FT2232调试记录 &#xff08;1&#xff09;获取当前连接的FTDI设备通道个数:&#xff08;2&#xff09;获取当前连接的设备通道的信息:&#xff08;3&#xff09;配置SPI的通道:&#xff08;4&#xff09;如何设置GPIO:&#xff08;5&#xff09;DEMO测试&#xff1a; #参考文档…

全坚固平板EM-I12U,全新升级后的优质体验

平板终端机在户外勘探、制造业、畜牧业、银行金融行业当中都不是陌生的&#xff0c;能采集各种数据来转换成信息流向企业和行业的各个分支当中&#xff0c;在整个行业发展、社会推动上面都起着关键性作用&#xff0c;而平板终端机的升级也就意味着未来的这些行业发展会进入一个…

闲来无事,写几个好看的产品宣传界面,希望您喜欢

闲来无事&#xff0c;再写几个产品宣传页 宣传页面一&#xff1a; 源码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0&…

分享88个jQuery特效,总有一款适合您

分享88个jQuery特效&#xff0c;总有一款适合您 88个jQuery特效下载链接&#xff1a;https://pan.baidu.com/s/1NKQfcdNcojvA8xAb0BCaRA?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理…

探索Redis特殊数据结构:Geospatial(地理位置)在实际中的应用

一、概述 Redis官方提供了多种数据类型&#xff0c;除了常见的String、Hash、List、Set、zSet之外&#xff0c;还包括Stream、Geospatial、Bitmaps、Bitfields、Probabilistic&#xff08;HyperLogLog、Bloom filter、Cuckoo filter、t-digest、Top-K、Count-min sketch、Confi…

二、docker compose安装

docker compose安装 docker compose的所有版本&#xff1a;https://github.com/docker/compose/releases # 安装步骤 # 1.下载docker compose&#xff1a;v2.5.0是docker-compose版本 curl -L https://github.com/docker/compose/releases/download/v2.5.0/docker-compose-lin…

BIO、NIO、Netty演化总结

关于BIO&#xff08;关于Java NIO的的思考-CSDN博客&#xff09;和NIO&#xff08;关于Java NIO的的思考-CSDN博客&#xff09;在之前的博客里面已经有详细的讲解&#xff0c;这里再总结一下最近学习netty源码的的心得体会 在之前的NIO博客中我们知道接受客户端连接和IO事件的…

数字图像处理技术

源码在末尾 ————————————————————————— 材料 有需要源码找我

ZigBee学习——BDB

✨本博客参考了善学坊的教程&#xff0c;并总结了在实现过程中遇到的问题。 善学坊官网 文章目录 一、BDB简介二、BDB Commissioning Modes2.1 Network Steering2.2 Network Formation2.3 Finding and Binding&#xff08;F & B&#xff09;2.4 Touchlink 三、BDB Commissi…

[C/C++] -- CMake使用

CMake&#xff08;Cross-platform Make&#xff09;是一个开源的跨平台构建工具&#xff0c;用于自动生成用于不同操作系统和编译器的构建脚本。它可以简化项目的构建过程&#xff0c;使得开发人员能够更方便地管理代码、依赖项和构建设置。 CMake 使用一个名为 CMakeLists.tx…

Ubuntu Desktop - Disks

Ubuntu Desktop - Disks 1. Search your computer -> DisksReferences 1. Search your computer -> Disks ​ References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

探索Nginx:强大的开源Web服务器与反向代理

一、引言 随着互联网的飞速发展&#xff0c;Web服务器在现代技术架构中扮演着至关重要的角色。Nginx&#xff08;发音为“engine x”&#xff09;是一个高性能的HTTP和反向代理服务器&#xff0c;也是一个IMAP/POP3/SMTP代理服务器。Nginx因其卓越的性能、稳定性和灵活性&…

AtCoder Beginner Contest 230 G. GCD Permutation(容斥/莫比乌斯反演 补写法)

题目 给定长为n(n<2e5)的1-n的排列p&#xff0c; 求(i,j)(1<i<j<n)对的数量&#xff0c;满足gcd(i,j)≠1且gcd(pi,pj)≠1 思路来源 官方题解 题解 参考莫比乌斯函数mu&#xff0c;定义一个新函数&#xff0c; 新函数需要满足n1的时候对因子求和为0&#xff0…

Stable Diffusion 模型下载:DreamShaper XL(梦想塑造者 XL)

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十 下载地址 模型介绍 DreamShaper 是一个分格多样的大模型&#xff0c;可以生成写实、原画、2.5D 等…

假期作业 9

1.用指针实现strlen、strcpy、strcat、strcmp 代码&#xff1a; #include <stdio.h> #include <string.h> int mystrlen(char *str); int mystrcmp(char *str1,char *str2); char *mystrcat(char *str1,char *str2); char *mystrcpy(char *str1,char *str2); int…