vue+element-ui+sortable.js实现表格行和列的拖拽
项目碰到一个需求是需要表格字段列进行顺序拖拽,查过一些资料,中途也碰到了很多坑,实现方式如下:

封装成公用组件操作
//父组件
<template>
<div>
<commonTable
:loading="loading"
:table-data="priceList"
:table-header-tit="tableHeaderTit"
:col-table-header-tit="colTableHeaderTit"
@columnChange="columnChange"
/>
</div>
</template>
<script>
import commonTable from '@/layout/components/common/commonTable.vue';
export default {
name: 'Table',
components: {
commonTable
},
data() {
tableHeaderTit: [],
colTableHeaderTit:[],
priceList:[],
loading:false,
},
async mounted() {
await this.initHandle();
},
methods:{
initHandle(){
//初始化调用获取默认用户表头数据接口(这边先用默认数据)
this.tableHeaderTit=[
{ key: 1, label: '价单编号', field: 'priceCode'},
{ key: 2, label: '价单名称', field: 'priceName' },
{ key: 3, label: '币种', field: 'currency' },
{ key: 4, label: '业务类型', field: 'businessTypeName'},
{ key: 5, label: '审批状态', field: 'auditStatusName'},
{ key: 6, label: '启用日期', field: 'startDate' },
{ key: 7, label: '截止日期', field: 'endDate'}
];
this.colTableHeaderTit=[
{ key: 1, label: '价单编号', field: 'priceCode'},
{ key: 2, label: '价单名称', field: 'priceName' },
{ key: 3, label: '币种', field: 'currency' },
{ key: 4, label: '业务类型', field: 'businessTypeName'},
{ key: 5, label: '审批状态', field: 'auditStatusName'},
{ key: 6, label: '启用日期', field: 'startDate' },
{ key: 7, label: '截止日期', field: 'endDate'}
]
},
columnChange(val) {
// 列拖拽操作(改变一次排序远程存储一次用户数据)
//调保存用户接口
}
}
}
</script>
//子组件 commonTable.vue
<template>
<div class="commonTable">
<el-table
ref="table"
v-loading="loading"
style="width: 100%"
class="table-wrap"
:data="tableData"
height="100%"
row-key="item"
stripe
border
header-cell-class-name="header-cell-color"
@selection-change="handleSelectionChange"
>
<el-table-column
type="selection"
width="55"
/>
<el-table-column v-for="(item, index) in colTableHeaderTit"
class-name="allowDrag"
:key="`colTableHeaderTit_${index}`"
:prop="tableHeaderTit[index].field"
:label="item.label" align="center">
</el-table-column>
</el-table>
</div>
</template>
<script>
import Sortable from 'sortablejs'
//需要下载sortablejs插件
//官方文档地址:https://github.com/SortableJS/Sortable
export default {
name:'commonTable',
props:['tableData','tableHeaderTit','colTableHeaderTit','loading'],
data() {
return {
}
},
mounted() {
this.rowDrop() //可拖拽行
this.columnDrop() //可拖拽列
},
methods: {
//行拖拽
rowDrop() {
const tbody = document.querySelector('.el-table__body-wrapper tbody')
const _this = this
Sortable.create(tbody, {
onEnd({ newIndex, oldIndex }) {
const currRow = _this.tableData.splice(oldIndex, 1)[0]
_this.tableData.splice(newIndex, 0, currRow)
}
})
},
//列拖拽
columnDrop() {
var _this = this;
const wrapperTr = document.querySelector('.el-table__header-wrapper tr')
this.sortable = Sortable.create(wrapperTr, {
draggable: ".allowDrag",//允许拖拽元素(el-table-column上设置class-name为允许拖拽)
animation: 180,
delay: 0,
//之前调用onEnd方法会出现表格DOM不更新以及表头对不上的情况所以更换为onUpdate方法
//参考资料 https://www.jianshu.com/p/fd6eb408d8bd
onUpdate:function(evt){
//修改items数据顺序
var newIndex = evt.newIndex;
var oldIndex = evt.oldIndex;
const newItem = wrapperTr.children[newIndex];
const oldItem = wrapperTr.children[oldIndex]; // 先删除移动的节点
wrapperTr.removeChild(newItem)
// 再插入移动的节点到原有节点,还原了移动的操作
if(newIndex > oldIndex) {
wrapperTr.insertBefore(newItem,oldItem)
} else {
wrapperTr.insertBefore(newItem,oldItem.nextSibling)
}
// 更新items数组(index-1是第一列有一个多选列不支持拖拽,否则会有排序错乱的问题)
var item = _this.tableHeaderTit.splice(oldIndex-1,1);
_this.tableHeaderTit.splice(newIndex-1,0,item[0]);
// 下一个tick就会走patch更新 //每次更新调取保存用户接口
_this.$emit('columnChange',_this.tableHeaderTit)
} })
}
}
}
</script>
参考:https://www.jianshu.com/p/362f880d0bfd
-----END
vue+element-ui+sortable.js实现表格行和列的拖拽的更多相关文章
- VUE+Element UI实现简单的表格行内编辑效果
原理是通过Css控制绑定的输入控件与显示值,在选中行样式下对控件进行隐藏或显示 <!DOCTYPE html> <html> <head> <meta cha ...
- vue + element ui 实现实现动态渲染表格
前言:之前需要做一个页面,能够通过表名动态渲染出不同的表格,这里记录一下.转载请注明出处:https://www.cnblogs.com/yuxiaole/p/9786326.html 网站地址:我的 ...
- vue + element ui 表格自定义表头,提供线上demo
前言:工作中用到 vue+element ui 的前端框架,需要使用自定义表头,需要使用 re.转载请注明出处:https://www.cnblogs.com/yuxiaole/p/9710826.h ...
- vue+element ui 的表格列使用组件
前言:工作中用到 vue+element ui 的前端框架,有这个场景:很多表格的列有许多一样的,所以考虑将列封装为组件.转载请注明出处:https://www.cnblogs.com/yuxiaol ...
- 基于 vue+element ui 的cdn网站(多页面,都是各种demo)
前言:这个网站持续更新中...,有网上预览,github上也有源码,喜欢记得star哦,欢迎留言讨论. 网站地址:我的个人vue+element ui demo网站 github地址:yuleGH g ...
- 分享一个自搭的框架,使用Spring boot+Vue+Element UI
废弃,新的:https://www.cnblogs.com/hackyo/p/10453243.html 特点:前后端分离,可遵循restful 框架:后端使用Spring boot,整合了aop.a ...
- vue+element ui 的tab 动态增减,切换时提示用户是否切换
前言:工作中用到 vue+element ui 的前端框架,动态添加 Tab,删除 Tab,切换 Tab 时提示用户是否切换等,发现 element ui 有一个 bug,这里记录一下如何实现.转载 ...
- vue + element ui 阻止表单输入框回车刷新页面
问题 在 vue+element ui 中只有一个输入框(el-input)的情况下,回车会提交表单. 解决方案 在 el-form 上加上 @submit.native.prevent 这个则会阻止 ...
- vue+element ui 的时间控件选择 年月日时分
前言:工作中用到 vue+element ui 的前端框架,需要选择年月日时分,但element ui官网demo有没有,所以记录一下.转载请注明出处:https://www.cnblogs.com/ ...
- Vue+Element UI 实现视频上传
一.前言 项目中需要提供一个视频介绍,使用户能够快速.方便的了解如何使用产品以及注意事项. 前台使用Vue+Element UI中的el-upload组件实现视频上传及进度条展示,后台提供视频上传AP ...
随机推荐
- iptables( < deb ufw)
iptables其实不是真正的防火墙,可以把它理解成一个客户端代理,用户通过iptables这个代理,将用户的安全设定执行到对应的netfilter安全框架"中,netfilter位于内核空 ...
- VS2019使用gtest
VS2019使用gtest GoogleTest测试框架介绍(一)_liitdar的博客-CSDN博客_goole test 术语 test/test case/test suit Meaning G ...
- 查找大文件-清理linux磁盘
https://www.cnblogs.com/kerrycode/p/4391859.html find . -type f -size +800M -print0 | xargs -0 du - ...
- docker0 flannel.1不在同一网段
现象: docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.17.0.1 netmask 255.2 ...
- 蓝桥杯训练赛二-问题 A
题目描述 用简单素数筛选法求N以内的素数. 输入 N 输出 2-N的素数 样例输入 100 样例输出 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 ...
- httprunner运行遇到彻底解决安装包过程中的Requirement already satisfied:问题
deMacBook-Pro:bndcs yuansanmei$ python3 -m pip install httprunner==v4.3.0Requirement already satisfi ...
- mongodb对Obeject对象进行增删改操作
1.插入某个对象,如User对象 mongoTemplate.insert(user, "users");//第一个参数是实体类对象User, 第二个参数是mongodb对应的集合 ...
- pgsql 数据库密码登录配置
一.postgreSQL认证文件 pg_hba.conf 配置文件pg_hba.conf的位置,通常情况下的路径是 /etc/postgresql/[VERSION]/main/pg_hba.conf ...
- video.js 苹果手机设置了currentTime却还是从头播放?
最近在项目(方案大赛)中需要保存学习进度,用户再打开页面时会从上次的视频进度继续观看.我们使用了video.js,在PC浏览器和安卓手机上均可以跳转,但是苹果手机很顽固的从头开始了呢-- 后来我们在 ...
- WPF 后台实现按数字键滚动DataGrid 当前选中项
最近遇到个项目,设备上没有鼠标,界面为全屏的一个DataGrid,需要实现按小键盘的0和1让DataGrid的当前选中行进行上下滚动 起到重要参考的是: https://blog.csdn.net ...