一、效果展示:
二、完整代码:
<template>
<el-table :data="tableData" style="width: 100%" :row-class-name="activeClass" class="outputTable">
<el-table-column prop="sort" label="Sort" width="180" />
<el-table-column prop="date" label="Date" width="180" />
<el-table-column prop="name" label="Name" width="180" />
<el-table-column prop="address" label="Address" />
</el-table>
</template>
<script lang="ts" setup>
import { nextTick, ref } from 'vue';
const tableData = ref<any>([
{
sort:'1',
date: "2016-05-03",
name: "Tom1",
address: "No. 189, Grove St, Los Angeles",
},
{
sort:'2',
date: "2016-05-02",
name: "Tom2",
address: "No. 189, Grove St, Los Angeles",
},
{
sort:'3',
date: "2016-05-04",
name: "Tom3",
address: "No. 189, Grove St, Los Angeles",
},
{
sort:'4',
date: "2016-05-01",
name: "Tom4",
address: "No. 189, Grove St, Los Angeles",
},
])
const dragIndex = ref<any>();
const newDragIndex = ref<any>();
const activeClass = ({ row, rowIndex }) => {
if (rowIndex === newDragIndex.value) {
return "isDragBox active-drag";
}
return "isDragBox";
};
const dragStartItem = (idx) => {
dragIndex.value = idx;
};
const dragOverItem = (index) => {
newDragIndex.value = index;
};
const dragEndItem = () => {
const data = tableData.value[dragIndex.value];
tableData.value.splice(dragIndex.value, 1);
tableData.value.splice(newDragIndex.value, 0, data);
tableData.value.forEach((item, index) => {
return (item.sort = index);
});
};
const handleSort = () => {
nextTick(() => {
const dragBox = document.querySelectorAll(".outputTable .isDragBox");
dragBox.forEach((i: any, idx) => {
i.setAttribute("draggable", "true");
i.ondragstart = () => dragStartItem(idx);
i.ondragover = () => dragOverItem(idx);
i.ondragend = () => dragEndItem();
});
});
};
handleSort()
</script>