table表格的拖拽排序
- 安装sortableJs插件
npm install sortablejs
- 在需要使用的页面进行引入
import Sortable from ‘sortablejs’ //引入插件
行拖拽
<template>
<el-table :data="tableData"
border
row-key="id"
align="left">
<el-table-column
prop="date"
label="日期">
</el-table-column>
<el-table-column
prop="name"
label="姓名">
</el-table-column>
<el-table-column
prop="address"
label="地址">
</el-table-column>
</el-table>
</template>
<script>
import Sortable from 'sortablejs'//引入插件
export default {
data() {
return {
tableData: [//表格数据
{
id: '1',
date: '2016-05-02',
name: '王小虎1',
address: '上海市普陀区金沙江路 100 弄'
},
{
id: '2',
date: '2016-05-04',
name: '王小虎2',
address: '上海市普陀区金沙江路 200 弄'
},
{
id: '3',
date: '2016-05-01',
name: '王小虎3',
address: '上海市普陀区金沙江路 300 弄'
},
{
id: '4',
date: '2016-05-03',
name: '王小虎4',
address: '上海市普陀区金沙江路 400 弄'
}
]
}
},
mounted() {
// 阻止默认行为
document.body.ondrop = function (event) {
event.preventDefault();
event.stopPropagation();
};
this.rowDrop()//行拖拽
},
methods: {
//行拖拽
rowDrop() {
const tbody = document.querySelector('.el-table__body-wrapper tbody')
const _this = this
Sortable.create(tbody, {
// 只能通过拖拽icon进行排序
handle: '.drag-icon', // 此处是icon图标的class名
onEnd({ newIndex, oldIndex }) {
if (newIndex == oldIndex) return
_this.tableData.splice(
newIndex,
0,
_this.tableData.splice(oldIndex, 1)[0]
)
var newArray = _this.tableData.slice(0)
_this.tableData = []
_this.$nextTick(function () {
_this.tableData = newArray
})
}
})
},
}
}
</script>
行列同时拖拽
<template>
<div style="width:800px">
<el-table :data="tableData" border>
<el-table-column v-for="(item, index) in col"
:key="`col_${index}`"
:prop="dropCol[index].prop"
:label="item.label">
</el-table-column>
</el-table>
</div>
</template>
<script>
import Sortable from 'sortablejs'//引入插件
export default {
data() {
return {
col: [
{
label: '日期',
prop: 'date'
},
{
label: '姓名',
prop: 'name'
},
{
label: '地址',
prop: 'address'
}
],
dropCol: [
{
label: '日期',
prop: 'date'
},
{
label: '姓名',
prop: 'name'
},
{
label: '地址',
prop: 'address'
}
],
tableData: [
{
id: '1',
date: '2016-05-02',
name: '王小虎1',
address: '上海市普陀区金沙江路 100 弄'
},
{
id: '2',
date: '2016-05-04',
name: '王小虎2',
address: '上海市普陀区金沙江路 200 弄'
},
{
id: '3',
date: '2016-05-01',
name: '王小虎3',
address: '上海市普陀区金沙江路 300 弄'
},
{
id: '4',
date: '2016-05-03',
name: '王小虎4',
address: '上海市普陀区金沙江路 400 弄'
}
]
}
},
mounted() {
// 阻止默认行为
document.body.ondrop = function (event) {
event.preventDefault();
event.stopPropagation();
};
this.rowDrop()//行拖拽
this.columnDrop()//列拖拽
},
methods: {
//行拖拽
rowDrop() {
const tbody = document.querySelector('.el-table__body-wrapper tbody')
const _this = this
Sortable.create(tbody, {
onEnd({ newIndex, oldIndex }) {
if (newIndex == oldIndex) return
_this.tableData.splice(
newIndex,
0,
_this.tableData.splice(oldIndex, 1)[0]
)
var newArray = _this.tableData.slice(0)
_this.tableData = []
_this.$nextTick(function () {
_this.tableData = newArray
})
}
})
},
//列拖拽
columnDrop() {
const wrapperTr = document.querySelector('.el-table__header-wrapper tr')
this.sortable = Sortable.create(wrapperTr, {
animation: 180,
delay: 0,
onEnd: evt => {
const oldItem = this.dropCol[evt.oldIndex]
this.dropCol.splice(evt.oldIndex, 1)
this.dropCol.splice(evt.newIndex, 0, oldItem)
}
})
}
}
}
</script>
列表的拖拽排序
<template>
<div>
<ul id="items">
<li v-for="item in listData" :key="item.id">
{{item.name}}
</li>
</ul>
</div>
</template>
<script>
import Sortable from 'sortablejs'//引入插件
export default {
data() {
return {
listData:[
{
id:1,
name:'数据一'
},
{
id:2,
name:'数据二'
},
{
id:3,
name:'数据三'
},
{
id:4,
name:'数据四'
}
]
}
},
mounted() {
// 阻止默认行为
document.body.ondrop = function (event) {
event.preventDefault();
event.stopPropagation();
};
this.rowDrop()//行拖拽
},
methods: {
//行拖拽
rowDrop() {
const tbody = document.getElementById('items')
const that = this
Sortable.create(tbody, {
// 只能通过拖拽icon进行排序
handle: '.drag-icon', // 此处是icon图标的class名
onEnd: function (evt) {
// 获取排序之后的data数据
that.listData.splice(evt.newIndex, 0, that.listData.splice(evt.oldIndex, 1)[0])
var newArray = that.listData.slice(0)
that.listData = []
that.$nextTick(function () {
that.listData = newArray
})
}
})
},
}
}
</script>