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 ...
随机推荐
- 达芬奇18.1.2安装包下载+软件详细破解安装教程(Win&Mac)
DaVinci Resolve v18.1.2是一款在同一个软件工具中,将剪辑.调色.视觉特效.动态图形和音频后期制作融于一身的解决方案!它采用美观新颖的界面设计,易学易用,能让新手用户快速上手操作, ...
- oracle排查慢sql
查询最慢的SQL select * from (select sa.SQL_TEXT, sa.SQL_FULLTEXT, sa.EXECUTIONS "执行次数", round(s ...
- 日常开发记录-this.$message,this.$prompt,交换弹窗确定和取消按钮的位置,确定在左,取消在右
代码: <template> <el-button type="text" @click="open">点击打开 Message Box ...
- Python语言基础学习报告
这个学期我们开设了一门新课程---Python,早在很久之前,我就经常在各种有关职场的帖子下面看到这个词,且多为夸赞,因此,尽管大一深受C语言和数据结构两门课的折磨,我还是怀着十分的认真和敬意开始了这 ...
- python多线程的问题
参考:https://stackoverflow.com/questions/20939299/does-python-support-multithreading-can-it-speed-up-e ...
- 面试之CAS
1.CAS(Compare And Swap)比较并替换,是线程并发运行时用到的一种技术或者算法,CAS与之对应的是一些锁技术,,例如synconozied,同事这种比较替换的思想也可以运用到数据库上 ...
- unity ScriptObject使用
转自 https://www.jianshu.com/p/77fabc83555b using UnityEngine; [CreateAssetMenu(fileName = "Untit ...
- K8S中pod和container的资源管理:CPU和Memory
K8S中创建pod时,可以显示地指明包含的container的资源需求(resouce request和resource limit),通常是CPU和Memory(RAM). kube-schedul ...
- VS Code 快速下载
最近在官网下载Visual Studio Code时,下载速度特别慢,经过搜索后发现,将下载地址前部分更换为国内地址后,下载速度飞快. 具体步骤如下: VSCodeSetup-x64-1.72.0 官 ...
- padding&margin
margin是盒子的外边距,即盒子与盒子之间的距离,而padding是内边距,是盒子的边与盒子内部元素的距离. 鞋盒里面的鞋到 盒子的距离设置为 padding ,而 鞋盒到鞋架的距离设置为margi ...