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组件时,常常面对这样的业务需求: 表格数据的每一项都要提供勾选框,当切换分页时,能够记忆所有页面勾选的数据,以实现批量提交不同页面勾选数据的功能.并且, ...
随机推荐
- Ruby. Vs . Python
前言:从语言的本质上来分析,我对Ruby持反对态度,毕竟语言是为了交流,在表达的效率层面为了正确性必须适当放弃复杂性.且有句老话说的好,Ruby In Rails 才是语言,而Ruby只是这个语言的工 ...
- 【Vue+Node】解决axois请求数据跨域问题
项目基于Vue前端+Node后台,启动两个服务,请求数据时,端口不一致造成跨域报错: (No 'Access-Control-Allow-Origin' header is present on th ...
- B站真的是一个神奇的地方,初次用Python爬取弹幕。
"网上冲浪""886""GG""沙发"--如果你用过这些,那你可能是7080后: "杯具"" ...
- 洛谷P2038 无线网络发射器选址 水题 枚举
刚开始边界写错了(将128写成127). 注意n <= 20,所以可以每读入一个点就将其周边更新,这样最多也只会有 40 * 40 * 20 种位置需要被枚举. Code: #include&l ...
- 可横向滑动的vue tab组件
示例 前端使用技术:框架->vue 组件>ly-tab一个用于移动端的可触摸滑动具有回弹效果的可复用Vue组件 ly-tab 介绍地址 ly-tab npm地址 使用步骤 1,引入包,定义 ...
- js中浏览器兼容startsWith 、endsWith 函数
在做js开发的时候用到了startsWith函数时,发现各个浏览器不兼容问题,因为对开发来说,chrome浏览器最好用,就一直在chrome浏览器中使用这两个函数没有任何问题,但在ie浏览器访问就直接 ...
- 训练1-S
给出N个正整数,检测每个数是否为质数.如果是,输出"Yes",否则输出"No". Input 第1行:一个数N,表示正整数的数量.(1 <= N < ...
- 小松之LINUX驱动学习笔记之模块间函数调用通讯
1. 符号导出函数 EXPORT_SYMBOL() EXPORT_SYMBOL标签内定义的函数对全部内核代码公开,不用修改内核代码就可以在您的内核模块中直接调用. EXPORT_SYMBOL_GPL( ...
- soapui测试接口使用步骤
1.新建项目 2. 定义接口 url输入接口 3.新建测试集 选择项目,右键 4.在测试集下新建测试用例 5.在测试步骤中导入要测试的请求 6.run
- 深入MNIST code测试
本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/50624471 依照教程:深入MNIST ...