当前位置: 首页 > news >正文

vue3+ele-plus+sortableJs对el-table使用sortableJs插件对表格拖拽时限定某列或某行不允许拖拽

如需有对el-table表格进行拖拽的需求,请点击:
eleplus对el-table表格进行拖拽(使用sortablejs进行列拖拽和行拖拽):-CSDN博客
 如果你已实现拖拽需求,但拖拽后发现表头并未改变的话,请点击:

解决el-table表格拖拽后,只改变了数据,表头没变的问题-CSDN博客

先看看是不是你想要的。

限制拖拽

Sortable.js中文网

sortableJs有个配置项是filter,过滤掉不可进行拖拽的列或行。

本文采用vue3+ele-plus的table组件结合sortableJs插件对表格拖拽需求进行开发:

列拖拽:

使用:header-cell-class-name="headerCellClassName"对el-table的列增加headerClassFilter类名,有此类名的行不可进行拖拽(在Sortable.create实例中对headerClassFilter类名进行过滤,即filter绑定的类名)。

<template><div><el-table:data="tableData"borderscrollbar-always-onref="tableHeader"row-key="id":header-cell-class-name="headerCellClassName"><template v-for="item in setColumns" :key="item.label"><!-- 操作列 --><el-table-columnv-if="item.prop === 'oprate'"fixed="right":prop="item.prop":label="item.label"><template #header><div class="search-title"><div :class="checked ? 'search-titleName' : ''">操作</div><el-icon class="search-icon" @click="search"><Search color="#409EFF" /></el-icon></div></template></el-table-column><!-- 序号列 --><el-table-columnv-else-if="item.prop === 'index'":type="item.type":label="item.label":width="item.width || 100"/><!-- 数据列 --><el-table-columnv-else:prop="item.prop":label="item.label":width="item.width || 100"/></template></el-table></div>
</template><script setup lang='js'>import { ref, onMounted } from 'vue'import Sortable from 'sortablejs';let setColumns = ref([{prop: 'index',label: '序号',type: 'index'},{prop: 'name',label: '姓名'},{prop: 'address',label: '地址'},{prop: '11',label: '1'},{prop: '22',label: '2'},{prop: '33',label: '3'},{prop: '44',label: '4'},{prop: '55',label: '5'},{prop: '66',label: '6'},{prop: 'oprate',lable: ''}
])let tableData = ref([{name: 'Tom1',address: '上海',11: 11,22: 21,33: 31,44: 41,55: 51,66: 61,id: 1},{name: 'Tom2',address: '北京',11: 12,22: 22,33: 32,44: 42,55: 52,66: 62,id: 2},{name: 'Tom3',address: '广州',11: 13,22: 23,33: 33,44: 43,55: 53,66: 63,id: 3},{name: 'Tom4',address: '深圳',11: 14,22: 24,33: 34,44: 44,55: 54,66: 64,id: 4}
])let sortable;const tableHeader = ref(null);onMounted(() => {columnDrag(); // 初始化列拖拽事件})const headerCellClassName = ({column}) => { // 给序号和操作列增加类名,意在这两列不可进行拖拽if (column.label === '序号' || column.property === 'oprate') {return 'headerClassFilter'}}const columnDrag = () => {let el = tableHeader.value.$el.querySelector('.el-table__header-wrapper tr')Sortable.create(el, {animation: 180,delay: 0,filter: '.headerClassFilter', // 类名为headerClassFilter的列不可进行拖拽onMove({ related }) { // 移动单元格时,如果related.className包含headerClassFilter,即不可拖拽return related.className.indexOf('headerClassFilter') === -1;},onEnd(evt) {const oldItem = setColumns.value[evt.oldIndex]setColumns.value.splice(evt.oldIndex, 1);setColumns.value.splice(evt.newIndex, 0, oldItem);}})}</script><style scoped>.search-title{display: flex;/* justify-content: space-around; */}.search-titleName{color: #409EFF;}.search-icon{cursor: pointer;margin-top: 5px;margin-left: 10px;}:deep(.headerClassFilter){background-color: red !important;cursor: not-allowed;}:deep(.el-table .rowClassFilter){background-color: #ffeebc !important;cursor: not-allowed;}
</style>

行拖拽:

使用:row-class-name="rowClassName"对el-table的行增加rowClassFilter类名,有此类名的行不可进行拖拽(在Sortable.create实例中对rowClassFilter类名进行过滤,即filter绑定的类名)。

<template><div><el-table:data="tableData"borderscrollbar-always-onref="tableHeader"row-key="id":row-class-name="rowClassName"><template v-for="item in setColumns" :key="item.label"><!-- 操作列 --><el-table-columnv-if="item.prop === 'oprate'"fixed="right":prop="item.prop":label="item.label"><template #header><div class="search-title"><div :class="checked ? 'search-titleName' : ''">操作</div><el-icon class="search-icon" @click="search"><Search color="#409EFF" /></el-icon></div></template></el-table-column><!-- 序号列 --><el-table-columnv-else-if="item.prop === 'index'":type="item.type":label="item.label":width="item.width || 100"/><!-- 数据列 --><el-table-columnv-else:prop="item.prop":label="item.label":width="item.width || 100"/></template></el-table></div>
</template><script setup lang='js'>import { ref, watch, onMounted } from 'vue'import Sortable from 'sortablejs';let setColumns = ref([{prop: 'index',label: '序号',type: 'index'},{prop: 'name',label: '姓名'},{prop: 'address',label: '地址'},{prop: '11',label: '1'},{prop: '22',label: '2'},{prop: '33',label: '3'},{prop: '44',label: '4'},{prop: '55',label: '5'},{prop: '66',label: '6'},{prop: 'oprate',lable: ''}
])let tableData = ref([{name: 'Tom1',address: '上海',11: 11,22: 21,33: 31,44: 41,55: 51,66: 61,id: 1},{name: 'Tom2',address: '北京',11: 12,22: 22,33: 32,44: 42,55: 52,66: 62,id: 2},{name: 'Tom3',address: '广州',11: 13,22: 23,33: 33,44: 43,55: 53,66: 63,id: 3},{name: 'Tom4',address: '深圳',11: 14,22: 24,33: 34,44: 44,55: 54,66: 64,id: 4}
])let sortable;const tableHeader = ref(null);onMounted(() => {rowDrag() // 初始化行拖拽事件})const rowClassName = (data) => {if (data.rowIndex === 0 || data.rowIndex === tableData.value.length - 1) {return 'rowClassFilter'}}const rowDrag = () => {let el = tableHeader.value.$el.querySelector('.el-table__body-wrapper tbody')Sortable.create(el, {animation: 180,delay: 0,filter: '.rowClassFilter', // 类名为rowClassFilter的行不可进行拖拽onMove({related}) {return related.className.indexOf('rowClassFilter') === -1;},onEnd(evt) {const oldItem = tableData.value[evt.oldIndex]tableData.value.splice(evt.oldIndex, 1);tableData.value.splice(evt.newIndex, 0, oldItem);}})}
</script><style scoped>.search-title{display: flex;/* justify-content: space-around; */}.search-titleName{color: #409EFF;}.search-icon{cursor: pointer;margin-top: 5px;margin-left: 10px;}:deep(.headerClassFilter){background-color: red !important;cursor: not-allowed;}:deep(.el-table .rowClassFilter){background-color: #ffeebc !important;cursor: not-allowed;}
</style>

相关文章:

  • 八股操作系统和计算机网络
  • van-list 遇到的问题
  • JavaScript 深拷贝和浅拷贝的实现、使用场景和存在的问题
  • 国产MCU芯片(2):东软MCU概览
  • 股指期货功能
  • Noisee AI – AI音乐影片MV在线生成工具,专门为Suno的好搭子来了~
  • 力扣 SQL题目
  • Memcached:内存缓存的强大引擎及其深度解析
  • java.nio.charset.UnmappableCharacterException
  • 16、架构-可观测性-事件日志详细解析
  • javaWeb项目-springboot+vue人事管理系统功能介绍
  • Content type ‘application/x-www-form-urlencoded;charset=UTF-8‘ not supported
  • 3D ToF赋能小米CyberDog 2提升视觉灵敏度
  • 华为OD刷题C卷 - 每日刷题 23(提取字符串中的最长表达式,模拟目录管理功能 - 完整实现)
  • 解决Qt的multimedia库在clion中依赖库补全的问题
  • ES6指北【2】—— 箭头函数
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • 《深入 React 技术栈》
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • 【391天】每日项目总结系列128(2018.03.03)
  • avalon2.2的VM生成过程
  • CentOS7 安装JDK
  • CSS 三角实现
  • Docker: 容器互访的三种方式
  • fetch 从初识到应用
  • Go 语言编译器的 //go: 详解
  • Joomla 2.x, 3.x useful code cheatsheet
  • js ES6 求数组的交集,并集,还有差集
  • Python十分钟制作属于你自己的个性logo
  • SSH 免密登录
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 讲清楚之javascript作用域
  • 前端相关框架总和
  • 探索 JS 中的模块化
  • 微信开源mars源码分析1—上层samples分析
  • 我的zsh配置, 2019最新方案
  • 一天一个设计模式之JS实现——适配器模式
  • 移动端 h5开发相关内容总结(三)
  • 优化 Vue 项目编译文件大小
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • ![CDATA[ ]] 是什么东东
  • #知识分享#笔记#学习方法
  • $(selector).each()和$.each()的区别
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (LeetCode C++)盛最多水的容器
  • (多级缓存)缓存同步
  • (未解决)macOS matplotlib 中文是方框
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • (轉貼) 資訊相關科系畢業的學生,未來會是什麼樣子?(Misc)
  • ***详解账号泄露:全球约1亿用户已泄露
  • .net CHARTING图表控件下载地址