Vue实战(六):实现树形表格的行拖拽
1、依赖安装
npm install sortablejs --save
2、功能实现
第一,编写树形表格
<template>
<el-table :data="tableData" border default-expand-all @expand-change="expandChange">
<el-table-column type="expand">
<template slot-scope="scope">
<el-table :data="scope.row.children" v-if="scope.row.children != undefined" border
style="margin-top:-12px;margin-bottom:-12px;" class="expandTable">
<el-table-column width="45"></el-table-column>
<el-table-column prop="date" label="日期" align="center" width="120"></el-table-column>
<el-table-column prop="name" label="姓名" align="center" width="120"></el-table-column>
<el-table-column prop="address" label="地址" align="center" width="250"></el-table-column>
</el-table>
</template>
</el-table-column>
<el-table-column prop="date" label="日期" align="center" width="120"></el-table-column>
<el-table-column prop="name" label="姓名" align="center" width="120"></el-table-column>
<el-table-column prop="address" label="地址" align="center" width="250"></el-table-column>
</el-table>
</template>
第二,在script里面引入Sortable
import Sortable from 'sortablejs'
第三,初始化表格数据
arr: [
{date: '2016-05-01',name: '王小虎',address: '上海市普陀区金沙江路 1511 弄',children: [
{date: '2016-05-03',name: '王小虎',address: '上海市普陀区金沙江路 1513 弄'},
{date: '2016-05-04',name: '王小虎',address: '上海市普陀区金沙江路 1514 弄'}
]},
{date: '2016-05-02',name: '王小虎',address: '上海市普陀区金沙江路 1512 弄',children: [
{date: '2016-05-05',name: '王小虎',address: '上海市普陀区金沙江路 1515 弄'},
{date: '2016-05-06',name: '王小虎',address: '上海市普陀区金沙江路 1516 弄'}
]}
]
第四,方法实现
mounted() {
this.$nextTick(() => {
this.tbodyList = document.querySelectorAll('.expandTable .el-table__body-wrapper tbody');
this.dropTable(this.tbodyList);
})
}
//获取表格数据
getTableData() {
this.tableData = this.arr;
this.tempTableData = this.arr;
}
// 表格展开重新渲染
expandChange() {
this.$nextTick(() => {
this.tbodyList = document.querySelectorAll('.expandTable .el-table__body-wrapper tbody');
this.dropTable(this.tbodyList)
})
}
//行拖拽
dropTable(tbodyList) {
let _this = this;
let tbody = tbodyList;
for (let i = 0; i < tbody.length; i++) {
Sortable.create(tbody[i], {
onEnd({ newIndex, oldIndex }) {
if (newIndex == oldIndex) return;
_this.tableData[i]['children'].splice(newIndex, 0, _this.tableData[i]['children'].splice(oldIndex, 1)[0]);
var newArray = _this.tableData[i]['children'].slice(0);
_this.tableData[i]['children'] = [];
_this.$nextTick(function () {
_this.tableData[i]['children'] = newArray;
_this.dropTableSendRequest(i);
});
},
})
}
}
// 将数据传到后台
dropTableSendRequest(i) {
let temparr = this.tempTableData.find((item, index) => {
if (index == i) {
return item
}
});
console.log(temparr);
this.getTableData();
}
3、效果图
拖拽后:
4、完整代码
<template>
<el-table :data="tableData" border default-expand-all @expand-change="expandChange">
<el-table-column type="expand">
<template slot-scope="scope">
<el-table :data="scope.row.children" v-if="scope.row.children != undefined" border
style="margin-top:-12px;margin-bottom:-12px;" class="expandTable">
<el-table-column width="45"></el-table-column>
<el-table-column prop="date" label="日期" align="center" width="120"></el-table-column>
<el-table-column prop="name" label="姓名" align="center" width="120"></el-table-column>
<el-table-column prop="address" label="地址" align="center" width="250"></el-table-column>
</el-table>
</template>
</el-table-column>
<el-table-column prop="date" label="日期" align="center" width="120"></el-table-column>
<el-table-column prop="name" label="姓名" align="center" width="120"></el-table-column>
<el-table-column prop="address" label="地址" align="center" width="250"></el-table-column>
</el-table>
</template>
<script>
import Sortable from 'sortablejs';
export default {
name: "demo02",
data() {
return {
arr: [{
date: '2016-05-01',
name: '王小虎',
address: '上海市普陀区金沙江路 1511 弄',
children: [
{
date: '2016-05-03',
name: '王小虎',
address: '上海市普陀区金沙江路 1513 弄'
},
{
date: '2016-05-04',
name: '王小虎',
address: '上海市普陀区金沙江路 1514 弄'
}
]
}, {
date: '2016-05-02',
name: '王小虎',
address: '上海市普陀区金沙江路 1512 弄',
children: [
{
date: '2016-05-05',
name: '王小虎',
address: '上海市普陀区金沙江路 1515 弄'
},
{
date: '2016-05-06',
name: '王小虎',
address: '上海市普陀区金沙江路 1516 弄'
}
]
}],
tableData: [],
tempTableData: [],
tbodyList: null
}
},
created() {
this.getTableData();
},
mounted() {
this.$nextTick(() => {
this.tbodyList = document.querySelectorAll('.expandTable .el-table__body-wrapper tbody');
this.dropTable(this.tbodyList);
})
},
methods: {
//获取表格数据
getTableData() {
this.tableData = this.arr;
this.tempTableData = this.arr;
},
// 表格展开重新渲染
expandChange() {
this.$nextTick(() => {
this.tbodyList = document.querySelectorAll('.expandTable .el-table__body-wrapper tbody');
this.dropTable(this.tbodyList)
})
},
//行拖拽
dropTable(tbodyList) {
let _this = this;
let tbody = tbodyList;
for (let i = 0; i < tbody.length; i++) {
Sortable.create(tbody[i], {
onEnd({ newIndex, oldIndex }) {
if (newIndex == oldIndex) return;
_this.tableData[i]['children'].splice(newIndex, 0, _this.tableData[i]['children'].splice(oldIndex, 1)[0]);
var newArray = _this.tableData[i]['children'].slice(0);
_this.tableData[i]['children'] = [];
_this.$nextTick(function () {
_this.tableData[i]['children'] = newArray;
_this.dropTableSendRequest(i);
});
},
})
}
},
// 将数据传到后台
dropTableSendRequest(i) {
let temparr = this.tempTableData.find((item, index) => {
if (index == i) {
return item
}
})
console.log(temparr);
this.getTableData();
}
}
}
</script>