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

封装成公用组件操作

//父组件
<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实现表格行和列的拖拽的更多相关文章

  1. VUE+Element UI实现简单的表格行内编辑效果

    原理是通过Css控制绑定的输入控件与显示值,在选中行样式下对控件进行隐藏或显示 <!DOCTYPE html> <html> <head> <meta cha ...

  2. vue + element ui 实现实现动态渲染表格

    前言:之前需要做一个页面,能够通过表名动态渲染出不同的表格,这里记录一下.转载请注明出处:https://www.cnblogs.com/yuxiaole/p/9786326.html 网站地址:我的 ...

  3. vue + element ui 表格自定义表头,提供线上demo

    前言:工作中用到 vue+element ui 的前端框架,需要使用自定义表头,需要使用 re.转载请注明出处:https://www.cnblogs.com/yuxiaole/p/9710826.h ...

  4. vue+element ui 的表格列使用组件

    前言:工作中用到 vue+element ui 的前端框架,有这个场景:很多表格的列有许多一样的,所以考虑将列封装为组件.转载请注明出处:https://www.cnblogs.com/yuxiaol ...

  5. 基于 vue+element ui 的cdn网站(多页面,都是各种demo)

    前言:这个网站持续更新中...,有网上预览,github上也有源码,喜欢记得star哦,欢迎留言讨论. 网站地址:我的个人vue+element ui demo网站 github地址:yuleGH g ...

  6. 分享一个自搭的框架,使用Spring boot+Vue+Element UI

    废弃,新的:https://www.cnblogs.com/hackyo/p/10453243.html 特点:前后端分离,可遵循restful 框架:后端使用Spring boot,整合了aop.a ...

  7. vue+element ui 的tab 动态增减,切换时提示用户是否切换

    前言:工作中用到 vue+element ui 的前端框架,动态添加 Tab,删除 Tab,切换 Tab 时提示用户是否切换等,发现 element ui  有一个 bug,这里记录一下如何实现.转载 ...

  8. vue + element ui 阻止表单输入框回车刷新页面

    问题 在 vue+element ui 中只有一个输入框(el-input)的情况下,回车会提交表单. 解决方案 在 el-form 上加上 @submit.native.prevent 这个则会阻止 ...

  9. vue+element ui 的时间控件选择 年月日时分

    前言:工作中用到 vue+element ui 的前端框架,需要选择年月日时分,但element ui官网demo有没有,所以记录一下.转载请注明出处:https://www.cnblogs.com/ ...

  10. Vue+Element UI 实现视频上传

    一.前言 项目中需要提供一个视频介绍,使用户能够快速.方便的了解如何使用产品以及注意事项. 前台使用Vue+Element UI中的el-upload组件实现视频上传及进度条展示,后台提供视频上传AP ...

随机推荐

  1. ES-分页查询

    从一个分页问题开始 做分页查询,当分页达到一定量的时候,报如下错误 Result window is too large, from + size must be less than or equal ...

  2. OnMicro BLE应用方案|蓝牙语音遥控器-OM6621E

    随着物联网技术不断发展,家用电器往智能化方向持续迭代,使用红外遥控器这种传统的互动方式已经满足不了实际的使用需求,蓝牙语音遥控器作为人机交互新载体,逐渐取代传统红外遥控器成为家居设备的标配. 相比于传 ...

  3. Redis实战(二)Redis 的 RDB 配置和数据恢复

    RDB 配置解释 在 redis.conf 文件中,默认有 RDB 持久化配置: save 900 1 save 300 10 save 60 10000复制复制失败复制成功 解释: 这些配置称为检查 ...

  4. 关于 dangerouslySetInnerHTML

    之前不太了解react,第一次看dangerouslySetInnerHTML,以为可以用来防止xss注入. 后面看待又补充了一个DOMPurify,才知道这个东西只有一个提醒的作用,并不能防止xss ...

  5. gson属性disableHtmlEscaping对等于号的转义\u003d,注解符号Expose,SerializedName,Since和Until

    gson属性disableHtmlEscaping对等于号的转义\u003d,注解符号Expose,SerializedName,Since和Until package com.example.cor ...

  6. python学习:窗口程序

    https://www.cnblogs.com/zyg123/p/10385456.html # 导入tkinter模块 import tkinter # 创建画布需要的库 from matplotl ...

  7. leetcode -- 旋转矩阵相关问题

    给定一个 n × n 的二维矩阵表示一个图像. 将图像顺时针旋转 90 度. 说明: 你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵.请不要使用另一个矩阵来旋转图像. 示例 1: 给定 m ...

  8. centos 6.5 docker  安装

    https://www.cnblogs.com/zhangzhen894095789/p/6641981.html?utm_source=itdadao&utm_medium=referral

  9. nginx转发端口路由器再转发

    场景 nginx 转发端口 路由器二次转发了,端口不一样 (shiro 或者其他一些权限控制架构会自动跳转,导致的端口不对.) proxy_set_header Host $host:$proxy_p ...

  10. 关于邮箱怎么验证是不是真实的企业邮箱(java汉字和英文呼唤)

    企业邮箱的域名一般都是zhangsan@公司域名,或者zhang_san@公司域名这种形式.这里我只列举zhangsan@公司域名这种形式. 公司要我做一个企业邮箱的模糊匹配和验证,刚接到以为很难.结 ...