element-ui 实现table整列的拖动
1. 先动态渲染表头,给每一个表头添加一个class=virtual 的画虚线的类名,同时给每个表头加上鼠标点击、拖动、抬起事件:mousedown->mousemove->mouseup.
2. 点击时确定点击的哪个,拖动的时候确定拖动的方向,抬起的时候确定放在的位置。
3. 改变数据实现拖动完成效果。
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0,maximum-scale=1.0, user-scalable=no" />
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>自定义表头样式和整列的拖动</title>
<link rel="stylesheet" href="https://unpkg.com/element-ui@2.3.7/lib/theme-chalk/index.css">
<script src="https://cdn.bootcss.com/vue/2.5.2/vue.min.js"></script>
<script src="https://unpkg.com/element-ui@2.3.7/lib/index.js"></script>
<style>
*{
padding:;
margin:;
}
body {
padding:50px;
overflow-x: hidden;
}
.thead-cell{
position: relative;
}
.drag_table th {
cursor: move;
}
.virtual {
position: fixed;
display: block;
margin-top: -35px;
margin-left: -11px;
}
.drag_active_left .virtual {
border-left: 1px dotted #;
z-index: ;
}
.drag_active_right .virtual {
border-right: 1px dotted #;
z-index: ;
}
/*
给选中要拖动的列添加背景色,如果在完整项目内部的组件,所以这个组件的style,不能加scoped,否则添加不上样式
如果使用了sass或者less,可以加scoped 然后在用特殊手法处理样式
*/
.dragging_column {
background-color: #f3f3f3 !important;
} </style>
</head> <body>
<div id="app">
<p style="text-align:center;font-size:20px;margin-bottom:50px;">自定义表头样式和整列的拖动</p>
<div @mouseleave="moveTableOutside">
<el-table class="drag_table" :data="tableData" border stripe :cell-class-name="cellClassName" :header-cell-class-name="headerCellClassName">
<el-table-column v-for="(col, index) in tableHeader" :key="index" :prop="col.prop" :label="col.label" :column-key="index.toString()" :render-header="renderHeader">
</el-table-column>
</el-table>
</div>
</div>
</body>
<script>
var Main = {
data() {
return {
tableData: [{
name: '王小虎',
date: '2016-05-02',
address: '上海市普陀区金沙江路 1518 弄'
}, {
name: '王老五',
date: '2016-05-04',
address: '上海市普陀区金沙江路 1517 弄'
}, {
name: '王大锤',
date: '2016-05-01',
address: '上海市普陀区金沙江路 1519 弄'
}, {
name: '王小龙',
date: '2016-05-03',
address: '上海市普陀区金沙江路 1516 弄'
}],
tableHeader: [{
prop: 'name',
label: '姓名'
}, {
prop: 'date',
label: '时间'
}, {
prop: 'address',
label: '地址'
}],
dragState: {
startIndex: -, // 拖动起始元素的index
endIndex: -, // 拖动结束元素的index
afterMoveIndex: -, // 拖动后元素的index
dragging: false, // 是否正在拖动
direction: null, // 拖动方向
moveTableOutsideBack: false // 拖出到table外之后又拖回来
}
}
},
methods: {
// drag_table在渲染表头时调用
renderHeader(h, {
column,
$index
}) {
// 这里可以根据$index的值来对自身需求进行修改,
return h('span', {
'class': ['thead-cell'],
style: {
'display': 'block',
'width': '100%',
'cursor': 'move',
},
on: {
mousedown: ($event) => {
this.handleMouseDown($event, column)
},
mouseup: ($event) => {
this.handleMouseUp($event, column)
},
mousemove: ($event) => {
this.handleMouseMove($event, column)
}
}
}, [
h('span', [
// 给每个表头添加icon 可以不需要
h('span', {
class: $index === ? 'el-icon-star-off' : $index === ? 'el-icon-time' : $index === ? 'el-icon-location' : '',
}),
h('span', column.label)
]),
// 给每个表头添加一个class=virtual 是画虚线的类名。
h('span', {
'class': ['virtual']
})
])
},
// 按下鼠标开始拖动 设置列的背景色
handleMouseDown(e, column) {
// 判断是鼠标左键
if (e.button === ) {
this.dragState.dragging = true
this.dragState.startIndex = parseInt(column.columnKey)
console.log(`开始移动的位置 ${this.dragState.startIndex}`)
// 给当前要拖动列的th设置class
document.querySelectorAll('.drag_table table thead tr th')[this.dragState.startIndex].className += ' ' + 'dragging_column';
// 给拖动时的虚拟容器添加宽高
let table = document.getElementsByClassName('drag_table')[]
let virtual = document.getElementsByClassName('virtual')
// 设置新插入的span.virtual的标签 每一列的宽度、高度
for (let item of virtual) {
item.style.height = table.clientHeight - + 'px'
item.style.width = item.parentElement.parentElement.clientWidth + 'px'
}
this.dragState.moveTableOutsideBack = false
}
},
// 拖动中
handleMouseMove(e, column) {
// 判断是鼠标左键
if (e.button === ) {
if (this.dragState.dragging) {
let currentIndex = parseInt(column.columnKey) // 拖动的当前列index
console.log(`移动到了${currentIndex}`)
if (currentIndex !== this.dragState.startIndex) {
this.dragState.direction = currentIndex - this.dragState.startIndex < ? 'left' : 'right' // 判断拖动方向
this.dragState.afterMoveIndex = currentIndex
} else {
this.dragState.direction = null
}
} else {
return false
}
}
},
// 鼠标放开结束拖动
handleMouseUp(e, column) {
// 判断是鼠标左键
if (e.button === ) {
// 拖出当前table外之后又拖回来,不再进行易位操作(拖出去时已处理)
if (this.dragState.moveTableOutsideBack) {
return false
} else {
this.dragState.endIndex = parseInt(column.columnKey) // 记录结束列index
console.log(`结束移动的位置 ${this.dragState.endIndex}`)
if (this.dragState.startIndex !== this.dragState.endIndex) {
this.dragColumn(this.dragState)
}
this.finishDragInit()
}
}
},
// 拖动到当前table之外的处理
moveTableOutside() {
if (this.dragState.dragging) {
this.dragState.endIndex = this.dragState.startIndex
console.log(`已移动到table外,结束移动的位置 ${this.dragState.endIndex}`)
if (this.dragState.startIndex !== this.dragState.endIndex) {
this.dragColumn(this.dragState)
}
this.finishDragInit()
this.dragState.moveTableOutsideBack = true
}
},
// 拖动易位
dragColumn({
startIndex,
endIndex,
direction
}) {
console.log(`从${startIndex}移动到了${endIndex}`)
// 排除掉鼠标点击table外面,然后拖入进table报错
if (startIndex < ) {
return;
}
// 判断是向左移动还是向右移动
// 把移动的列插在某个列前面或者后面,然后在删除移动的列
if (direction === 'left') {
this.tableHeader.splice(endIndex, , this.tableHeader[startIndex])
this.tableHeader.splice(startIndex + , )
} else {
this.tableHeader.splice(endIndex + , , this.tableHeader[startIndex])
this.tableHeader.splice(startIndex, )
}
},
// 拖动完成后的初始化
finishDragInit() {
// 给当前要拖动列的th取消class
for (var item of document.querySelectorAll('.drag_table table thead tr th')) {
item.className = String(item.className).split("dragging_column").join("");
}
// 再次初始化拖动状态
this.dragState = {
startIndex: -,
endIndex: -,
afterMoveIndex: -,
dragging: false,
direction: null,
moveTableOutsideBack: false
}
},
// 动态给表头单元格添加 class,实现拖动中的虚线效果
/*
这个监听在table渲染的时候会执行一遍。
然后还会有两个条件会触发执行:
1. 绑定的数据发生变化的时候(即为表格内容变化就触发)。header变化触发header-cell-class-name,表格数据变化触发cell-class-name.
2. return返回值 如果绑定了data,如果此data变化也会触发执行。相当于对这个data进行了监听随之触发这个方法。
*/
headerCellClassName({
column,
columnIndex
}) {
console.log()
return columnIndex === this.dragState.afterMoveIndex ? `drag_active_${this.dragState.direction}` : ''
},
// 动态给表头单元格th添加class,实现拖动中的背景
cellClassName({
column,
columnIndex
}) {
console.log()
return (columnIndex === this.dragState.startIndex ? `dragging_column` : '')
},
},
mounted() {
var that = this;
setTimeout(function() {
// that.tableHeader[0].label = 'wwwwww';
// that.tableData[0].name = 'wwwwww';
// console.log()
// console.log(document.querySelectorAll('.drag_table .el-table_2_column_4')[0])
// document.querySelectorAll('.drag_table table thead tr th')[0].className += ' ' + 'dragging_column';
// that.dragState.startIndex = '1'
}, )
}
}
var Ctor = Vue.extend(Main)
new Ctor().$mount('#app')
</script> </html>
element-ui 实现table整列的拖动的更多相关文章
- 怎么样使element ui 的table某列变色
第一步.在el-table里面加上:row-style="rowClass" <el-table :data="targetCarList" border ...
- (Element UI 组件 Table)去除单元格底部的横线
Element UI 组件 Table 有一个属性 border,添加它可以增加纵向边框,但是无法控制横线边框,因此即使是最简单的 el-table,也会包含一个底部横线. 这个底部横线其实是一个 b ...
- Element UI的Table用法
Table 表格 用于展示多条结构类似的数据,可对数据进行排序.筛选.对比或其他自定义操作. ¶基础表格 基 2016-05-02 王小虎 上海市普陀区金沙江路 1518 弄 2016-05-04 王 ...
- Element Ui中table实现表格编辑效果
主要以css实现 .tb-edit .el-input, .tb-edit .el-input-number, .tb-edit .el-select { display: none; width: ...
- element ui 合计/table show-summary
在el-table 上面加上show-summary就可以对table的数据进行合计 但是上次出现了合计栏有的为空,有的合计不对的情况,如果出现的是空,那么说明你渲染的数据有undefine(即后台返 ...
- element ui里面table分页,页数从0开始的怎么做?
需求: 后台请求的接口是从0页开始的,但是pagination是从1开始的,就是在点击pagination的第1页是后台转0 1首先在data里面定义为1,其他地方也是定义1 return { for ...
- element ui的table的头部自定义
<el-table-column label="级别" min-width="120" prop="clueLevel" align= ...
- 普通element ui table组件的使用
1.使用基础的element ui 的table的基础使用 首先,使用前要先引用element库到项目中,可以直接引入element的js和css或者在vue项目下按需加载不同的组件 废话不多说,直接 ...
- Element UI表格组件技巧:如何简洁实现跨页勾选、跨页统计功能
业务场景 在使用Element UI的Table组件时,常常面对这样的业务需求: 表格数据的每一项都要提供勾选框,当切换分页时,能够记忆所有页面勾选的数据,以实现批量提交不同页面勾选数据的功能.并且, ...
随机推荐
- 在线word论文生成的方法
下午实验室师妹问我latex转word生成的格式不行咋办.于是找了一下网上,发现了一个可以自动生成word论文的网站 https://typeset.io/formats/bmc/default-te ...
- [原创]C++带空格字符串的输入问题
字符串一直是一个重点加难点,很多笔试面试都会涉及,带空格的字符串更是十分常见,现在对字符串的输入问题进行一下总结. C++用cin输入的时候会忽略空格以后的字符,比如 char a[100]; cin ...
- ERROR 1062 (23000): Duplicate entry for key 'PRIMARY'
ALTER TABLE table1 ADD COLUMN column1 VARCHAR(400) DEFAULT NULL; ERROR 1062 (23000): Duplicate entry ...
- Junit使用第二弹
实例总结 1. 参数化测试 有时一个测试方法,不同的参数值会产生不同的结果,那么我们为了测试全面,会把多个参数值都写出来并一一断言测试,这样有时难免费时费力,这是我们便可以采用参数化测试来解决这个问题 ...
- Day 13迭代器生成器
迭代器 1.迭代器就是迭代的工具,迭代也可以说成是重复,并且每一次重复都是基于上一次的结果而来的,在python中一切皆对象. 2.可迭代对象:只要拥有__iter__方法的对象都是可迭代对象. 3. ...
- ASP 读取Word文档内容简单示例_组件开发_新兴网络_20161014161610.jpg
- [网络流24题] 最长k可重线段集问题 (费用流)
洛谷传送门 LOJ传送门 最长k可重区间集问题的加强版 大体思路都一样的,不再赘述,但有一些细节需要注意 首先,坐标有负数,而且需要开$longlong$算距离 但下面才是重点: 我们把问题放到了二维 ...
- JAVA 上传图片功能
前后端实现上传图片功能(JAVA代码) 1.前端大概 请求头必须为AJAX请求头: 'X-Requested-With': 'XMLHttpRequest' 一般是指网页中存在的Content-Typ ...
- Jquery 根据HTML内容选择元素
选择所有包含 "is" 的 元素: $("p:contains(is)")
- Problem 4
Problem 4 # Problem_4 """ A palindromic number reads the same both ways. The largest ...