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 ...
随机推荐
- docker 实现原理
实现原理 docker虚拟化 的核心是需要解决两个问题,资源隔离与资源限制 虚拟机是通过硬件虚拟化技术,通过一个 hypervisor 层实现对资源的彻底隔离 容器则是通过操作系统级别的虚拟化技术,利 ...
- pj_0004_time_swap
#!/usr/bin/python # -*- coding: UTF-8 -*- import time def _get_strftime_( t ): return time.strft ...
- 【java数据结构与算法】选择排序
选择排序原理剖析: 假设数组arr使用选择排序 每一轮选出数组最小的元素 arr.lenth个元素,只需要找出arr.length-1个元素的正确位置 选择排序便进行结束 外层for循环控制选择排序的 ...
- 根据两点经纬度计算两点间距离 js
getDistance(lat1, lng1, lat2, lng2) { let radLat1 = lat1 * Math.PI / 180.0; let radLat2 = lat2 * Mat ...
- 全国IP段列表
http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest Linux下执行如下命令可将中国大陆ip格式化并导出 wget -c htt ...
- oracle学习之redo
Oracle的重做日志基本概念及原理 重做日志文件 redo log file 通常也称为日志文件,它是保证数据库安全和数据库备份与恢复的文件,是数据库安全和恢复的最基本的保障.管理员可以根据日志文集 ...
- 玩玩 Visual Studio Code 和 MSYS2
注意:为了便于理解本文内容,您可能需要一些前置知识,例如命令行操作,编译器操作,路径操作,环境变量操作,vscode操作-- 众所周知 Visual Studio Code 是一个优秀的编辑器. 众所 ...
- linux重置密码和单用户模式
CentOS7.9 CentOS7系统root密码丢失找回方法(史上最好) 1. 重新启动或开启CentOS7系统,在选择进入系统Grub菜单界面如下图1-1,根据提示按"e"小写 ...
- https原理(五)双向实践(https代理)
本文为了证明: 1 双向可以通过直接转发tcp的中间人代理网关 2 双向可以防止明文中间人 开始.(服务端need,使用myhost.com-pub-capub.jks,myhost.com-pub- ...
- 清空kafka全部数据
1.停止机器上的kafka,停止业务系统 docker容器执行命令: docker stop 容器名称 2.删除kafka存储目录(server.properties文件log.dirs配置,默认为& ...